python初级实战-----关于邮件发送问题
python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。
smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。
email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。
1.smtplib模块
smtplib使用较为简单。以下是最基本的语法。
导入及使用方法如下:
import smtplib smtp = smtplib.SMTP() smtp.connect('smtp.163.com,25') smtp.login(username, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit()
说明:
1)smtplib.SMTP():实例化SMTP()
2)smtp.connect(host,port): host:指定连接的邮箱服务器。常用邮箱的smtp服务器地址如下:
新浪邮箱:smtp.sina.com,新浪VIP:smtp.vip.sina.com,搜狐邮箱:smtp.sohu.com,126邮箱:smtp.126.com,139邮箱:smtp.139.com,163网易邮箱:smtp.163.com。
port:指定连接服务器的端口号,默认为25.
3)smtp.login(user,password):
user:登录邮箱的用户名。password:登录邮箱的密码,需要在网页版的网易邮箱中设置授权码,该授权码即为客户端密码。
4)sendmail(from_addr,to_addrs,msg,…):
from_addr:邮件发送者地址; to_addrs:邮件接收者地址。字符串列表[‘接收地址1′,’接收地址2′,’接收地址3′,…]或’接收地址’
5)msg:发送消息:邮件内容。一般是msg.as_string():as_string()是将msg(MIMEText对象或者MIMEMultipart对象)变为str。
6)quit():用于结束SMTP会话。
2.email模块
email模块下有mime包,mime英文全称为“Multipurpose Internet Mail Extensions”,即多用途互联网邮件扩展,是目前互联网电子邮件普遍遵循的邮件技术规范。
该mime包下常用的有三个模块:text,image,multpart。
导入方法如下:
from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage
构造一个邮件对象就是一个Message
对象,如果构造一个MIMEText
对象,就表示一个文本邮件对象,如果构造一个MIMEImage
对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart
对象,而MIMEBase
可以表示任何对象。它们的继承关系如下:
Message
+- MIMEBase #表示任何对象
+- MIMEMultipart
+- MIMENonMultipart #把多个对象组合起来
+- MIMEMessage
+- MIMEText #文本
+- MIMEImage #作为附件的图片
2.1 multpart说明
常见的multipart类型有三种:multipart/alternative, multipart/related和multipart/mixed。
邮件类型为”multipart/alternative”的邮件包括纯文本正文(text/plain)和超文本正文(text/html)。
邮件类型为”multipart/related”的邮件正文中包括图片,声音等内嵌资源。
邮件类型为”multipart/mixed”的邮件包含附件。向上兼容,如果一个邮件有纯文本正文,超文本正文,内嵌资源,附件,则选择mixed类型。
msg = MIMEMultipart('mixed')
我们必须把Subject,From,To添加到MIMEText对象或者MIMEMultipart对象中,邮件中才会显示主题,发件人,收件人。
msg = MIMEMultipart('mixed') msg['Subject'] = '这是一个标题' msg['From'] = 'XXX@163.com <XXX@163.com>' msg['To'] = 'XXX@126.com'
2.2 发送文本邮件
2.2 发送文本邮件
邮件发送程序为了防止有些邮件阅读软件不能显示处理HTML格式的数据,通常都会用两类型分别为”text/plain”和”text/html”
构造MIMEText对象时,第一个参数是邮件正文,第二个参数是MIME的subtype,最后一定要用utf-8编码保证多语言兼容性。
以上的构造的文本添加到MIMEMultipart(‘mixed’)中
创建一个普通文本:
text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.baidu.com" text_plain = MIMEText(text, 'plain', 'utf-8') msg.attach(text_plain)
仅发送文本邮件:
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # 设置smtplib所需的参数 smtpserver = 'smtp.163.com' username = 'liujinyuan1993@163.com' password = 'xiafei521' sender = 'liujinyuan1993@163.com' receiver=['1129719492@qq.com'] # 收件人为多个收件人 #receiver = ['1129719492@qq.com', 'ljy@dareway.com.cn'] # 构造邮件对象MIMEMultipart对象 msg = MIMEMultipart('mixed') msg['Subject'] = '这个是邮件主题' msg['From'] = 'liujinyuan1993@163.com <liujinyuan1993@163.com>' msg['To'] = '1129719492@qq.com' # 收件人为多个收件人,通过join将列表转换为以;为间隔的字符串 #msg['To'] = ";".join(receiver) # 构造文字内容 text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.baidu.com" text_plain = MIMEText(text, 'plain', 'utf-8') msg.attach(text_plain) # 调用smtplib模块发送邮件 smtp = smtplib.SMTP() smtp.connect('smtp.163.com') smtp.login(username, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit()
2.3 发送超文本附件
内容格式:
html = """ <html> <body> <p> Here is the <a href="http://www.sohu.com">link</a> you wanted. </p> </body> </html> """ text_html = MIMEText(html,'html', 'utf-8') text_html["Content-Disposition"] = 'attachment; filename="baidu.html"' msg.attach(text_html)
2.4 发送图片
添加图片:
# 构造图片链接 sendimagefile = open(r'D:\0.jpg', 'rb').read() image = MIMEImage(sendimagefile) image.add_header('Content-ID', '<image1>') image["Content-Disposition"] = 'attachment; filename="testimage.png"' msg.attach(image)
仅发送图片附件:
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage # 设置smtplib所需的参数 smtpserver = 'smtp.163.com' username = 'liujinyuan1993@163.com' password = 'xiafei521' sender = 'liujinyuan1993@163.com' receiver=['1129719492@qq.com'] # 收件人为多个收件人 #receiver = ['1129719492@qq.com', 'ljy@dareway.com.cn'] # 构造邮件对象MIMEMultipart对象 msg = MIMEMultipart('mixed') msg['Subject'] = '这个是邮件主题' msg['From'] = 'liujinyuan1993@163.com <liujinyuan1993@163.com>' msg['To'] = '1129719492@qq.com' # 收件人为多个收件人,通过join将列表转换为以;为间隔的字符串 #msg['To'] = ";".join(receiver) # 构造图片链接 sendimagefile = open(r'D:\0.jpg', 'rb').read() image = MIMEImage(sendimagefile) image.add_header('Content-ID', '<image1>') image["Content-Disposition"] = 'attachment; filename="testimage.png"' msg.attach(image) # 调用smtplib模块发送邮件 smtp = smtplib.SMTP() smtp.connect('smtp.163.com') smtp.login(username, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit()
2.5发送附件
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage # 设置smtplib所需的参数 smtpserver = 'smtp.163.com' username = 'liujinyuan1993@163.com' password = 'xiafei521' sender = 'liujinyuan1993@163.com' receiver = ['1129719492@qq.com', 'ljy@dareway.com.cn'] # 构造邮件对象MIMEMultipart对象 msg = MIMEMultipart('mixed') msg['Subject'] = '一个附件' msg['From'] = 'liujinyuan1993@163.com <liujinyuan1993@163.com>' msg['To'] = ";".join(receiver) # 构造附件 sendfile = open(r'D:\111.txt', 'rb').read() text_att = MIMEText(sendfile, 'base64', 'utf-8') text_att["Content-Type"] = 'application/octet-stream' # 以下附件可以重命名成aaa.txt text_att["Content-Disposition"] = 'attachment; filename="aaa.txt"' msg.attach(text_att) # 发送邮件 smtp = smtplib.SMTP() smtp.connect('smtp.163.com') smtp.login(username, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit()
2.6 文字,html,图片,附件实现实例
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage # 设置smtplib所需的参数 smtpserver = 'smtp.163.com' username = 'liujinyuan1993@163.com' password = 'xiafei520' sender = 'liujinyuan1993@163.com' receiver = ['1129719492@qq.com', 'ljy@dareway.com.cn'] # 构造邮件对象MIMEMultipart对象 msg = MIMEMultipart('mixed') msg['Subject'] = '一个测试邮件' msg['From'] = 'liujinyuan1993@163.com <liujinyuan1993@163.com>' msg['To'] = ";".join(receiver) # 构造文字内容 text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.baidu.com" text_plain = MIMEText(text, 'plain', 'utf-8') msg.attach(text_plain) # 构造图片链接 sendimagefile = open(r'D:\0.jpg', 'rb').read() image = MIMEImage(sendimagefile) image.add_header('Content-ID', '<image1>') image["Content-Disposition"] = 'attachment; filename="testimage.png"' msg.attach(image) # 构造html html = """ <html> <head></head> <body> <p>Hi!<br> How are you?<br> Here is the <a href="http://www.baidu.com">link</a> you wanted.<br> </p> </body> </html> """ text_html = MIMEText(html, 'html', 'utf-8') text_html["Content-Disposition"] = 'attachment; filename="texthtml.html"' msg.attach(text_html) # 构造附件 sendfile = open(r'D:\111.txt', 'rb').read() text_att = MIMEText(sendfile, 'base64', 'utf-8') text_att["Content-Type"] = 'application/octet-stream' # 以下附件可以重命名成aaa.txt text_att["Content-Disposition"] = 'attachment; filename="aaa.txt"' msg.attach(text_att) # 发送邮件 try: smtp = smtplib.SMTP() smtp.connect('smtp.163.com') smtp.login(username, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit() print("邮件发送成功") except smtplib.SMTPException: print("Error: 无法发送邮件")