发送电子邮件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了发送电子邮件相关的知识,希望对你有一定的参考价值。
SMTP简单邮件传输协议(SMTP)是用于发送电子邮件的协议。
SMTP规定电子邮件应该如何格式化、加密、在邮件服务器之间传递,以及在点击发送后,计算机要处理的所有其他细节。
SMTP服务器的域名通常是电子邮件提供商的域名,前面加上SMTP。
>>> 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(),让用户输入密码。
>>> 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('[email protected]','123456789') (235,b'2.7.0 Accepted') ##返回值235表示认证成功。 >>> smtpObj.sendmail('[email protected]','[email protected]','Subject:TKS\nDear,TKS.') ##返回值是一个字典。空字典表示已成功发送。 {} >>> smtpObj.quit() (221, b'2.0.0 closing connection') ##221表示会话结束。
IMAP
SMTP只负责向别人发送电子邮件。IMAP则负责收取下载电子邮件。
python带有一个imaplib模块,但实际上第三方的imapclient模块更易用。
imapclient模块从IMAP服务器下载电子邮件,格式相当复杂。pyzmail模块可以完成解析邮件的辛苦工作。
[[email protected] ~]# pip3 install imapclient pyzmail [[email protected] ~]# 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(),再次连接。
>>>import imapclient >>>imapObj=imapclient.IMAPClient('imap.gmail.com',ssl=True) >>>imapObj.login('[email protected]','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','[email protected]')] >>>message.get_addresses('to') ##接收方 [('Grodd','[email protected]')] >>>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()
以上是关于发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章