美文网首页python之路
python-email库发送各种类型邮件以及遇到的坑

python-email库发送各种类型邮件以及遇到的坑

作者: 非鱼2018 | 来源:发表于2020-05-20 22:50 被阅读0次

    一.使用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)

    相关文章

      网友评论

        本文标题:python-email库发送各种类型邮件以及遇到的坑

        本文链接:https://www.haomeiwen.com/subject/yxyeohtx.html