多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] 前言 本篇总结了QQ邮箱和163邮箱发送邮件,邮件包含html中文和附件,可以发给多个收件人。 <br /> ## 一、163邮箱 1. 未设置客户端授权密码出现的报错: SMTPAuthenticationError: (550, b’User has no permission’) 该问题是由于未设置授权密码出错,具体解决办法如下: ![](https://img.kancloud.cn/e3/60/e360a06ccb27d6cd8305636b00a949ff_969x558.png) 2. 先导入smtplib库用来发送邮件,导入MIMEText库用来做纯文本的邮件模板 3. 先准备几个跟发邮件相关的参数,每个邮箱的发件服务器都不一样,以163为例,百度搜到发件服务器为:smtp.163.com ![](https://img.kancloud.cn/9d/e4/9de489a6aeecbafe3e134461acbb31b0_571x183.png) ``` import smtplib from email.mime.text import MIMEText # ---------- 1.跟发件相关的参数------------- smtpserver = "smtp.163.com" # 设置服务器 port = 25 # 端口 sender = "zjut_cheng@163.com" # 账号 pwd = "******" # 授权码,注意不是邮箱登录密码,是上述设置的授权密码!! receiver = "1056133525@qq.com" # 接收人 ``` 4. 接下来就是写邮件的主题和正文内容,正文这里用html格式的 5. 最后调用发件服务 ``` # ------------ 2.编辑邮件的内容------------- subject = "这个是主题163" body = '<p>这个是发送的163邮件</p>' # 定义邮件正文为html格式 msg = MIMEText(body, "html", "utf-8") msg['from'] = sender msg['to'] = "1056133525@qq.com" msg['subject'] = subject # -------------- 3.发送邮件---------------- smtp = smtplib.SMTP() smtp.connect(smtpserver) # 连服务器 smtp.login(sender, pwd) # 登录 smtp.sendmail(sender, receiver, msg.as_string()) # 发送 smtp.quit() # 关闭 ``` 6. 参考代码: ``` import smtplib from email.mime.text import MIMEText # ---------- 1.跟发件相关的参数------------- smtpserver = "smtp.163.com" # 设置服务器 port = 25 # 端口 sender = "zjut_cheng@163.com" # 账号 pwd = "********" # 授权码,注意不是邮箱登录密码,是上述设置的授权密码!! receiver = "1056133525@qq.com" # 接收人 # ------------ 2.编辑邮件的内容------------- subject = "这个是主题163" body = '<p>这个是发送的163邮件</p>' # 定义邮件正文为html格式 msg = MIMEText(body, "html", "utf-8") msg['from'] = sender msg['to'] = "1056133525@qq.com" msg['subject'] = subject # -------------- 3.发送邮件---------------- smtp = smtplib.SMTP() smtp.connect(smtpserver) # 连服务器 smtp.login(sender, pwd) # 登录 smtp.sendmail(sender, receiver, msg.as_string()) # 发送 smtp.quit() # 关闭 ``` <br /> ## 二、QQ邮件 1. QQ邮箱也需要SSL认证的 ![](https://img.kancloud.cn/d8/96/d89604789106ce55ff20eaf541ac1200_621x107.png) 2. 找到QQ邮箱授权码,打开QQ邮箱-设置-账号-POP3开启服务-开启 (如果已经开启了,不知道授权码,就点温馨提示里面的‘生成授权码’) ![](https://img.kancloud.cn/f8/e2/f8e296fe6b97840106f1809ee4f01084_1118x590.png) 3. QQ邮箱发送邮件代码,跟163有点不一样,如下图红色框框: ![](https://img.kancloud.cn/1d/a1/1da1c7333e2ed07731f0f4f7cbd17eae_483x112.png) 4. 参考代码: ``` import smtplib from email.mime.text import MIMEText # ---------- 1.跟发件相关的参数------------- smtpserver = "smtp.qq.com" # 设置服务器 port = 25 # 端口 sender = "1056133525@qq.com" # 账号 pwd = "xxxxxxx" # 授权码,注意不是邮箱登录密码,是上述设置的授权密码!! receiver = "1056133525@qq.com" # 接收人 # ------------ 2.编辑邮件的内容------------- subject = "这个主题是QQ" body = '<p>这个是发送的QQ邮件</p>' # 定义邮件正文为html格式 msg = MIMEText(body, "html", "utf-8") msg['from'] = sender msg['to'] = "1056133525@qq.com" msg['subject'] = subject # -------------- 3.发送邮件---------------- smtp = smtplib.SMTP_SSL(smtpserver, port) smtp.login(sender, pwd) # 登录 smtp.sendmail(sender, receiver, msg.as_string()) # 发送 smtp.quit() # 关闭 ``` <br /> ## 三、兼容163和QQ邮箱 1. 如果想兼容上面两种方式发送邮件,只需把第三块内容稍微改下,如下所示 ``` # -------------- 3.发送邮件---------------- try: smtp = smtplib.SMTP() smtp.connect(smtpserver) # 连服务器 smtp.login(sender, pwd) # 登录 except: smtp = smtplib.SMTP_SSL(smtpserver, port) smtp.login(sender, pwd) # 登录 smtp.sendmail(sender, receiver, msg.as_string()) # 发送 smtp.quit() ``` <br /> ## 四、发送带附件 1. 上面的MIMEText只能发送正文,无法带附件,发送带附件的需要导入另外一个模块MIMEMultipart 2. 先读取要发送文件的内容,file\_path是路径的参数名 3. 下图红色框框file\_name参数是发送的附件重新命名 ![](https://img.kancloud.cn/3a/63/3a637e4a478dfeab415f2f1009e75917_734x394.png) 4. 参考代码: ``` import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart # ----------1.跟发件相关的参数------ # ---------- 1.跟发件相关的参数------------- smtpserver = "smtp.163.com" # 设置服务器 port = 25 # 端口 sender = "zjut_cheng@163.com" # 账号 pwd = "******" # 授权码,注意不是邮箱登录密码,是上述设置的授权密码!! receiver = "1056133525@qq.com" # 接收人 # ----------2.编辑邮件的内容------ # 读文件 file_path = "python01.py" with open(file_path, "rb") as fp: mail_body = fp.read() msg = MIMEMultipart() msg["from"] = sender # 发件人 msg["to"] = receiver # 收件人 msg["subject"] = "这个我的主题" # 主题 # 正文 body = MIMEText(mail_body, "html", "utf-8") msg.attach(body) # 附件 att = MIMEText(mail_body, "base64", "utf-8") att["Content-Type"] = "application/octet-stream" att["Content-Disposition"] = 'attachment; filename="test_report.html"' msg.attach(att) # ----------3.发送邮件------ try: smtp = smtplib.SMTP() smtp.connect(smtpserver) # 连服务器 smtp.login(sender, pwd) except: smtp = smtplib.SMTP_SSL(smtpserver, port) smtp.login(sender, pwd) # 登录 smtp.sendmail(sender, receiver, msg.as_string()) # 发送 smtp.quit() ``` <br /> ## 五、发给多个收件人 1. 上面都是发给一个收件人,那么如何一次发给多个收件人呢?只需改两个小地方 2. 把receiver参数改成list对象,单个多个都是可以收到的 3. msg\["to"\]这个参数不能用list了,得先把receiver参数转化成字符串,如下图所示 ![](https://img.kancloud.cn/dc/17/dc17053e61e7cdf432728eac07705b6a_726x285.png) <br /> ## 六:邮件收不到的几种原因: 1. Subject和正文内容不要用hello、hehe、test等单词 2. from(发件人)和to(收件人)不要为空,   (要不然会被认为是垃圾邮件) 3. 找不到的话,先看下垃圾信箱,是不是跑到垃圾箱了 4. 如果前几次可以收到,后来收不到了,需改下subject内容   (因为每次都是一个subject,系统也会拒收的,把subject内容设置为动态的是最好的) 5. 部分邮箱是ssl加密了的,所以无法发送,如:qq邮箱 (用授权码去登录)