Python中分别有两个库实现发送邮件,分别是smtplib和email。
smtplib是用来发送邮件用的,email是用来构建邮件内容的。
下面是具体使用:
import smtplib
server = smtplib.SMTP()
server.connect(host, port)
#连接(connect)指定的服务器,host是指定连接的邮箱服务器,通过搜索“xx邮箱服务器地址”,就可以找到
#例如QQ邮箱的SMTP服务器地址是:smtp.qq.com。port是端口,一般情况下SMTP默认端口号为25
server.login(username, password)
#username:登录邮箱的用户名
#password:授权码
server.sendmail(sender, to_addr, msg.as_string())
#from_addr:邮件发送地址,就是上面的username
#to_addr:邮件收件人地址
#msg.as_string():为一个字符串类型 ,as_string()是将发送的信息msg变为字符串类型。
server.quit()
#退出服务器,结束SMTP会话
备注:SMTP 协议是由源服务器到目的地服务器传送邮件的一组规则。
email 模块:也就是用来写邮件内容的模块。这个内容可以是纯文本、HTML内容、图片、附件等多种形式。
import email
from email.mime.text import MIMEText
#纯文本或HTML页面
fromemail.mime.image import MIMEImage
#内容形式为图片
fromemail.mime.multipart import MIMEMultipart
#多形式组合,可包含文本和附件
MIMEText方法:
MIMEText(msg,type,chartset)
# msg:文本内容,可自定义
# type:文本类型,默认为plain(纯文本)
# chartset:文本编码,中文为“utf-8”
这是我把自己的username和password省略了
# 测试
import smtplib
from email.mime.textimport MIMEText
username='你的@qq.com'
password='XXXXXXXXX'
sender='发给谁@qq.com'
to_addr='run24118cajie@163.com'
msg=MIMEText('你好这是用python发的一封邮件','plain','utf-8')
server =smtplib.SMTP()
server.connect('smtp.qq.com', 25)
server.login(username,password)
server.sendmail(sender,to_addr, msg.as_string())
server.quit()
发送成功
Python 的实际应用中,特别是在执行周期性定时任务的场景中,我们希望能够一种简单、方便的方式获取任务的运行结果和状态。一般我们通过支持邮件发送功能的方式,实现任务结果的反馈。本文主要介绍,如何通过 Python 实现邮件的自动发送,并以发送QQ邮件为例,分享完整的源码示例。
SMTP 协议属于 TCP/IP 协议簇,是一种简单邮件传输协议,用于在邮件服务器之间发送电子邮件。
Python提供 smtplib 模块定义了一个SMTP客户端会话对象,提供了一种很方便的途径发送电子邮件。发送邮件同时还需要 email 模块,均为内置库,无需安装。接下来,我们先了解下这两个模块。
发送邮件,主要通过 SMTP 类与邮件系统进行交互,smtplib 用法简单,大致分为4个步骤,如下:
对应上述步骤的代码片段如下:
构造邮件内容,支持发送的邮件内容为纯文本、超文本、图片、附件的邮件。针对不同邮件内容有以下三类方法:
每一类对应的导入方式如下:
MIMEText plain 构造普通文本
MIMEText html构造超文本
MIMEText 构造base64数据流(附件)
MIMEImage 构造图片
本文实现QQ邮件的发送,在具体编写代码实现邮件发送之前,首先我们要知道使用 Python代理登录QQ邮箱发邮件时,需要先更改自己 QQ 邮箱设置,更改步骤主要分为两步:
1.首先登录自己的邮箱,找到 设置 ,开启 POP3/SMTP/IMAP 服务,如下:
2.然后开启并获取客户端授权码,如下:
QQ 邮箱 SMTP 服务器地址:smtp.qq.com
现在我们实现一个函数,能够发送纯文本、超文本、附件内容,如下:
查看我们的收件箱(一般在垃圾箱),就可以查看到邮件信息,如下:
关联阅读:Python任务调度模块APScheduler实现定时任务
文我们将学习如何使用Python脚本来处理电子邮件。首先,我们将学习电子邮件消息格式,并使用smtplib模块发送和接收电子邮件。然后将学习使用Python的Email程序包发送带附件和HTML内容的电子邮件。最后将学习电子邮件的不同协议。
本章将介绍以下内容。
· 邮件消息格式。
· 添加HTML和多媒体内容。
· POP3和IMAP服务器。
本节我们将学习电子邮件的消息格式。电子邮件包含3个主要组件,如下所示。
· 收件人的邮件地址。
· 发件人的邮件地址。
· 消息。
消息中还包括其他组件,例如主题行、电子邮件签名和附件等。
下面是一个简单的示例程序,它通过Gmail邮箱发送纯文本电子邮件,我们可以从中了解如何编写电子邮件并发送邮件。现在创建一个脚本,命名为write_email_message.py,并在其中添加以下代码。
1. import smtplib
2. import getpass
3.
4. host_name = "smtp.gmail.com"
5. port = 465
6.
7. sender = 'sender_emil_id'
8. receiver = 'receiver_email_id'
9. password = getpass.getpass()
10.
11. msg = """\
12. Subject: Test Mail
13. Hello from Sender !!"""
14.
15. s = smtplib.SMTP_SSL(host_name, port)
16. s.login(sender, password)
17. s.sendmail(sender, receiver, msg)
18. s.quit()
19.
20. print("Mail sent successfully")
运行脚本程序,如下所示。
1. student@ubuntu:~/work/Chapter_11$ python3 write_email_message.py
输出如下。
1. Password:
2. Mail sent successfully
上面的示例程序使用Python的smtplib模块发送了电子邮件。首先确认是通过Gmail邮箱向收件人发送电子邮件。变量sender保存发件人的电子邮件地址。变量password中,可以直接输入密码,也可以使用getpass模块在运行时提示输入密码,这里使用getpass提示输入密码。接下来创建了一个变量msg,它存储了电子邮件消息的内容,其中首先指出了邮件主题,然后是将要发送的消息正文。然后,在login()函数中,传入了sender和password变量。之后在sendmail()函数中,传入了sender、receivers和msg变量。如此,就可成功发送电子邮件。
本节我们将了解如何添加HTML内容,以及如何将多媒体内容作为附件发送。这里使用Python的Email程序包。
首先我们来看如何添加HTML内容。创建一个脚本,命名为add_html_content.py,并在其中添加以下代码。
1. import os
2. import smtplib
3. from email.mime.text import MIMEText
4. from email.mime.multipart import MIMEMultipart
5. import getpass
6.
7. host_name = 'smtp.gmail.com'
8. port = 465
9.
10. sender = 'sender_emailid'
11. password = getpass.getpass()
12. receiver = 'receiver_emailid'
13.
14. text = MIMEMultipart()
15. text['Subject'] = 'Test HTML Content'
16. text['From'] = sender
17. text['To'] = receiver
18.
19. msg = """\
20. <html>
21. <body>
22. <p>Hello there, <br>
23. Good day !!<br>
24. <a href="http://www.baidu.com">Home</a>
25. </p>
26. </body>
27. </html>
28. """
29.
30. html_content = MIMEText(msg, "html")
31. text.attach(html_content)
32. s = smtplib.SMTP_SSL(host_name, port)
33. print("Mail sent successfully !!")
34.
35. s.login(sender, password)
36. s.sendmail(sender, receiver, text.as_string())
37. s.quit()
运行脚本程序,如下所示。
1. student@ubuntu:~/work/Chapter_11$ python3 add_html_content.py
输出如下。
1. Password:
2. Mail sent successfully !!
在上面的示例程序中,使用了Email程序包发送包含HTML内容的消息。其中的msg变量用于存储HTML内容。
现在我们来学习如何添加附件,并通过Python脚本发送带附件的电子邮件。创建一个脚本,命名为add_attachment.py,并在其中添加以下代码。
1. import os
2. import smtplib
3. from email.mime.text import MIMEText
4. from email.mime.image import MIMEImage
5. from email.mime.multipart import MIMEMultipart
6. import getpass
7.
8. host_name = 'smtp.gmail.com'
9. port = 465
10.
11. sender = 'sender_emailid'
12. password = getpass.getpass()
13. receiver = 'receiver_emailid'
14.
15. text = MIMEMultipart()
16. text['Subject'] = 'Test Attachment'
17. text['From'] = sender
18. text['To'] = receiver
19.
20. txt = MIMEText('Sending a sample image.')
21. text.attach(txt)
22. f_path = 'path_of_file'
23. with open(f_path, 'rb') as f:
24. img = MIMEImage(f.read())
25. img.add_header('Content-Disposition',
26. 'attachment',
27. filename=os.path.basename(f_path))
28.
29. text.attach(img)
30. s = smtplib.SMTP_SSL(host_name, port)
31. print("Attachment sent successfully !!")
32. s.login(sender, password)
33. s.sendmail(sender, receiver, text.as_string())
34. s.quit()
运行脚本程序,如下所示。
1. student@ubuntu:~/work/Chapter_11$ python3 add_attachment.py
输出如下。
1. Password:
2. Attachment sent successfully !!
上面的示例程序中,首先给出了发件人和收件人的电子邮件ID。然后在f_path中,给出了作为附件发送的图像的文件路径。最后将该图像作为附件发送给收件人。
本节我们将学习如何通过POP3和IMAP服务器接收电子邮件。Python提供了poplib和imaplib模块,用于通过Python脚本接收电子邮件。
POP3代表邮局协议版本3(Post Office Protocol version 3)。此标准协议可帮助我们接收从远程服务器发送到本地计算机的电子邮件。POP3的主要优点是允许将电子邮件下载到本地计算机上,从而可以离线阅读下载的电子邮件。
POP3使用两个端口。
· 端口110:默认的不加密端口。
· 端口995:加密端口。
现在我们来看一些示例程序,首先是一个接收大量电子邮件的示例程序。创建一个脚本,命名为number_of_emails.py,并在其中添加以下代码。
1. import poplib
2. import getpass
3.
4. pop3_server = 'pop.gmail.com'
5. username = 'Emaild_address'
6. password = getpass.getpass()
7.
8. email_obj = poplib.POP3_SSL(pop3_server)
9. print(email_obj.getwelcome())
10. email_obj.user(username)
11. email_obj.pass_(password)
12. email_stat = email_obj.stat()
13. print("New arrived e-Mails are : %s (%s bytes)" % email_stat)
运行脚本程序,如下所示。
1. student@ubuntu:~$ python3 number_of_emails.py
程序输出的是邮箱中相当数量的电子邮件。
上面的示例首先导入poplib模块,该模块在Python中通过POP3安全地接收电子邮件。然后,指定了具体的电子邮件服务器和电子邮件证书,即用户名和密码。之后输出来自服务器的响应消息,并向POP3 SSL服务器提供用户名和密码。登录后,程序会收到邮箱统计信息,并在终端输出多封电子邮件。
首先,我们编写一个脚本来获取最新的电子邮件。创建一个脚本,命名为latest_email.py,并在其中添加以下代码。
1. import poplib
2. import getpass
3.
4. pop3_server = 'pop.gmail.com'
5. username = 'Emaild_address'
6. password = getpass.getpass()
7.
8. email_obj = poplib.POP3_SSL(pop3_server)
9. print(email_obj.getwelcome())
10. email_obj.user(username)
11. email_obj.pass_(password)
12.
13. print("\nLatest Mail\n")
14. latest_email = email_obj.retr(1)
15. print(latest_email[1])
运行脚本程序,如下所示。
1. student@ubuntu:~$ python3 latest_email.py
这将获取最近收到的邮件。
在上面的示例程序中,导入了Python中的poplib模块,并通过POP3安全地接收电子邮件。在给出指定的电子邮件服务器以及用户名和密码后,程序输出了来自服务器的响应消息,并向POP3 SSL服务器提供用户名和密码,然后从邮箱中获取最新的电子邮件。
然后,编写一个脚本来获取所有电子邮件。创建一个脚本all_emails.py,并在其中添加以下代码。
1. import poplib
2. import getpass
3.
4. pop3_server = 'pop.gmail.com'
5. username = 'Emaild_address'
6. password = getpass.getpass()
7.
8. email_obj = poplib.POP3_SSL(pop3_server)
9. print(email_obj.getwelcome())
10. email_obj.user(username)
11. email_obj.pass_(password)
12.
13. email_stat = email_obj.stat()
14. NumofMsgs = email_stat[0]
15. for i in range(NumofMsgs):
16. for mail in email_obj.retr(i+1)[1]:
17. print(mail)
运行脚本程序,如下所示。
1. student@ubuntu:~$ python3 latest_email.py
这将获取邮箱中所有电子邮件。
IMAP代表Internet消息访问协议(Internet Message Access Protocol),它通过本地计算机访问远程服务器上的电子邮件。IMAP允许多个客户端同时访问服务器上用户的电子邮件。当用户需要在不同客户端访问电子邮件时,更适合用IMAP完成这类操作。
IMAP使用两个端口。
· 端口143:默认的不加密端口。
· 端口993:加密端口。
现在我们来看一个使用imaplib模块的示例程序。创建一个脚本,命名为imap_email.py,并在其中添加以下代码。
1. import imaplib
2. import pprint
3. import getpass
4.
5. imap_server = 'imap.gmail.com'
6. username = 'Emaild_address'
7. password = getpass.getpass()
8.
9. imap_obj = imaplib.IMAP4_SSL(imap_server)
10. imap_obj.login(username, password)
11. imap_obj.select('Inbox')
12. temp, data_obj = imap_obj.search(None, 'ALL')
13. for data in data_obj[0].split():
14. temp, data_obj = imap_obj.fetch(data, '(RFC822)')
15. print('Message: {0}\n'.format(data))
16. pprint.pprint(data_obj[0][1])
17. break
18.
19. imap_obj.close()
运行脚本程序,如下所示。
1. student@ubuntu:~$ python3 imap_email.py
这将在指定文件夹中获取所有电子邮件。
在上面的示例程序中,首先导入了imaplib模块,该模块可以通过IMAP安全地接收电子邮件。然后,指定了电子邮件服务器和电子邮件证书,即用户名和密码。之后将该用户名和密码提供给IMAP SSL服务器。其中,在imap_obj上使用select()函数来显示收件箱中的所有邮件。然后使用for循环来逐个显示邮件消息。其中使用pprint()函数格式化对象,并将其写入数据流。最后,程序关闭了连接。
在本章中,我们学习了如何在Python脚本中编写电子邮件消息,并且了解了Python 的smtplib模块,该模块可以使用Python脚本发送和接收电子邮件。还了解了如何通过POP3和IMAP接收电子邮件。Python提供了poplib和imaplib模块,我们可以使用它们完成相关操作。
在第12章中,我们将学习Telnet和SSH。
1.什么是POP3和IMAP?
2.什么是for循环中的break和continue?举例说明。
3.什么是pprint?
4.什么是负索引,为什么要使用负索引?
5.文件扩展名pyc和py有什么区别?
6.使用循环语句生成以下文本。
1. 1010101
2. 10101
3. 101
4. 1
*请认真填写需求信息,我们会在24小时内与您取得联系。