一.使用smtplib简单邮件发送
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 用户密码等变量
sender = '****@163.com'
reciver = '****@qq.com'
subject = 'test for python'
smtpserver = 'smtp.163.com'
username = '****@163.com'
password = '****'
# 构造邮件内容
msg = MIMEText('hello python') # 默认text格式
msg['Subject'] = Header(subject, 'utf-8')
msg['From'] = sender
msg['To'] = reciver
# 登录并发送邮件
smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(username, password)
smtp.sendmail(sender, reciver, msg.as_string())
smtp.quit()
说下几个需注意的坑:
1.如果是用到163了qq了这些邮箱,需要先登录邮箱,开通smtp/pop3服务,并开通授权码,这个授权码就是这里用到的密码,而不是你真正的登录密码
2.msg['From']:这里指的是邮件地址栏发件人显示的,如果发件人收件人都是一个类型邮箱,比如都是163,则这里from可以不和sender一致,你可以任意发挥,比如直接写上你的中文昵称,这样写,收件人则无法直接回复邮件;如果发件人和收件人是不同邮箱,比如163发送qq邮箱,则From和sendmail方法里的(from)必须一致,否则会报554错误
3.msg['to']同理,如果同一个类型邮箱,可以留空,即msg['to']='',实现密送的功能
4.自定义发件人,收件人格式,使用email.utils.formataddr格式化收件人,发件人
#msg['From']='飞鱼' #自定义发送人显示
#msg['to']='',#留空,即收件人地址栏显示空,实现密送功能
import email.utils
msg['From'] = email.utils.formataddr(('飞鱼2008','****@163.com'))
#实际显示为:飞鱼2008<****@163.com>,收件人可以回复邮件解析addr
#email.utils.parseaddr('feiyu1009 <feiyu1000=163.com>')
#发送给多个收件人,收件人邮件必须为列表,如receiver=['***@163.com','***@163.com']
二。发送html格式邮件
#其他保持不变,可以从模板直接读取html文件
with open('templtae.html',encoding='utf-8') as f:
html_string=f.read()
msg = MIMEText(html_string,'html','utf-8') #html格式
三。发送包含图片邮件
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.image import MIMEImage
#...省略
msg = MIMEMultipart('related') #必须是related
# res.html文件的img标记 <img src="cid:image1">
with open('res.html',encoding='utf-8') as f:
html_string=f.read()
msgText = MIMEText(html_string, _subtype='html',_charset='utf-8')
msg.attach(msgText)
file = open("ttt.png", "rb")
img_data = file.read()
file.close()
img = MIMEImage(img_data)
img.add_header('Content-ID', 'image1') #需要和html文件的cid:image1相同
msg.attach(img)
测试包含图片的时候,一直报错,报554,后来发现不同类型邮箱之间发送,比如163发qq会有问题,如果是163发163就ok
四。发送包含附件邮件
part = MIMEApplication(open('data.xlsx', 'rb').read())
part.add_header('Content-Disposition', 'attachment', filename="data.xlsx")
msg.attach(part)
五。惊喜总在最后面yagmail
如果只是简单发送邮件,那么yagamail库绝对是首选,不用smtplib那么繁琐
import yagmail
yag=yagmail.SMTP(user=sender,password=password,host=smtpserver) #port=25,smtp_ssl=False,默认是ssl模式,如果要设置为false,则端口要是用25
contents=['test yagmail from ygamil','ttt.png'] # ttt发送附件,也可以发送html格式
yag.send(reciver,'yagmail',contents=contents)
网友评论