- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
16.2 发送电子邮件
你可能对发送电子邮件很熟悉,通过Outlook、Thunderbird或某个网站,如Gmail或雅虎邮箱。遗憾的是,Python没有像这些服务一样提供一个漂亮的图形用户界面。作为替代,你调用函数来执行SMTP的每个重要步骤,就像下面的交互式环境的例子。
注意
不要在IDLE中输入这个例子,因为smtp.example.com、bob@example.com、MY_ SECRET_PASSWORD和alice@example.com只是占位符。这段代码仅仅勾勒出Python发送电子邮件的过程。
>>> import smtplib >>> smtpObj = smtplib.SMTP('smtp.example.com', 587) >>> smtpObj.ehlo() (250, b'mx.example.com at your service, [216.172.148.131]\nSIZE 35882577\ n8BITMIME\nSTARTTLS\nENHANCEDSTATUSCODES\nCHUNKING') >>> smtpObj.starttls() (220, b'2.0.0 Ready to start TLS') >>> smtpObj.login('bob@example.com', 'MY_SECRET_PASSWORD') (235, b'2.7.0 Accepted') >>> smtpObj.sendmail('bob@example.com', 'alice@example.com', 'Subject: So long.\nDear Alice, so long and thanks for all the fish. Sincerely, Bob') {} >>> smtpObj.quit() (221, b'2.0.0 closing connection ko10sm23097611pbd.52 - gsmtp')
在下面的小节中,我们将探讨每一步,用你的信息替换占位符,连接并登录到SMTP服务器,发送电子邮件,并从服务器断开连接。
16.2.1 连接到SMTP服务器
如果你曾设置了Thunderbird、Outlook或其他程序,连接到你的电子邮件账户,你可能熟悉配置SMTP服务器和端口。这些设置因电子邮件提供商而不同,但在网上搜索“< 你的提供商> SMTP设置”,应该能找到相应的服务器和端口。
SMTP服务器的域名通常是电子邮件提供商的域名,前面加上SMTP。例如,Gmail的 SMTP 服务器是smtp.gmail.com。表 16-1 列出了一些常见的电子邮件提供商及其SMTP服务器(端口是一个整数值,几乎总是587,该端口由命令加密标准TLS使用)。
表16-1 电子邮件提供商及其SMTP服务器
提供商
SMTP服务器域名
Gmail
smtp.gmail.com
Outlook.com/Hotmail.com
smtp-mail.outlook.com
Yahoo Mail
smtp.mail.yahoo.com
AT&T
smpt.mail.att.net (port 465)
Comcast
smtp.comcast.net
Verizon
smtp.verizon.net (port 465)
得到电子邮件提供商的域名和端口信息后,调用smtplib.SMTP()创建一个SMTP对象,传入域名作为一个字符串参数,传入端口作为整数参数。SMTP对象表示与SMTP邮件服务器的连接,它有一些发送电子邮件的方法。例如,下面的调用创建了一个SMTP对象,连接到Gmail:
>>> smtpObj = smtplib.SMTP('smtp.gmail.com', 587) >>> type(smtpObj) < class 'smtplib.SMTP'>
输入type(smtpObj)表明,smtpObj中保存了一个SMTP对象。你需要这个SMTP对象,以便调用它的方法,登录并发送电子邮件。如果smtplib.SMTP()调用不成功,你的SMTP服务器可能不支持TLS端口587。在这种情况下,你需要利用smtplib.SMTP_SSL()和465端口,来创建SMTP对象。
>>> smtpObj = smtplib.SMTP_SSL('smtp.gmail.com', 465)
注意
如果没有连接到因特网,Python将抛出socket.gaierror: [Errno 11004] getaddrinfo failed或类似的异常。
对于你的程序,TLS和SSL之间的区别并不重要。只需要知道你的SMTP服务器使用哪种加密标准,这样就知道如何连接它。在接下来的所有交互式环境示例中,smtpObj变量将包含smtplib.SMTP()或smtplib.SMTP_SSL()函数返回的SMTP对象。
16.2.2 发送SMTP的“Hello”消息
得到SMTP对象后,调用它的名字古怪的EHLO()方法,向SMTP电子邮件服务器“打招呼”。这种问候是SMTP中的第一步,对于建立到服务器的连接是很重要的。你不需要知道这些协议的细节。只要确保得到SMTP对象后,第一件事就是调用ehlo()方法,否则以后的方法调用会导致错误。下面是一个ehlo()调用和返回值的例子:
>>> smtpObj.ehlo() (250, b'mx.google.com at your service, [216.172.148.131]\nSIZE 35882577\ n8BITMIME\nSTARTTLS\nENHANCEDSTATUSCODES\nCHUNKING')
如果在返回的元组中,第一项是整数250(SMTP中“成功”的代码),则问候成功了。
16.2.3 开始TLS加密
如果要连接到SMTP服务器的587端口(即使用TLS加密),接下来需要调用starttls()方法。这是为连接实现加密必须的步骤。如果要连接到465端口(使用SSL),加密已经设置好了,你应该跳过这一步。
下面是starttls()方法调用的例子:
>>> smtpObj.starttls() (220, b'2.0.0 Ready to start TLS')
starttls()让SMTP连接处于TLS模式。返回值220告诉你,该服务器已准备就绪。
16.2.4 登录到SMTP服务器
到SMTP服务器的加密连接建立后,可以调用login()方法,用你的用户名(通常是你的电子邮件地址)和电子邮件密码登录。
>>> smtpObj.login('my_email_address@gmail.com', 'MY_SECRET_PASSWORD') (235, b'2.7.0 Accepted')
传入电子邮件地址字符串作为第一个参数,密码字符串作为第二个参数。返回值235表示认证成功。如果密码不正确,Python会抛出smtplib. SMTPAuthenticationError异常。
将密码放在源代码中要当心。如果有人复制了你的程序,他们就能访问你的电子邮件账户!调用input(),让用户输入密码是一个好主意。每次运行程序时输入密码可能不方便,但这种方法不会在未加密的文件中留下你的密码,黑客或笔记本电脑窃贼不会轻易地得到它。
16.2.5 发送电子邮件
登录到电子邮件提供商的SMTP服务器后,可以调用的sendmail()方法来发送电子邮件。sendmail()方法调用看起来像这样:
>>> smtpObj.sendmail('my_email_address@gmail.com', 'recipient@example.com', 'Subject: So long.\nDear Alice, so long and thanks for all the fish. Sincerely, Bob') {}
sendmail()方法需要三个参数。
· 你的电子邮件地址字符串(电子邮件的“from”地址)。
· 收件人的电子邮件地址字符串,或多个收件人的字符串列表(作为“to”地址)。
· 电子邮件正文字符串。
电子邮件正文字符串必须以'Subject: \n'开头,作为电子邮件的主题行。'\n'换行符将主题行与电子邮件的正文分开。
sendmail()的返回值是一个字典。对于电子邮件传送失败的每个收件人,该字典中会有一个键值对。空的字典意味着对所有收件人已成功发送电子邮件。
Gmail应用程序专用密码
Gmail有针对谷歌账户的附加安全功能,称为应用程序专用密码。如果当你的程序试图登录时,收到“需要应用程序专用密码”的错误信息,就必须在Python脚本设置这样一个密码。具体如何设置谷歌账户的应用程序专用密码,参见http://nostarch.com/automatestuff/。
16.2.6 从SMTP服务器断开
确保在完成发送电子邮件时,调用quit()方法。这让程序从SMTP服务器断开。
>>> smtpObj.quit() (221, b'2.0.0 closing connection ko10sm23097611pbd.52 - gsmtp')
返回值221表示会话结束。
要复习连接和登录服务器、发送电子邮件和断开的所有步骤,请参阅 16.2节“发送电子邮件”。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论