发送电子邮件

简介:

SMTP

简单邮件传输协议(SMTP)是用于发送电子邮件的协议。

SMTP规定电子邮件应该如何格式化、加密、在邮件服务器之间传递,以及在点击发送后,计算机要处理的所有其他细节。

SMTP服务器的域名通常是电子邮件提供商的域名,前面加上SMTP。

1
2
3
>>>  import  smtplib
>>> smtpObj1 = smtplib.SMTP( 'smtp.gmail.com' , 587 )     ##TLS
>>> smtpObj2 = smtplib.SMTP_SSL( 'smtp.gmail.com' , 465 )   ##SSL


要确保得到smtp对象后,第一件事就是调用ehlo()方法,否则以后的方法调用会导致错误。

连接到SMTP服务器的587端口后,调用starttls()方法,这是连接实现加密必须的步骤。如果要连接到465端口,加密已经设置好了,这一步可以跳过。

不建议在源代码中放入密码,推荐调用input(),让用户输入密码。

1
2
3
4
5
6
7
8
9
10
11
12
>>>  import  smtplib
>>> smtpObj = smtplib.SMTP( 'smtp.qq.com' , 587 )
>>> smtpObj.ehlo()
( 250 , b 'smtp.qq.com\nPIPELINING\nSIZE 73400320\nSTARTTLS\nAUTH LOGIN PLAIN\nAUTH=LOGIN\nMAILCOMPRESS\n8BITMIME' ##如果返回的元组中,第一项是250(SMTP中“成功”的代码),则问候成功了。
>>> smtpObj.starttls()              ##starttls()让SMTP连接处于TLS模式。
( 220 , b 'Ready to start TLS' )        ##返回值220表示服务器已经准备就绪。
>>> smtpObj.login( '123456789@qq.com' , '123456789' )
( 235 ,b '2.7.0 Accepted' )    ##返回值235表示认证成功。
>>> smtpObj.sendmail( '123456789@qq.com' , '8888888@qq.com' , 'Subject:TKS\nDear,TKS.' ##返回值是一个字典。空字典表示已成功发送。
{}
>>> smtpObj.quit()
( 221 , b '2.0.0 closing connection' )    ##221表示会话结束。


IMAP

SMTP只负责向别人发送电子邮件。IMAP则负责收取下载电子邮件。

python带有一个imaplib模块,但实际上第三方的imapclient模块更易用。

imapclient模块从IMAP服务器下载电子邮件,格式相当复杂。pyzmail模块可以完成解析邮件的辛苦工作。

1
2
3
4
5
6
7
8
[root@pos ~] # pip3 install imapclient pyzmail
[root@pos ~] # python3
Python 3.4.5 (default, May 29 2017, 15:17:55) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type  "help" "copyright" "credits"  or  "license"  for  more  information.
>>>  import  imapclient
>>>  import  pyzmail
>>>


电子邮件可以是纯文本、HTML或者两者的混合。

连接到IMAP服务器时,大多数电子邮件提供商要求SSL加密,传入SSL=TRUE关键字参数。

几乎每个账户默认都有一个INBOX文件夹,但也可以调用IMAPClient对象的list_folders()方法,获取文件列表。这将返回一个元组的列表。每个元组包含一个文件夹的信息。

要选择一个文件夹进行搜索,就调用IMAPClient对象的select_folder()方法,传入该文件夹的名称字符串。

如果搜索匹配大量的电子邮件,python可能抛出异常。如果发生这种情况,必须断开并重连IMAP服务器,然后再试。这个限制是防止python程序消耗太多内存。可以使用imaplib._MAXLINE=10000000将限制改为10000000字节。

文件夹选中后,就可以用IMAPClient对象的search()方法搜索电子邮件。得到列表后,调用fetch()方法,获得实际的电子邮件内容。

delete_messages()为邮件加上\Deleted标志。调用expunge()方法,将永久删除当前选中的文件夹中带\Deleted标志的所有电子邮件。

如果程序运行了几分钟或者更长时间,IMAP服务器可能会超时,或自动断开。调用imapclient.IMAPClient(),再次连接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
>>> import  imapclient
>>>imapObj = imapclient.IMAPClient( 'imap.gmail.com' ,ssl = True )
>>>imapObj.login( '123456789@gmail.com' , '88888888' )
>>>imapObj.select_folder( 'INBOX' ,readonly = True )
>>>UIDs = imapObj.search([ 'SINCE 15-Jul-2016' ])      ##能够看到40041
>>>rawMessages = imapObj.fetch([ 40041 ],[ 'BODY[]' , 'FLAGS' ])
>>> import  pyzmail
>>>message = pyzmail.PyzMessage.factory(rawMessages[ 40041 ][ 'BODY[]' ])
>>>message.get_subject()   ##获取主题
'Hello World!'
>>>message.get_addresses( 'from' )    ##发送方
[( 'abc' , 'abc@qq.com' )]
>>>message.get_addresses( 'to' )      ##接收方
[( 'Grodd' , '123456789@gmail.com' )]
>>>message.get_addresses( 'cc' )      ##抄送
[]              ##表示没有包含地址
>>>message.get_addresses( 'bcc' )     ##密送
[]
>>>message.text_part ! =  None
True
>>>message.text_part.get_payload().decode(message.text_part.charset)   ##获取文本部分
>>>message.html_part ! =  None
True
>>>message.html_part.get_payload().decode(message.html_part.charset)   ##获取html部分
>>>imapObj.logout()








本文转自Grodd51CTO博客,原文链接:http://blog.51cto.com/juispan/2071901 ,如需转载请自行联系原作者
相关文章
|
前端开发 JavaScript 程序员
基于React Hooks封装的验证码组件
基于React Hooks封装的验证码组件
1604 1
|
机器学习/深度学习 监控 Ubuntu
perf性能分析工具使用分享
perf性能分析工具使用分享
2705 0
perf性能分析工具使用分享
|
算法 C++
OpenCV-白平衡(完美反射算法)
OpenCV-白平衡(完美反射算法)
825 0
|
存储 人工智能 弹性计算
国内首个,阿里云入选Gartner®战略云平台魔力象限挑战者
近日,Gartner发布2024年《战略云平台魔力象限》(Magic Quadrant™ for Strategic Cloud Platform Services)报告,阿里云从利基者象限进入挑战者象限,成为国内首个入选该象限的中国公共云厂商。
|
安全 应用服务中间件 网络安全
49.3k star,本地 SSL 证书生成神器,轻松解决 HTTPS 配置痛点
mkcert是一款由Filippo Valsorda开发的免费开源工具,专为生成受信任的本地SSL/TLS证书而设计。它通过简单的命令自动生成并安装本地信任的证书,使本地环境中的HTTPS配置变得轻松无比。mkcert支持多个操作系统,已获得49.2K的GitHub Star,成为开发者首选的本地SSL工具。
662 10
|
安全 搜索推荐 Unix
如何提取指定镜像的 Dockerfile
如何提取指定镜像的 Dockerfile
510 0
|
Linux
`grep`命令搜索多个文件中的特定模式
`grep`命令搜索多个文件中的特定模式
1104 2
|
SQL Java 关系型数据库
MyBatisPlus学习笔记(SpringBoot版)
MyBatisPlus学习笔记(SpringBoot版)
708 0
|
XML 算法 Java
Android App开发之位图加工Bitmap中转换位图的像素色彩、裁剪内部区域、利用矩阵变换位图的讲解及实战(附源码和演示)
Android App开发之位图加工Bitmap中转换位图的像素色彩、裁剪内部区域、利用矩阵变换位图的讲解及实战(附源码和演示)
414 0
|
Kubernetes 负载均衡 Cloud Native
如何将Docker与Kubernetes集成,实现云原生应用程序
在云原生应用程序开发中,Docker和Kubernetes通常是不可或缺的工具。Docker用于容器化应用程序和其依赖项,而Kubernetes用于自动化和编排容器的部署、扩展和管理。下面是如何将Docker与Kubernetes集成
629 0