3.13 练习题4:邮件发送(smtp)

3.13 练习题4:邮件发送(smtp)

前言
本篇总结了QQ邮箱和163邮箱发送邮件,邮件包含html中文和附件,可以发给多个收件人,专治各种不行,总之看完这篇麻麻再也不用担心我的邮件收不到了。
以下代码兼容python2和python3,运行无异常,放心大胆食用。
 
一、163邮箱
1.先导入smtplib库用来发送邮件,导入MIMEText库用来做纯文本的邮件模板
2.先准备几个跟发邮件相关的参数,每个邮箱的发件服务器都不一样,以163为例,百度搜到发件服务器为:smtp.163.com

3.接下来就是写邮件的主题和正文内容,正文这里用html格式的
4.最后调用SMTP发件服务

5.参考代码:

复制代码
# coding:utf-8
import smtplib
from email.mime.text import MIMEText
# ----------1.跟发件相关的参数------ smtpserver = "smtp.163.com"            # 发件服务器 port = 0                                            # 端口 sender = "yoyo@163.com"                # 账号 psw = "**************"                         # 密码 receiver = "283340479@qq.com"        # 接收人

# ----------2.编辑邮件的内容------ subject = "这个是主题163" body = '<p>这个是发送的163邮件</p># 定义邮件正文为html格式 msg = MIMEText(body, "html", "utf-8") msg['from'] = sender msg['to'] = "283340479@qq.com" msg['subject'] = subject
# ----------3.发送邮件------ smtp = smtplib.SMTP() smtp.connect(smtpserver)                                  # 连服务器 smtp.login(sender, psw)                                     # 登录 smtp.sendmail(sender, receiver, msg.as_string())  # 发送 smtp.quit()                                                         # 关闭
复制代码

二、QQ邮件

1.QQ邮箱是需要SSL认证的,这种邮箱跟上面的就有点不一样了。

2.找到QQ邮箱授权码,打开QQ邮箱-设置-账号-POP3开启服务-开启
(如果已经开启了,不知道授权码,就点温馨提示里面的‘生成授权码’)

 

 3.发验证短信获取授权码,照着提示发个短信,如何点我已发送,就会收到授权码了。

4.收到授权码后复制,保存下来,这个就可以当QQ邮箱的密码了。

 

 

 5.QQ邮箱发送邮件代码,跟163有点不一样,如下图红色框框:

6.参考代码:

复制代码
# coding:utf-8
import smtplib
from email.mime.text import MIMEText
# ----------1.跟发件相关的参数------ # smtpserver = "smtp.163.com"         # 发件服务器 smtpserver = "smtp.qq.com" port = 465                                        # 端口 sender = "283340479@qq.com"         # 账号 psw = "**************"                         # 密码 receiver = "283340479@qq.com"        # 接收人

# ----------2.编辑邮件的内容------ subject = "这个是主题QQ" body = '<p>这个是发送的QQ邮件</p>'     # 定义邮件正文为html格式 msg = MIMEText(body, "html", "utf-8") msg['from'] = sender msg['to'] = "283340479@qq.com" msg['subject'] = subject
# ----------3.发送邮件------ # smtp = smtplib.SMTP() # smtp.connect(smtpserver)                                 # 连服务器 smtp = smtplib.SMTP_SSL(smtpserver, port) smtp.login(sender, psw)                                      # 登录 smtp.sendmail(sender, receiver, msg.as_string())  # 发送 smtp.quit()                                                        # 关闭
复制代码

三、兼容163和QQ邮箱
1.如果想兼容上面两种方式发送邮件,只需把第三块内容稍微改下,如下所示

四、发送带附件
1.上面的MIMEText只能发送正文,无法带附件,发送带附件的需要导入另外一个模块MIMEMultipart
2.先读取要发送文件的内容,file_path是路径的参数名
3.下图红色框框file_name参数是发送的附件重新命名

4.参考代码:

复制代码
# coding:utf-8
import smtplib
from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart
# ----------1.跟发件相关的参数------ smtpserver = "smtp.163.com"           # 发件服务器 port = 0                                           # 端口 sender = "yoyo@163.com"               # 账号 psw = "***********"                             # 密码 receiver = "283340479@qq.com"        # 接收人

# ----------2.编辑邮件的内容------ # 读文件 file_path = "result.html" 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, psw) except:     smtp = smtplib.SMTP_SSL(smtpserver, port)     smtp.login(sender, psw)                       # 登录 smtp.sendmail(sender, receiver, msg.as_string())  # 发送 smtp.quit()    
复制代码

5.最后结果,有图有真相

五、发给多个收件人
1.上面都是发给一个收件人,那么如何一次发给多个收件人呢?只需改两个小地方
2.把receiver参数改成list对象,单个多个都是可以收到的
3.msg["to"]这个参数不能用list了,得先把receiver参数转化成字符串,如下图所示

4.参考代码:

复制代码
# coding:utf-8
import smtplib
from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart
# ----------1.跟发件相关的参数------ smtpserver = "smtp.163.com"           # 发件服务器 port = 0                              # 端口 sender = "yoyo@163.com"     # 账号 psw = "*********"                  # 密码 # receiver = ["xxxx@qq.com"]      # 单个接收人也可以是list receiver = ["xxxx@qq.com", "yoyo@qq.com"]   # 多个收件人list对象

# ----------2.编辑邮件的内容------ # 读文件 file_path = "result.html" with open(file_path, "rb") as fp:     mail_body = fp.read() msg = MIMEMultipart() msg["from"] = sender                       # 发件人 msg["to"] = ";".join(receiver)             # 多个收件人list转str msg["subject"] = "这个我的主题999"              # 主题 # 正文 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, psw) except:     smtp = smtplib.SMTP_SSL(smtpserver, port)     smtp.login(sender, psw)                       # 登录 smtp.sendmail(sender, receiver, msg.as_string())  # 发送 smtp.quit()                                       # 关闭
复制代码

六:邮件收不到的几种原因:
1.Subject和正文内容不要用hello、hehe、test等单词
2.from(发件人)和to(收件人)不要为空,
  (要不然会被认为是垃圾邮件)
3.找不到的话,先看下垃圾信箱,是不是跑到垃圾箱了
4.如果前几次可以收到,后来收不到了,需改下subject内容
  (因为每次都是一个subject,系统也会拒收的,把subject内容设置为动态的是最好的)
5.部分邮箱是ssl加密了的,所以无法发送,如:qq邮箱
(用授权码去登录)
6.要是按照上面的步骤来报错了,说明代码抄错了,多检查几次。

(以上代码均在python2和python3上都测试通过了)

转载于:https://www.cnblogs.com/lunvo/p/9184168.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值