一、概述
python
提供了两个包来提供SMTP
邮件服务支持:smtplib
和 email
,前者系统内置,后者需要通过pip
或者其他方式手动安装。其中smtplib
提供邮件发送功能,email
负责邮件内容的构造。
二、smtplib库介绍
2.1 创建一个smtp连接对象
1 |
smtplib.SMTP(host, port) # host是服务器地址,port是端口,连接成功将会返回一个stmp对象 |
或者
1 2 |
smtpObj = smtplib.SMTP() # 创建一个空的smtp对象 smtpObj.connect(host, port) # 连接服务 |
2.2 登录到smtp服务器
1 |
smtpObj.login(username, password) # username是邮箱用户名,password是密码。 |
2.3 发送邮件
1 |
smtpObj.sendmail(from_addr, to_addrs, msg) # from_addr是发件人,to_addr是收件人,msg是要发送的消息 |
发件人地址是一个列表,可以有多个收件人。
2.4 关闭邮箱对象
1 |
smtpObj.quit() |
三、email库介绍
2.1 构造一封邮件
1 2 |
from email.mime.text import MIMEText conent = MIMEText("HelloWorld", "plain", "utf-8") # 构造一个文本类型的邮件对象 |
第一个参数是邮件的正文内容,第二个参数是文件的类型,plain
表示普通文本,第三个参数是编码格式,默认ascii编码。
如果需要发送html
格式的邮件,需要把第二个参数设置为html
,然后正文部分放传入网页的内容 。
2.2 设置收、发件人以及邮件主题
1 2 3 |
content["From"] = "abc@qq.com" # 收件人 content["to"] = "bcd@qq.com" # 发件人 content["Subject"] = "HelloWorld" # 主题 |
如果含有中文,需要这样设置:
1 2 |
from email.header import Header content["From"] = Header(MAIL_USER, "utf-8") # 设置编码 |
2.3 添加附件
1 2 3 4 5 6 |
from email.mime.multipart import MIMEMultipart content = MIMEMultipart() # 构造一个包含多个部分(文本内容+附件内容)的邮件 file_part = MIMEText(open("test.txt", "r").read(), "base64", "utf-8") file_part["Content-Type"] = "application/octet-stream" file_part["Content-Disposition"] = "attachment; filename="test.txt"" # text.txt是附件的名字 content.attach(file_part) |
四、一封最简单的SMTP邮件
准备好一个SMTP服务器和邮箱帐号(没有的话可以利用163、QQ等第三方公司的),发送一封最简单的邮件:
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 |
# -*- encoding:utf8 -*- import smtplib from email.mime.text import MIMEText from email.header import Header MAIL_SERVER = "****@**.com" # smtp服务器地址 MAIL_PORT = 25 # smtp服务端口,一般为25 MAIL_USER = "****@**.com" # 邮箱帐号 MAIL_PASS = "******" # 邮箱密码 def send_normal_mail(): try: mail_clients = ["maqian@dyxmq.cn"] msg = MIMEText("Hello QQ Mail", "plain", "utf-8") smtpObj = smtplib.SMTP(MAIL_SERVER, MAIL_PORT) smtpObj.login(MAIL_USER, MAIL_PASS) smtpObj.sendmail(MAIL_USER, mail_clients, msg.as_string()) print "Send Mail To", mail_clients, "Success!" except Exception as e: print "Send Mail error:", e if __name__ == "__main__": send_normal_mail() |
如果各项参数没有设置错误的话邮件就会发送成功了,但是由于我们没有填写任何其他信息,邮件的收件人和主题都是空的:
五、使用QQ邮箱发送邮件
1. 获取QQ邮箱授权码
由于QQ邮箱的设置,登录第三方邮箱时不能直接使用QQ密码登录,需要申请一个授权码用来给第三方客户端登陆。
授权码的获取:
拿到授权码后,就可以使用qq邮箱帐号和授权码在第三方客户端登录了。
2. 使用QQ邮箱发送邮件
使用上面的代码,把所有的邮箱信息替换成QQ邮箱的,然后发送邮件。
1 2 3 4 5 |
MAIL_SERVER = "smtp.qq.com" MAIL_PORT = 25 MAIL_USER = "*********@QQ.COM" MAIL_PASS = "*******" # 填入授权码不是QQ密码 |
结果会报错:
1 |
Send Mail error: (530, "Error: A secure connection is requiered(such as ssl). More information at https://service.mail.qq.com/cgi-bin/help?id=28") |
出现这个问题的原因是QQ邮箱使用了SSL
加密传输,不能直接使用上面的方式发送邮件,要把smtp
对象的创建方式改为:
1 |
smtplib.SMTP_SSL(MAIL_SERVER, MAIL_PORT) |
现在对上面的代码进行修改,添加上发件人和收件人信息,并修改SMTP
端口为465
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import smtplib from email.mime.text import MIMEText from email.header import Header from email.mime.multipart import MIMEMultipart MAIL_SERVER = "smtp.qq.com" MAIL_PORT = 465 # SSL的端口是465 MAIL_USER = "785271053@QQ.COM" MAIL_PASS = "*******" def send_normal_mail(): try: mail_clients = ["maqian@dyxmq.cn"] msg = MIMEText("Hello QQ Mail", "plain", "utf-8") msg["From"] = MAIL_USER # 显示的发件人 msg["To"] = ", ".join(mail_clients) # 显示的收件人 msg["Subject"] = "QQ MAIL TEST" # 显示的主题 smtpObj = smtplib.SMTP_SSL(MAIL_SERVER, MAIL_PORT) smtpObj.login(MAIL_USER, MAIL_PASS) smtpObj.sendmail(MAIL_USER, mail_clients, msg.as_string()) print "Send Mail To", mail_clients, "Success!" except Exception as e: print "Send Mail error:", e |
发送成功:
3. 发送html格式邮件并携带附件
先创建一个test.txt
文件,写入数据HelloWorld
,在邮件中把它发出去。
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# -*- encoding:utf8 -*- import smtplib from email.mime.text import MIMEText from email.header import Header from email.mime.multipart import MIMEMultipart MAIL_SERVER = "smtp.qq.com" MAIL_PORT = 465 MAIL_USER = "785271053@QQ.COM" MAIL_PASS = "******" def get_html_attach(): """ 生成邮件的html页面部分 :return: MIMEText对象 """ html = "<head><p><a href=https://www.dyxmq.cn>HelloWorld</a></p></head>" return MIMEText(html, "html", "utf-8") def get_file_attach(): """ 生成邮件的附件部分 :return: MIMIText对象 """ file = MIMEText(open("test.txt", "r").read(), "base64", "utf-8") # 读取文件 file["Content-Type"] = "application/octet-stream" file["Content-Disposition"] = "attachment; filename="test.txt"" return file def send_mail(): try: mail_clients = ["maqian@dyxmq.cn"] msg = MIMEMultipart() # 添加邮件内容 # 添加邮件头 msg["From"] = MAIL_USER msg["To"] = ", ".join(mail_clients) msg["Subject"] = "QQ MAIL TEST" # 添加正文和文件 msg.attach(get_html_attach()) msg.attach(get_file_attach()) #发送邮件 smtpObj = smtplib.SMTP_SSL(MAIL_SERVER, MAIL_PORT) smtpObj.login(MAIL_USER, MAIL_PASS) smtpObj.sendmail(MAIL_USER, mail_clients, msg.as_string()) print "Send Mail To", mail_clients, "Success!" except Exception as e: print "Send Mail error:", e if __name__ == "__main__": send_mail() |
邮件:
评论