当前位置:首页 » 编程语言 » python邮件客户端

python邮件客户端

发布时间: 2023-09-14 09:29:52

A. python是什么、 怎么读

Python是什么?
Python是着名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。
现在,全世界差不多有600多种编程语言,但流行的编程语言也就那么20来种。如果你听说过TIOBE排行榜,你就能知道编程语言的大致流行程度。
Python的功能:
总的来说,这几种编程语言各有千秋。C语言是可以用来编写操作系统的贴近硬件的语言,所以,C语言适合开发那些追求运行速度、充分发挥硬件性能的程序。而Python是用来编写应用程序的高级编程语言。
当你用一种语言开始作真正的软件开发时,你除了编写代码外,还需要很多基本的已经写好的现成的东西,来帮助你加快开发进度。比如说,要编写一个电子邮件客户端,如果先从最底层开始编写网络协议相关的代码,那估计一年半载也开发不出来。高级编程语言通常都会提供一个比较完善的基础代码库,让你能直接调用,比如,针对电子邮件协议的SMTP库,针对桌面环境的GUI库,在这些已有的代码库的基础上开发,一个电子邮件客户端几天就能开发出来。
Python就为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作“内置电池(Batteries included)”。用Python开发,许多功能不必从零编写,直接使用现成的即可。
除了内置的库外,Python还有大量的第三方库,也就是别人开发的,供你直接使用的东西。当然,如果你开发的代码通过很好的封装,也可以作为第三方库给别人使用。
许多大型网站就是用Python开发的,例如YouTube、Instagram,还有国内的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美国航空航天局)都大量地使用Python。
龟叔给Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。
总的来说,Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码。如果一个资深程序员向你炫耀他写的晦涩难懂、动不动就几万行的代码,你可以尽情地嘲笑他。
Python适合开发哪些类型的应用呢?
首选是网络应用,包括网站、后台服务等等;
其次是许多日常需要的小工具,包括系统管理员需要的脚本任务等等;
另外就是把其他语言开发的程序再包装起来,方便使用。
Python是什么及其Python有哪些功能,我想现在大家应该都很了解了吧,如果你觉得这门语言适合你,就赶紧学起来吧!

B. python 邮箱登录的问题

这可能是一种安全机制。由于采用SMTP时,原则上不再需要用户手工输入密码,因为设置SMTP发送方式的原因就是方便使用客户端或自动化程序来发送邮件,因此,仅在首次创建连接时,需要由用户人工输入密码,而这是有可能输入错误的。一旦输入正确,原则上,客户端或你自己所写的代码即会保存这个密码,在以后建立连接时,这一密码就不会“输入”错误了。如果输入错误,只能认定为攻击行为。侍戚毕所以,你必须确保密码的正确性。

如果你非要考虑输错密码的情形,使其能在输错密码断开连接后,自动重新建立新的连接,则可以在输入密码仔早部老芹分使用try来捕获SMTPServerDisconnected异常。当异常被触发时,建立新的连接即可。

C. 如何用 python 搭建一个邮件服务器

有人说表示只学Python没有用,必须学会一个框架(比如Django和web.py)才能找到工作。
其实掌握一个类似于框架的高级工具是有用的,但是基础的东西可以让你永远不被淘汰,不要被工具限制了自己的发展。
今天不使用框架,也不使用Python标准库中的高级包,只使用标准库中的socket接口写一个Python服务器。
框架与底层
在当今Python服务器框架 (framework, 比如Django, Twisted, web.py等等) 横行的时代,从底层的socket开始写服务器似乎是一个出力不讨好的笨方法。

框架的意义在于掩盖底层的细节,提供一套对于开发人员更加友好的API,并处理诸如MVC的布局问题。
框架允许我们快速的构建一个成型而且成熟的Python服务器。然而,框架本身也是依赖于底层(比如socket)。对于底层socket的了解,不仅可以帮助我们更好的使用框架,更可以让我们明白框架是如何设计的。
更进一步,如果拥有良好的底层socket编程知识和其他系统编程知识,你完全可以设计并开发一款自己的框架。
如果你可以从底层socket开始,实现一个完整的Python服务器,支持用户层的协议,并处理好诸如MVC(Model-View-Control)、多线程(threading)等问题,并整理出一套清晰的函数或者类,作为接口(API)呈现给用户,你就相当于设计了一个框架。
socket接口是实际上是操作系统提供的系统调用。
socket的使用并不局限于Python语言,你可以用C或者java来写出同样的socket服务器,而所有语言使用socket的方式都类似(Apache就是使用C实现的服务器)。
但是你不能跨语言的使用框架。
框架的好处在于帮你处理了一些细节,从而实现快速开发,但同时受到Python本身性能的限制。
我们已经看到,许多成功的网站都是利用动态语言(比如Python, Ruby或者php,比如twitter和facebook)快速开发,在网站成功之后,将代码转换成诸如C和JAVA这样一些效率比较高的语言,从而让服务器能更有效率的面对每天亿万次的请求。
在这种情况下,底层的重要性,就远远超过了框架。
TCP/IP和socket简介
回到我们的任务。
我们需要对网络传输,特别是TCP/IP协议和socket有一定的了解。
socket是进程间通信的一种方法,它是基于网络传输协议的上层接口。
socket有许多种类型,比如基于TCP协议或者UDP协议(两种网络传输协议),其中又以TCP socket最为常用。
TCP socket与双向管道(plex PIPE)有些类似,一个进程向socket的一端写入或读取文本流,而另一个进程可以从socket的另一端读取或写入,比较特别是,这两个建立socket通信的进程可以分别属于两台不同的计算机。
TCP协议,就是规定了一些通信的守则,以便在网络环境下能够有效实现上述进程间通信过程。
双向管道(plex PIPE)存活于同一台电脑中,所以不必区分两个进程的所在计算机的地址,而socket必须包含有地址信息,以便实现网络通信。
一个socket包含四个地址信息: 两台计算机的IP地址和两个进程所使用的端口(port)。IP地址用于定位计算机,而port用于定位进程 (一台计算机上可以有多个进程分别使用不同的端口)。
TCP socket
在互联网上,让某台计算机作为服务器。
服务器开放自己的端口,被动等待其他计算机连接。
当其他计算机作为客户,主动使用socket连接到服务器的时候,服务器就开始为客户提供服务。
在Python中,我们使用标准库中的socket包来进行底层的socket编程。
首先是服务器端,我们使用bind()方法来赋予socket以固定的地址和端口,并使用listen()方法来被动的监听该端口。
当有客户尝试用connect()方法连接的时候,服务器使用accept()接受连接,从而建立一个连接的socket:

socket.socket()创建一个socket对象,并说明socket使用的是IPv4(AF_INET,IP version 4)和TCP协议(SOCK_STREAM)。
然后用另一台电脑作为客户,我们主动使用connect()方法来搜索服务器端的IP地址(在Linux中,你可以用$ifconfig来查询自己的IP地址)和端口,以便客户可以找到服务器,并建立连接:

在上面的例子中,我们对socket的两端都可以调用recv()方法来接收信息,调用sendall()方法来发送信息。
这样,我们就可以在分处于两台计算机的两个进程间进行通信了。
当通信结束的时候,我们使用close()方法来关闭socket连接。
(如果没有两台计算机做实验,也可以将客户端IP想要connect的IP改为"127.0.0.1",这是个特殊的IP地址,用来连接当地主机。)
基于TCP socket的HTTP服务器
上面的例子中,我们已经可以使用TCP socket来为两台远程计算机建立连接。
然而,socket传输自由度太高,从而带来很多安全和兼容的问题。
我们往往利用一些应用层的协议(比如HTTP协议)来规定socket使用规则,以及所传输信息的格式。
HTTP协议利用请求-回应(request-response)的方式来使用TCP socket。
客户端向服务器发一段文本作为request,服务器端在接收到request之后,向客户端发送一段文本作为response。
在完成了这样一次request-response交易之后,TCP socket被废弃。
下次的request将建立新的socket。
request和response本质上说是两个文本,只是HTTP协议对这两个文本都有一定的格式要求。
Request <——> Response
现在,我们写出一个HTTP服务器端:

HTTP服务器程序的解释
如我们上面所看到的,服务器会根据request向客户传输的两条信息text_content和pic_content中的一条,作为response文本。
整个response分为起始行(start line), 头信息(head)和主体(body)三部分。起始行就是第一行:
它实际上又由空格分为三个片段,HTTP/1.x表示所使用的HTTP版本,200表示状态(status code),200是HTTP协议规定的,表示服务器正常接收并处理请求,OK是供人来阅读的status code。
头信息跟随起始行,它和主体之间有一个空行。
这里的text_content或者pic_content都只有一行的头信息,text_content用来表示主体信息的类型为html文本:
而pic_content的头信息(Content-Type: image/jpg)说明主体的类型为jpg图片(image/jpg)。
主体信息为html或者jpg文件的内容。
(注意,对于jpg文件,我们使用"rb"模式打开,是为了与windows兼容。因为在windows下,jpg被认为是二进制(binary)文件,在UNIX系统下,则不需要区分文本文件和二进制文件。)
我们并没有写客户端程序,后面我们会用浏览器作为客户端。
request由客户端程序发给服务器。
尽管request也可以像response那样分为三部分,request的格式与response的格式并不相同。
request由客户发送给服务器,比如下面是一个request:
起始行可以分为三部分,第一部分为请求方法(request method),第二部分是URL,第三部分为HTTP版本。
request method可以有GET, PUT, POST, DELETE, HEAD。最常用的为GET和POST。
GET是请求服务器发送资源给客户,POST是请求服务器接收客户送来的数据。
当我们打开一个网页时,我们通常是使用GET方法;当我们填写表格并提交时,我们通常使用POST方法。
第二部分为URL,它通常指向一个资源(服务器上的资源或者其它地方的资源)。像现在这样,就是指向当前服务器的当前目录的test.jpg。
按照HTTP协议的规定,服务器需要根据请求执行一定的操作。
正如我们在服务器程序中看到的,我们的Python程序先检查了request的方法,随后根据URL的不同,来生成不同的response(text_content或者pic_content)。
随后,这个response被发送回给客户端。
使用浏览器实验
为了配合上面的服务器程序,我已经在放置Python程序的文件夹里,保存了一个test.jpg图片文件。
我们在终端运行上面的Python程序,作为服务器端,再打开一个浏览器作为客户端。
(如果有时间,你也完全可以用Python写一个客户端。原理与上面的TCP socket的客户端程序相类似。)
在浏览器的地址栏输入:
(当然,你也可以用令一台电脑,并输入服务器的IP地址)
OK,我已经有了一个用Python实现的,并从socket写起的服务器了。
从终端,我们可以看到,浏览器实际上发出了两个请求。
第一个请求为 (关键信息在起始行,这一个请求的主体为空):

我们的Python程序根据这个请求,发送给服务器text_content的内容。
浏览器接收到text_content之后,发现正文的html文本中有<IMG src="text.jpg" />,知道需要获得text.jpg文件来补充为图片,立即发出了第二个请求:

我们的Python程序分析过起始行之后,发现/test.jpg符合if条件,所以将pic_content发送给客户。
最后,浏览器根据html语言的语法,将html文本和图画以适当的方式显示出来。
探索的方向
1) 在我们上面的服务器程序中,我们用while循环来让服务器一直工作下去。
实际上,我们还可以根据多线程的知识,将while循环中的内容改为多进程或者多线程工作。
2) 我们的服务器程序还不完善,我们还可以让我们的Python程序调用Python的其他功能,以实现更复杂的功能。比如说制作一个时间服务器,让服务器向客户返回日期和时间。你还可以使用Python自带的数据库,来实现一个完整的LAMP服务器。

3) socket包是比较底层的包。Python标准库中还有高层的包,比如SocketServer,SimpleHTTPServer,CGIHTTPServer,cgi。这些都包都是在帮助我们更容易的使用socket。如果你已经了解了socket,那么这些包就很容易明白了。利用这些高层的包,你可以写一个相当成熟的服务器。

4) 在经历了所有的辛苦和麻烦之后,你可能发现,框架是那么的方便,所以决定去使用框架。或者,你已经有了参与到框架开发的热情。

D. 一些着名的软件都用什么语言编写

一、操作系统:

Microsoft Windows : 汇编 -> C -> C++

备注:曾经在智能手机的操作系统(Windows Mobile)考虑掺点C#写的程序,比如软键盘,结果因为写出来的程序太慢,实在无法和别的模块合并,最终又回到C++重写。

相信很多朋友都知道Windows Vista,这个系统开发早期比尔盖茨想全部用C#写,但是最终因为执行慢而放弃,结果之前无数软件工程师日夜劳作成果一夜之间被宣告作废。

Linux :C

Apple MacOS : 主要为C,部分为C++。 备注: 之前用的语言比较杂,最早是汇编和Pascal。

Sun Solaris : C

HP-UX : C

Symbian OS : 汇编,主要为C++。 (诺基亚手机)

Google Android :2008 年推出: C语言(有传言说是用Java开发的操作系统,但最近刚推出原生的C语言SDK)

RIM BlackBerry OS 4.x : 黑莓 C++



二、图形界面层

Microsoft Windows UI : C++

Apple MacOS UI (Aqua) : C++

Gnome (Linux图形界面之一,大脚): C和C++, 主要是C。

KDE (Linux图形界面) ,C++。



三、桌面搜索工具

Google Desktop Search : C++

Microsoft Windows Desktop Search : C++

Beagle (Linux/Windows/UNIX 下): C# (基于开源的 .net : Mono)



四、办公软件

Microsoft Office : 在 汇编 -> C -> 稳定在C++

Sun Open Office : 部分JAVA(对外接口),主要为C++ (开源,可下载其源代码)

Corel Office/WordPerfect Office : 1996年尝试过Java,次年被抛弃,重新回到C/C++

Adobe Systems Acrobat Reader/Distiller : C++



五、关系型数据库

Oracle : 汇编、C、C++、Java。主要为C++。

MySQL : C++

IBM DB2 : 汇编、C、C++,主要为C。

Microsoft SQL Server : 汇编 -> C->C++

IBM Informix : 汇编、C、C++,主要为C。

SAP DB/MaxDB : C++



六、Web Browsers/浏览器

Microsoft Internet Explorer : C++

Mozilla Firefox : C++

Netscape Navigator : The code of Netscape browser was written in C, and Netscape engineers, all bought to Java (see M. Cusumano book and article) redeveloped the browser using Java. It was too slow and abandoned. Mozilla, the next version, was later developed using C++.

Safari : (2003年1月发布)C++

Google Chrome : (2008的发布)C++

Sun HotJava : Java (死于1999年)

Opera : C++ (手机上占用率比较大)

Opera Mini : Opera Mini (2007) has a very funny architecture, and is indeed using both C++ and Java. The browser is split in two parts, an ultra thin (less than 100Kb) "viewer" client part and a server side responsible of rendering. The first uses Java and receives the page under the OBML format, the latter reuses classical Opera (C++) rendering engine plus Opera's Small Screen Rendering, on the server. This allows Opera to penetrate various J2ME-enabled portable devices, such as phones, while preserving excellent response time. This comes obviously with a few sacrifices, for instance on JavaScript execution.

Mosaic : 鼻祖(已死) C 语言



七、邮件客户端

Microsoft Outlook : C++

IBM Lotus Notes : Java

Foxmail : Delphi



八、软件开发集成环境/IDE:

Microsoft Visual Studio : C++

Eclipse : Java (其图形界面SWT基于C/C++)

Code::Blocks : C++

易语言: C++

火山中文: C++

火山移动: C++



九、虚拟机

Microsoft .Net CLR (.NET的虚拟机): C++

Java Virtual Machine (JVM) : Java 虚拟机:C++



十、ERP软件 (企业应用)

SAP mySAP ERP : C,后主要为“ABAP/4”语言

Oracle Peoplesoft : C++ -> Java

Oracle E-Business Suite : Java



十一、商业智能(Business Intelligence )

Business Objects : C++



十二、图形处理

Adobe Photoshop : C++

The GIMP : C



十三、搜索引擎

Google : 汇编 与 C++,主要为C++



十四、着名网站

eBay : 2002年为C++,后主要迁至Java

facebook : C++ 和 PHP

This line is only about facebook, not its plugins. Plugins can be developed in many different technologies, thanks to facebook's ORB/application server, Thrift. Thrift contains a compiler coded in C++. facebook people write about Thrift: "The multi-language code generation is well suited for search because it allows for application development in an efficient server side language (C++) and allows the Facebook PHP-based web application to make calls to the search service using Thrift PHP libraries." Aside the use of C++, facebook has adopted a LAMP architecture.

阿里巴巴和淘宝: php->C++/Java(主要用)



十五、 游戏 :

汇编、C、C++

星际争霸、魔兽争霸、CS、帝国时代、跑跑卡丁车、传奇、魔兽世界.... 数不胜数了,自己数吧

都是用C++开发的,C++语言靠近系统地称,执行速度最快。比如你的两个朋友与你分别玩用VB、Java、与C++编写的“跑跑卡丁车”,你玩C++编写的 游戏 已经跑玩结束了,发现你的两个朋友还没开始跑呢,那是相当的卡啊,



十六、编译

Microsoft Visual C++ 编译器: C++

Microsoft Visual Basic 解释、编译器: C++

Microsoft Visual C# : 编译器: C++

gcc (GNU C compiler) : C

javac (Sun Java compiler) : Java

Perl : C++

PHP : C



十七、3D 引擎

Microsoft DirectX : C++

OpenGL : C

OGRE 3D : C++



十八、Web Servers (网页服务)

Apache : C和C++,主要为C

Microsoft IIS : C++

Tomcat: Java

Jboss: Java



十九:邮件服务

Microsoft Exchange Server : C->C++

Postfix : C

hMailServer : C++

Apache James : Java



二十:CD/DVD 刻录

Nero Burning ROM : C++

K3B : C++



二十一:媒体播放器

Nullsoft Winamp : C++

Microsoft Windows Media Player : C++

Microsoft Windows Media Player : C++



二十二:Peer to Peer (P2P软件)

eMule : C++

μtorrent : C++

Azureus : Java (图形界面使用基于C/C++的SWT,类Eclipse)



二十三:全球定位系统(GPS)

TomTom : C++

Hertz NeverLost : C++

Garmin : C++

Motorola VIAMOTO : 2007年6月,停止服务。 Java。



二十四:3D 引擎

Microsoft DirectX : C++(相信玩 游戏 的同学都知道这个,现在最高版本是DX11)

OpenGL : C

OGRE 3D : C++


二十五:服务器软件

Apache: C

Nginx: C

IIS: C


二十六:其他相关

OpenStack: Python

综述

着名的软件一般是系统软件,软件一般都分为系统软件和应用软件。开发软件分为一次开发和二次开发,比如开发操作系统(系统软件),就是一次开发;在操作基础上进行应用软件的开发,比如开发 游戏 ,就是二次开发。


一次开发的系统软件,要直接调用硬件资源,必须使用简单、直接的底层语言和中层语言,比如汇编和C语言;二次开发应用软件等,因为应用软件的类别比较多的,针对的情况比较复杂和具体,因此可以选择的语言很多,比如,大数据人工智能方面的有Python;安卓手机APP就是Java等等。

这里还有一个误区,其实语言不重要,每种语言都差不多,重要的是开发环境和编程思想。要学习编程开发,学的不是语言,而是对于开发环境工具的使用和编程思维的锤炼。很多着名的软件都是用C等底层语言编写的,但是也可以用其他语言编写,不过很少学C了,其中有商业的原因。(后面会解释)

集成开发环境软件

计算机语言是不可以单独拿出来说的,比如我们说C语言,指的是C语言编译器,而Python语言,指的是Python解释器。而编译器和解释器却都是用C语言编写,是不是很意外,所以着名的软件一般都是系统软件,使用的是C语言,一个语言就要初中水平就可以学会了,但必须了解IDE开发环境。


要使用计算机语言,就必须安装编译器,或者是解释器,程序员是在TXT文本上编写语言的,用编译器可以一次性编译为可执行文件exe,用解释器则可以逐条翻译成机器语言并逐条执行。编译器速度快,解释器可以跨系统,到了别的系统,不需要程序员改写程序,换一个解释器就行了。

IDE集成开发环境具备图形操作界面、编译器、调制器、控制台,是非常重要的开发工具的,只会一个计算机的语言语法,却不会使用IDE,基本上是没用的!

编程思想

很多着名的软件都是使用C等底层语言编写的,而且所用的都是编译器。当然还有另外一个原因,就是编程思想,C语言是面向过程,Python是面向对象。很明显,一次开发的系统软件肯定是面向过程的,而面向具体使用场景的应用软件肯定是面向对象的。


高手可以自由使用编程思想、程序编写时,交替使用各种语言、切换解释器或者编译器,达到隐藏核心代码目的;又或者软件的核心模块采用C等底层代码,保证软件的运行速度。毕竟开发时都是模块化的,不同模块使用不同的方法都是可以的!

所以很多着名的软件,往往是混合着各种语言,核心部分是C,其他部分则根据不同的情况选用不同语言,之所以会这样做,是因为使用C开发软件要耗费大量的时间太。摩尔定律推动硬件发展,软件开发也受到影响,一个软件晚几天推出市场,效果完全不同,所以程序员经常加班赶工,速度才是最重要的。

总结

如上所述,着名的软件是使用C等底层语言、编译器语言、面向过程的语言编写的,更多的是在一个软件的核心部分使用C等底层语言、编译器语言、面向过程的语言,其他则见机行事。

现在主流的语言是java、python和go

E. 在Python的Flask框架下收发电子邮件


这篇文章主要介绍了在Python的Flask框架下收发电子邮件的教程,主要用到了Flask中的Flask-mail工具,需要的朋友可以参考下
在大多数此类教程中都会不遗余力的介绍如何使用数据库。今天我们对数据库暂且不表,而是来关注另一个在web应用中很重要的特性:如何推送邮件给用户。
在某个轻量级应用中我们可能会添加一个如下的邮件服务功能:当用户有了新的粉丝后,我们发送一封邮件通知用户。有很多方法可以实现这个特性,而我们希望提供出一种可复用的通用框架来处理。
Flask-Mail介绍
对于我们来说是幸运的,现在已经有很多外部插件来处理邮件,虽说不能百分百按照我们的想法去处理,但已经相当接近了。
在虚拟环境中安装 Flask-Mail是相当简单的。Windows以外的用户可以让手利用以下命令来安装:
?
1
flask/bin/pip install flask-mail
Windows用户的安装稍有不同,因为Flask-Mail所使用的一些模块不能再Windows系统上运行,你可以使用以下命令:
?
1
flaskScriptspip install --no-deps lamson chardet flask-mail
配置:
回想汪指一下前文中单元测试部分的案例,我们通过添加配置支持了一个这样的功能:当应用的某个版本测试出错时可以邮件通知我们。从这个例子就可以看出如何配置使用邮件支持。
再次提醒大家,我们需要设置两个方面的内容:
邮件服务器信息
用户邮箱地址
如下正是前文中所用到的配置
# email server
MAIL_SERVER =
MAIL_PORT = 25
MAIL_USE_TLS = False
MAIL_USE_SSL = False
MAIL_USERNAME = you
MAIL_PASSWORD = your-password
# administrator list
ADMINS = [[email protected]]
其中并没有设置切实可用的邮件服务器和邮箱。现在我们通过一个例子来看如何使用gmail邮箱账户来发送邮件:
# email server
MAIL_SERVER =
MAIL_PORT = 465
MAIL_USE_TLS = False
MAIL_USE_SSL = True
MAIL_USERNAME = your-gmail-username
MAIL_PASSWORD = your-gmail-password
# administrator list
ADMINS = [[email protected]]
另外我们也可以初始化一个Mail对象来连接SMTP邮件服务器,发送邮件:
?
1
2
from flask.ext.mail import Mail
mail = Mail(app)
发个邮件试试!
为了了解flask-mail如何工作的,我们可以从命令行发一封邮件看看。进入python shell并执行如下的脚本:
?
7
from flask.ext.mail import Message
from app import mail
from config import ADMINS
msg = Message(test subject, sender = ADMINS[0], recipients = ADMINS)
msg.body = text body
msg.html = bHTML/b body
mail.send(msg)
上面这段代码会根据inconfig.py中配置的邮箱地址列表,以首个邮箱作为发件人给所有邮箱发送一封邮件。邮件内容会以文本和html两种格式呈现,而你能看到哪种格式取决于你的邮件客户端。
多么简单小巧!你完全可以现在就把它集成到你的应用中。
邮件框架
我们现在可以编写一个帮助函数来发送邮件。困滑配这是以上测试中一个通用版的测试。我们把这个函数放进一个新的原文件中用作邮件支持(fileapp/emails.py):
?
7
8
from flask.ext.mail import Message
from app import mail
def send_email(subject, sender, recipients, text_body, html_body):
msg = Message(subject, sender, recipients)
msg.body = text_body
msg.html = html_body
mail.send(msg)
Flask-Mail的邮件支持超出了我们目前的使用范围,像密件抄送和附件的功能并不会在此应用中得以使用。
Follower 提醒
现在,我们已经有了发邮件的基本框架,我们可以写发送follower提醒的函数了 (fileapp/emails.py):
11
from flask import render_template
from config import ADMINS
def follower_notification(followed, follower):
send_email([microblog] %s is now following you! % follower.nickname,
ADMINS[0],
[followed.email],
render_template(follower_email.txt,
user = followed, follower = follower),
render_template(follower_email.html,
user = followed, follower = follower))
你在这里找到任何惊喜了吗?我们的老朋友render_template函数有一次出现了。
如果你还记得,我们使用这个函数在views渲染模版. 就像在views里写html不好一样,使用邮件模版是理想的选择。我们要可能的将逻辑和表现分开,所以email模版也会和其它试图模版一起放到在模版文件夹里.
所以,我们需要为follower提醒邮件写纯文本和网页版的邮件模版,下面这个是纯文本的版本 (fileapp/templates/follower_email.txt):
?
7
8
9
Dear {{user.nickname}},
{{follower.nickname}} is now a follower. Click on the following link to visit {{follower.nickname}}s profile page:
{{url_for(user, nickname = follower.nickname, _external = True)}}
Regards,
The microblog admin
下面这个是网页版的邮件,效果会更好(fileapp/templates/follower_email.html):
11
12
13
pDear {{user.nickname}},/p
pa href={{url_for(user, nickname = follower.nickname, _external = True)}}{{follower.nickname}}/a is now a follower./p
table
tr valign=top
tdimg src={{follower.avatar(50)}}/td
td
a href={{url_for(user, nickname = follower.nickname, _external = True)}}{{follower.nickname}}/abr /
{{follower.about_me}}
/td
/tr
/table
pRegards,/p
pThe codemicroblog/code admin/p
注解:模版中的url_for函数的 _external = True 参数的意义.默认情况下,url_for 函数生成url是相对我们的域名的。例如,url_for(index)函数返回值是/index, 但是,发邮件是我们想要
最后一步是处理“follow”过程,即触发邮件提醒时的视图函数,(fileapp/views.py):
?
7
8
9
from emails import follower_notification
@app.route(/follow/nickname)
@login_required
def follow(nickname):
user = User.query.filter_by(nickname = nickname).first()
# ...
follower_notification(user, g.user)
return redirect(url_for(user, nickname = nickname))
现在你可以创建两个用户(如果还没有用户的话)尝试着用让一个用户follow另一个用户,理解邮件提醒是怎样工作的。
就是这样吗?我们做完了吗?
我们可能心底里很兴奋完成了这项工作并且把邮件提醒功能同未完成列表里删除。
但是,如果你现在测试下应用,你会发现当你单击follow链接的时候,页面会2到3秒才会响应,浏览器才会刷新,这在之前是没有的。
发生了什么?
问题是,Flask-Mail 使用同步模式发送电子邮件。 从电子邮件发送开始,直到电子邮件交付后,给浏览器发回其响应,在整个过程中,Web服务器会一直阻塞。如果我们试图发送电子邮件到一个服务器是缓慢的,甚至更糟糕的,暂时处于脱机状态,你能想象会发生什么吗?很不好。
这是一个可怕的限制,发送电子邮件应该是后台任务且不会干扰Web服务器,让我们看看我们如何能够解决这个问题。
Python中执行异步调用
我们想send_email 函数发完邮件后立即返回,需要让发邮件移动到后台进程来异步执行。
事实上python已经对异步任务提供了支持,但实际上,还可以用其他的方式,比如线程和多进程模块也可以实现异步任务。
每当我们需要发邮件的时候,启动一个线程来处理,比启动一个全新的进程节省资源。所以,让我们将mail.send(msg)调用放到另一个线程中。(fileapp/emails.py):
11
from threading import Thread
def send_async_email(msg):
mail.send(msg)
def send_email(subject, sender, recipients, text_body, html_body):
msg = Message(subject, sender = sender, recipients = recipients)
msg.body = text_body
msg.html = html_body
thr = threading.Thread(target = send_async_email, args = [msg])
thr.start()
如果你测试‘follow‘函数,现在你会发现浏览器在发送邮件之前会刷新。
所以,我们已经实现了异步发送,但是,如果未来在别的需要异步功能的地方难道我们还需要在实现一遍吗?
过程都是一样的,这样就会在每一种情况下都有重复代码,这样非常不好。
我们可以通过 decorator改进代码。使用装饰器的代码是这样的:
11
from decorators import async
@async
def send_async_email(msg):
mail.send(msg)
def send_email(subject, sender, recipients, text_body, html_body):
msg = Message(subject, sender = sender, recipients = recipients)
msg.body = text_body
msg.html = html_body
send_async_email(msg)
更好了,对不对?
实现这种方式的代码实际上很简单,创建一个新源文件(fileapp/decorators.py):
?
7
from threading import Thread
def async(f):
def wrapper(*args, **kwargs):
thr = Thread(target = f, args = args, kwargs = kwargs)
thr.start()
return wrapper
现在我们对异步任务创建了个有用的框架(framework), 我们可以说已经完成了!
仅仅作为一个练习,让我们思考一下为什么这个方法会看上去使用了进程而不是线程。我们并不想每当我们需要发送一封邮件时就有一个进程被启动,所以我们能够使用thePoolclass而不用themultiprocessingmole。这个类会创建指定数量的进程(这些都是主进程的子进程),并且这些子进程会通过theapply_asyncmethod送到进程池,等待接受任务去工作。这可能对于一个繁忙的网站会是一个有趣的途径,但是我们目前仍将维持现在线程的方式。

F. python电子邮件系列(三)之POP接收邮件

由上篇文章我们已经得知邮件从发送到接收的过程:

发件人->MUA->MTA->若干MTA->MDA->MUA->收件人

本节接收邮件主要就是编写一个 MUA 客户端,从 MDA 将邮件取回本地。

收取邮件最常用的是 POP协议 ,目前版本是第三版,也称 POP3 。python内置了 poplib 模块,支持POP3协议。

回想上一节 SMTP ,我们对要发送的邮件内容进行了各种编码,包括添加MIME header,编码之后再进行发送。

因此,我们通过POP3协议接收的也不是原内容,而是经过一系列编码等处理的文本。

所以,要想把POP3收取的文本变为可阅读的邮件对象,就需要利用 email 模块对原始邮件进行解析。

所以,邮件收取的流程就是:

由上一篇 文章 最后总结部分可知。邮件由字符到发送到网络经历了如下的格式转化:

纯文本:

str->bytes->base64->str->bytes

二进制文件:

binary code->base64->str->bytes

我们解析邮件也是按这个思路,逆序解析出内容。

这里的 decode('utf-8') 先把字节流转化为字符串,再将字符串转化为 message 结构的对象。这步与发送邮件的 as_string 函数相反。

先从上一节结构化的 msg 中取出信件头,打印出来。

如果是 multipart 结构, get_payload 函数会返回一个包含不同part的list,然后对每一part递归调用 print_info ,打印子信件头和子信件内容。

不是 multipart 时,之后再依据 Content-Type 作不同处理:

如果是 text :

利用 get_payload(decode = Ture) 取出子信件的内容, decode 为True,则按照 Content-Transfer-Type 将 base64 或 QP 解码为 bytes 。

再 guess_charset 猜出编码方式,之后将其解码为字符显示。

如果不是 Text 对象,则为附件:

打印出附件的 Content-Type 。

热点内容
滑板鞋脚本视频 发布:2025-02-02 09:48:54 浏览:432
群晖怎么玩安卓模拟器 发布:2025-02-02 09:45:23 浏览:557
三星安卓12彩蛋怎么玩 发布:2025-02-02 09:44:39 浏览:743
电脑显示连接服务器错误 发布:2025-02-02 09:24:10 浏览:536
瑞芯微开发板编译 发布:2025-02-02 09:22:54 浏览:146
linux虚拟机用gcc编译时显示错误 发布:2025-02-02 09:14:01 浏览:232
java驼峰 发布:2025-02-02 09:13:26 浏览:651
魔兽脚本怎么用 发布:2025-02-02 09:10:28 浏览:532
linuxadobe 发布:2025-02-02 09:09:43 浏览:212
sql2000数据库连接 发布:2025-02-02 09:09:43 浏览:726