本文来源:https://www.cnblogs.com/yangguanghuayu/p/11778610.html
本文来源:https://www.cnblogs.com/insane-Mr-Li/p/10071803.html
一、说明
python发送邮件:
python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。
smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。
email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。
二、smtplib模块
import smtplib server = smtplib.SMTP(smtp_server, 25) server.login(from_addr, password) server.sendmail(from_addr, [to_addr], msg.as_string()) server.quit()
login()
方法用来登录SMTP服务器,
sendmail()
方法就是发邮件,由于可以一次发给多个人,所以传入一个list
,
邮件正文是一个str
,as_string()
把MIMEText
对象变成str
。
quit():用于结束SMTP会话。
三、email模块
3.1 模块说明
email模块下有mime包,mime英文全称为“Multipurpose Internet Mail Extensions”,即多用途互联网邮件扩展,是目前互联网电子邮件普遍遵循的邮件技术规范。
该mime包下常用的有三个模块:text,image,multpart。
构造一个邮件对象就是一个Message
对象,
如果构造一个MIMEText
对象,就表示一个文本邮件对象,
如果构造一个MIMEImage
对象,就表示一个作为附件的图片,
要把多个对象组合起来,就用MIMEMultipart
对象,
而MIMEBase
可以表示任何对象。它们的继承关系如下:
Message +- MIMEBase +- MIMEMultipart +- MIMENonMultipart +- MIMEMessage +- MIMEText +- MIMEImage
3.2 text说明
邮件发送程序为了防止有些邮件阅读软件不能显示处理HTML格式的数据,通常都会用两类型分别为"text/plain"和"text/html"
构造MIMEText对象时,第一个参数是邮件正文,第二个参数是MIME的subtype,最后一定要用utf-8编码保证多语言兼容性。
3.3 multpart说明
常见的multipart类型有三种:multipart/alternative, multipart/related和multipart/mixed。
邮件类型为"multipart/alternative"的邮件包括纯文本正文(text/plain)和超文本正文(text/html)。
邮件类型为"multipart/related"的邮件正文中包括图片,声音等内嵌资源。
邮件类型为"multipart/mixed"的邮件包含附件。向上兼容,如果一个邮件有纯文本正文,超文本正文,内嵌资源,附件,则选择mixed类型。
无脑用mix就对了。
我们必须把Subject,From,To,Cc,Date添加到MIMEText对象或者MIMEMultipart对象中,邮件中才会显示主题,发件人,收件人,抄送人,时间(若无时间,就默认一般为当前时间,该值一般不设置)。
from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage msg = MIMEMultipart('mixed') msg['Subject'] = 'Python email test' msg['From'] = 'XXX@163.com <XXX@163.com>' msg['To'] = 'XXX@126.com' msg['Cc'] = 'XXX@qq.com' msg['Date']='2012-3-16'
msg.attach(MIMEText对象或MIMEImage对象):
将MIMEText对象或MIMEImage对象添加到MIMEMultipart对象中。
MIMEMultipart对象代表邮件本身,MIMEText对象或MIMEImage对象代表邮件正文。
以上的构造的文本,超文本,附件,图片都何以添加到MIMEMultipart('mixed')中:
msg.attach(text_plain)
msg.attach(text_html)
msg.attach(text_att)
msg.attach(image)
3.4 代码展示
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.header import Header def send_mail(email_subject, file_path, new_name, to_add): # 设置smtplib所需的参数 server = 'smtp.163.net' s_smtp = smtplib.SMTP(server, 25) s_smtp.connect(server) s_smtp.login('xxx163.com', '123456789') # 构造邮件对象MIMEMultipart对象 from_add = 'xxx163.com' cc_add = ['xxx163.com', 'xxxx@qq.ocm'] msg = MIMEMultipart('mixed') msg['Subject'] = email_subject msg['From'] = from_add msg['To'] = ','.join(to_add) msg['Cc'] = ','.join(cc_add) # msg['Date'] = '2020-03-05' sent_html_text(msg) sent_plain_text(msg) # plain形式必须放在html形式之后,否则不显示 sent_picture(msg) sent_insert_picture(msg) sent_attachment(msg, file_path, new_name) s_smtp.sendmail(from_add, msg['to'].split(',') + msg['Cc'].split(','), str(msg)) print('{},发送完成'.format(file_path)) s_smtp.quit() def sent_html_text(msg): # 构造文字内容 text_1 = '''<font style="font-family:宋体">宋体</font><br />''' text_2 = '''<font color="#0000dd">浅蓝色</font><br />''' text_3 = """<font size="7">7号字体</font><br />""" text_4 = """<i>这是斜体文字</i><br />""" text_5 = """<b>这是粗体文字</b><br />""" text_6 = """<font style="font-family:宋体", color="#0000dd", size="7"><i><b>宋体,浅蓝色,7号字体,斜体,粗体</font></i><b><br />""" text = text_1 + text_2+text_3+text_4+text_5+text_6 text_html = MIMEText(text, "html", "utf-8") msg.attach(text_html) def sent_plain_text(msg): # 构造文字内容 text = '这是测试文字 换一行试试' text_plain = MIMEText(text, "plain", "utf-8") msg.attach(text_plain) def sent_picture(msg): # 构造图片对象 sendimagefile = open(r'E:测试ceshiexcel.png', 'rb').read() image = MIMEImage(sendimagefile) image.add_header('Content-ID', '<image1>') # 对图片重命名 image["Content-Disposition"] = 'attachment; filename="testimage.png"' msg.attach(image) def sent_insert_picture(msg): # 以内嵌的方式将图片插入 images = ['x.png', 'y.png', 'z.png'] mail_msg = '' for i in range(len(images)): mail_msg += '<p><img src="cid:image%d" height="1000" width="1300"></p>' % (i + 1) msg.attach(MIMEText( mail_msg, 'html', 'utf-8')) for i, img_name in enumerate(images): with open(img_name, 'rb') as fp: img_data = fp.read() msg_image = MIMEImage(img_data) msg_image.add_header('Content-ID', '<image%d>' % (i + 1)) msg.attach(msg_image) def sent_attachment(msg, file_path, new_name): # 构造附件 sendfile = open(file_path, 'rb').read() att = MIMEText(sendfile, 'base64', 'utf-8') att["Content-Type"] = 'application/octet-stream' # 以下附件可以重命名,命名必须是英文字母和数字等,不能出现汉字 att["Content-Disposition"] = 'attachment; filename={new_name}'.format(new_name=new_name) msg.attach(att) if __name__ == '__main__': email_subject = '测试文件' file_path = r'E:测试我是测试文件.xlsx' new_name = 'ceshi.xlsx' to_add = ['xxx@qq.com', 'xxx@163.com', 'xxx@163.com'] send_mail(email_subject, file_path, new_name, to_add)
3.5 字体效果展示