开发者社区> 技术小美> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

发送电子邮件

简介:
+关注继续查看

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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Jamil+c#—实现邮件的发送
Jamil+c#—实现邮件的发送
0 0
发送电子邮件
来源:http://www.cnblogs.com/damonlan/archive/2012/04/28/2473525.html 作者:浪迹天涯   用的dll是微软自带的,觉得挺好用的!! 1 public class SimpleEmailHelper 2 { ...
2206 0
发送加密邮件
<p>如何发送加密邮件呢?</p> <p>比如用户A 要向用户B 发送邮件,必须先插上自己的key,key中存有A自己的私钥。如下图:</p> <p><img src="http://img.blog.csdn.net/20140102222406406?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHcxMjg3Nzg5Njg3/font
900 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载