用python群发邮件(可带附件)

本次,我们发邮件用到的Python库是smtplibemail。

smtplib库主要是用于负责和邮件服务器进行通讯

email库则主要用于规定编写邮件的头、主体、内容、附件等


发邮件之前我们需要用Python登录smtp服务器,这样才能有发送权限,所以,我们需要去邮箱手动开启smtp服务,然后记住服务器授权码(授权码意思是,你可以不用我的网页邮箱或者邮箱app登录,你可以用邮箱账号+授权码在后台来获取邮箱服务器的内容)

由于本次我们用QQ邮箱发送,你也可以用网易邮箱或者其他邮箱发送,原理都是类似~

如何开启QQ邮箱smtp服务器和获取授权码:详见此链接


下面是我抄写原作者代码并加了点自己的理解:

主要是:

1.修改附件类型时,需要在设置MIMEBase时修改一下类型

比如传word时修改为:

with open(r'cat.docx','rb') as f:
    mime=MIMEBase("file","docx",filename='test.docx')
    #加上必要的头信息
    mime.add_header('Content-Disposition','attachment',filename='test.docx')

2.搞明白了为啥不管是图片还是文档都需要base64编码 

因为s.sendmail(sender,to,msg.as_string())这里msg必须是可以用ascii解码的字符串

假如没有这一步

就会是utf-8编码的,ascii无法进行编码,会报错


python代码:

# -*- coding: utf-8 -*-
"""
利用邮箱的授权码
基于此邮箱给其他邮件地址发email
ps:添加附件类型变化时,第29-32行要做相应修改
"""
import smtplib
from email import encoders
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
#发件人邮箱
sender="[email protected]"
#服务器授权码
password="your keys"
#服务器地址,这里是QQsmtp服务器
mail_host='smtp.qq.com'
#收件人地址,可填写多个
receivers=['[email protected]','[email protected]']
#设置email信息
msg=MIMEMultipart()
#邮件主题
msg["Subject"]='test'
msg["From"]=sender
#邮件正文
msg_content="hi,nice to meet you,I'm your tester"
msg.attach(MIMEText(msg_content,'plain','utf-8'))
#添加附件就是加上一个MIMEBase
with open('cat.jpg','rb') as f:
    mime=MIMEBase("image","jpg",filename='test.jpg')
    #加上必要的头信息
    mime.add_header('Content-Disposition','attachment',filename='test.jpg')
    mime.add_header('Content-ID','<0>')
    mime.add_header('X-Attachment-Id','0')
    #把附件内容读进来
    mime.set_payload(f.read())
    #base64编码
    encoders.encode_base64(mime)#无论是不是图片都要进行base64编码,因为msg内容必须是ascii可以编码的字符串
    #添加到MIMEMultipart
    msg.attach(mime)
#登录并发送邮件
try:
    #QQsmtp服务器的端口号为465或者587
    s=smtplib.SMTP_SSL('smtp.qq.com',465)
    s.set_debuglevel(1)
    s.login(sender,password)
    #给receivers列表中的地址逐个发邮件
    for item in receivers:
        msg['To']=to=item
        s.sendmail(sender,to,msg.as_string())
        print("send to %s has succeed"%item)
    s.quit()
    print('send to all succeed')
except smtplib.SMTPException as e:
    print("failed for %s"%e)

我是觉得还是挺有用的,比如给很多人群发个邮件啥的,特别是带附件的时候

发布了62 篇原创文章 · 获赞 118 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/qq_38412868/article/details/100568382