精通Python自动化脚本-运维人员宝典完整目录:
第一章 Python脚本概述
第二章 Python脚本调试和性能测试
第三章 单元测试-单元测试框架的介绍
第四章 自动化常规运维活动
第五章 文件、目录和数据处理
第六章 文件存档、加密和解密
第七章 文本处理和正则表达式
第八章 文档和报告
第九章 操作各类文件
第十章 网络基础 – Socket编程
第十一章 使用Python脚本处理邮件
第十二章 使用Telnet和SSH远程监控主机
第十三章 创建图形化用户界面
第十四章 处理Apache和其它的日志文件
第十五章 SOAP和REST API通讯
第十六章 网络抓取 – 从网站上提取有用的信息
第十七章 数据收集及报表
第十八章 MySQL和SQLite数据库管理
本章中我们将学习如何使用Python脚本来处理邮件。我们会学习到email消息格式。还将探讨使用smtplib发送和接收email。我们将使用Python的email包来发送带有附件和HTML内容的邮件。我们还将学习用于处理邮件的不同协议。
本章中我们将学习如下内容:
- Email消息格式
- 添加HTML和多媒体内容
- POP3和IMAP服务器
Email消息格式
这一部分中,我们将学习邮件消息格式。邮件消息有三个主要组成部分:
- 接收人的email地址
- 发送者的email地址
- 消息体
消息格式中还有其它组成部分,如标题、email签名和附件。
下面我们来看从Gmail发送普通文本邮件的一个简单示例,通过本例可以学习到如何编写邮件消息以及发送消息。创建一个脚本write_email_message.py并在其中编写如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import smtplib, getpass # host_name = 'smtp.gmail.com' host_name = 'smtp.exmail.qq.com' # host_name = 'smtp.163.com' port = 465 sender = '发件人 email' receiver = '收件人 email' password = getpass.getpass() msg = """\ Subject: Test Mail Hello from Alan !!!""" s = smtplib.SMTP_SSL(host_name, port) s.login(sender, password) s.sendmail(sender, receiver, msg) s.quit() print("Mail sent Successfully") |
译者注:因在墙内以及安全认证机制的原因,可尝试使用其它国内邮箱服务进行替代
运行脚本如下:
1 2 3 4 5 |
$ python3 write_email_message2.py # 输出结果 Password: Mail sent Successfully |
上例中,我们使用了Python的smtplib模块来发送邮件。确保使用Gmail ID向收件人发送消息。变量sender保存发件人的邮箱。对变量password,我们既可以明文输入也可以使用getpass模块弹出提示输入密码。此处我们选择了后者。接着,我们创建了一个变量msg,即我们的实际邮件消息。在其中,我们首先传入了标题,然后添加了想要发送的消息内容。然后在login()中,我们传入了变量sender和password。接着在sendmail()中,我们传入了发件人、收件人和消息文本的相关变量。通过这一流程,我们成功地发出了邮件。
添加HTML和多媒体内容
这部分中,我们将来看如何以附件发送多媒体内容,以及如何添加HTML内容。要实现这一功能,我们需要用到Python的email包。
首先,我们来看如何添加HTML内容。创建脚本add_html_content.py来进行实现,编写内容如下:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import os, smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import getpass # host_name = 'smtp.gmail.com' host_name = 'smtp.exmail.qq.com' # host_name = 'smtp.163.com' port = 465 sender = '发件人 email' receiver = '收件人 email' password = getpass.getpass() text = MIMEMultipart() text['Subject'] = 'Test HTML Content' text['From'] = sender text['To'] = receiver msg = """\ <html> <body> <p>Hello there, <br> Good day !!<br> <a href="http://www.imdb.com">Home</a> </p> </body> </html> """ html_content = MIMEText(msg, "html") text.attach(html_content) s = smtplib.SMTP_SSL(host_name, port) print("Mail sent successfully !!") s.login(sender, password) s.sendmail(sender, receiver, text.as_string()) s.quit() |
运行脚本,将得到如下输出:
1 2 3 4 5 |
$ python3 add_html_content2.py # 输出结果: Password: Mail sent successfully !! |
上例中,我们通过Python脚本使用email包在消息中发送了HTML内容。我们创建了一个变量msg用于存储HTML内容。
下面,我们来看如何添加附件以及通过Python脚本来进行发送。为此我们创建一个脚本add_attachment.py,并在其中编写如下内容:
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 26 27 28 29 30 31 32 33 34 35 |
import os, smtplib from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart import getpass # host_name = 'smtp.gmail.com' host_name = 'smtp.exmail.qq.com' # host_name = 'smtp.163.com' port = 465 sender = '发件人 email' receiver = '收件人 email' password = getpass.getpass() text = MIMEMultipart() text['Subject'] = 'Test Attachment' text['From'] = sender text['To'] = receiver txt = MIMEText('Sending a sample image.') text.attach(txt) f_path = '文件路径' with open(f_path, 'rb') as f: img = MIMEImage(f.read()) img.add_header('Content-Disposition', 'attachment', filename=os.path.basename(f_path)) text.attach(img) s = smtplib.SMTP_SSL(host_name, port) print("Attachment sent successfully !!") s.login(sender, password) s.sendmail(sender, receiver, text.as_string()) s.quit() |
运行脚本,我们将得到如下输出:
1 2 3 4 5 |
$ python3 add_attachment.py # 输出结果 Password: Attachment sent successfully !! |
上例中,我们以附件向收件人发送图片。我们传入了发件人和收件人的邮件。然后,在f_path中,我们传入了要以附件发送的图片的路径。接着,我们以附件向收件人发送了该图片。
POP3和IMAP服务器
这部分中,我们将学习通过POP和IMAP服务接收邮件。Python中提供了poplib和imaplib这两个库来通过Python脚本接收邮件。
使用poplib库接收email
POP3表示邮局协议(Post Office Protocol)第3版。这一标准协议帮助我们从远程服务器接收邮件到本地机器。POP3的主要优势是它允许我们将邮件下载到本地机器并在线下读取所下载的邮件。
POP3协议用于两个端口:
端口110: 默认非加密端口
端口995: 加密端口
下面我们来看一些示例。首先,我们来看获取一些邮件的示例。为此创建一个脚本number_of_emails.py并在其中编写如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import poplib, getpass # pop3_server = 'pop.gmail.com' pop3_server = 'pop.exmail.qq.com' username = 'Email地址' password = getpass.getpass() email_obj = poplib.POP3_SSL(pop3_server) print(email_obj.getwelcome()) email_obj.user(username) email_obj.pass_(password) email_stat = email_obj.stat() print("New arrived emails are : %s (%s bytes)" % email_stat) |
运行脚本如下:
1 2 3 4 5 6 |
$ python3 number_of_emails2.py # 输出参考: Password: b'+OK QQMail POP3 Server v1.0 Service Ready(QQMail v2.0)' New arrived emails are : 2793 (1422058063 bytes) |
输出中我们会得到当前邮箱中的 email 数量。
上例中,我们首先导入了poplib库,它在Python中用于使用POP3协议来安全地接收邮件。然后,我们添加了指定的的邮件服务器以及邮件验证信息,即用户名和密码。然后,我们从服务器打印了响应信息,并向POP3 SSL服务器传输了用户名和密码。在登录后,我们得到了邮箱的数据并在终端中打印了邮件的数量。
下面我们将编写一个脚本来获取最新的邮件。为此创建一个脚本latest_email.py并编写如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import poplib, getpass # pop3_server = 'pop.gmail.com' pop3_server = 'pop.exmail.qq.com' username = 'Email地址' password = getpass.getpass() email_obj = poplib.POP3_SSL(pop3_server) print(email_obj.getwelcome()) email_obj.user(username) email_obj.pass_(password) print("\nLatest Mail\n") latest_email = email_obj.retr(1) print(latest_email[1]) |
运行脚本如下:
1 2 3 4 5 6 7 8 |
$ python3 latest_email2.py # 输出结果 Password: b'+OK QQMail POP3 Server v1.0 Service Ready(QQMail v2.0)' Latest Mail ... |
输出结果中将包含邮箱中接收到最新邮件。
上例中,我们导入了Python中使用的poplib库来安全地支持POP3协议的邮件接收。在声明指定服务器和用户名与密码后,我们打印出了服务器的响应消息并向POP3 SSL服务器传递了用户名和密码。然后,我们从邮箱获取到了最新的邮件。
下面,我们编写一下脚本来获取所有邮件。为此我们创建一个脚本all_emails.py,并在其中编写如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import poplib, getpass # pop3_server = 'pop.gmail.com' pop3_server = 'pop.exmail.qq.com' username = 'Email地址' password = getpass.getpass() email_obj = poplib.POP3_SSL(pop3_server) print(email_obj.getwelcome()) email_obj.user(username) email_obj.pass_(password) email_stat = email_obj.stat() NumofMsgs = email_stat[0] for i in range(NumofMsgs): for mail in email_obj.retr(i+1)[1]: print(mail) |
运行脚本如下:
1 |
$ python3 latest_email.py |
输出中,我们将得到邮箱里接收到的所有邮件。
使用imaplib库接收email
IMAP表示因特网邮件访问协议(Internet Message Access Protocol)。它用于在本机上访问远程服务器的邮件。IMAP允许同步地在多个客户端访问邮件。IMAP适用于不同地方访问我们邮件的场景。
IMAP协议使用两个端口:
端口143: 默认非加密端口
端口993: 加密端口
下面我们来看使用imaplib库的一个示例。创建一个脚本imap_email.py并在其中编写如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import imaplib, pprint, getpass # imap_server = 'imap.gmail.com' imap_server = 'imap.exmail.qq.com' username = 'Email地址' password = getpass.getpass() imap_obj = imaplib.IMAP4_SSL(imap_server) imap_obj.login(username, password) imap_obj.select('Inbox') temp, data_obj = imap_obj.search(None, 'ALL') for data in data_obj[0].split(): temp, data_obj = imap_obj.fetch(data, '(RPC822)') print('Message: {0}\n'.format(data)) pprint.pprint(data_obj[0][1]) break imap_obj.close() |
输出中我们将得到指定文件夹中的所有邮件。
上例中,首先我们导入了imaplib库,它用于在Python中通过IMAP协议安全地接收邮件。然后,我们声明了指定的邮件服务器和用户登录信息,即用户名和密码。再后,我们向IMAP SSL服务器传递了用户名和密码。我们对imap_obj使用了select(‘Inbox’)函数来显示收件箱中的消息。然后我们使用for循环来显示逐一获取的消息。显示消息时我们使用了“美化打印”,即pprint.pprint()函数,因为它格式化对像,向数据流中写入,并将其作为参数传递。最后,我们关闭了连接。
总结
本章中,我们学习了如何在Python脚本中编写邮件消息。我们还学习了Python的smtplib模块,它用于通过Python脚本发送和接收邮件。我们同时学习了如何通过POP3和IMAP协议接收邮件。Python提供了poplib和imaplib库来执行这些任务。
下一章中,我们将学习Telnet和SSH。
课后问题
- 什么是POP3和 IMAP?
- break和continue的作用是什么?举出适当的例子。
- pprint是什么?
- 负值索引是什么以及为何使用负值索引?
- pyc和py文件扩展名的区别是什么?
- 使用循环生成如下样式
1010101
10101
101
1