美文网首页
学习:Python smtplib模块基于SMTP发送邮件

学习:Python smtplib模块基于SMTP发送邮件

作者: RachaelRiggs | 来源:发表于2020-02-25 20:36 被阅读0次

    本人python小白,日记仅作学习记录之用,如有不妥之处还请指各位大佬指正~~

    原理:
    SMTP(Simple Mail Transfer Protocol)是简单传输协议,它是一组用于由源地址到目的地址的邮件传输规则。
    Python smtplib库中,smtplib.SMTP()类有多种方法实现连接SMTP服务器,发送纯文本邮件、HTML邮件以及带附件的邮件等操作。
    Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。

    Code:

    # -*- coding: UTF-8 -*-
    import smtplib
    from smtplib import SMTP
    from email.header import Header
    from email.mime.text import MIMEText
    
    
    receiver = "bleuxxxxine@163.com"
    sender = "273xxxx212@qq.com"
    
    # 主题如果是纯中文或纯英文则字符数必须大于等于5个
    # 不然会报错554 SPM被认为是垃圾邮件或者病毒
    subject = "肖个别和王世界的婚礼邀请函"
    contents = "婚礼邀请函 送呈:悦小姐台启 谨订于公历2026年09月05日" \
               "为Mr.Xiao和Mr.Wang举行结婚典礼敬备喜筵 恭请 光临 " \
               "地点:意大利博肖市"
    smtpserver = "smtp.qq.com"
    username = "273xxxx212"
    # 邮箱授权码,不是密码
    password = "hyocrsxxxiwmdhfb"
    
    msg = MIMEText(contents, 'plain', 'utf-8')
    msg['Subject'] = Header('肖个别和王世界的结婚邀请函.', 'utf-8')
    msg['From'] = sender
    msg['To'] = receiver
    
    #服务器地址和端口25
    smtp = smtplib.SMTP(smtpserver, 25)
    smtp.set_debuglevel(1)
    smtp.login(username, password)
    smtp.sendmail(sender, receiver, msg.as_string())
    smtp.quit()
    
    print('邮件发送完成!')
    
    
    

    最终效果:

    邮件发送成功

    说明:

    1. 构造一个最简单的纯文本邮件:
    from email.mime.text import MIMEText
    msg = MIMEText('contents', 'plain', 'utf-8') 
    # 构造MIMEText对象时,第一个参数就是邮件正文,第二个参数是MIME的subtype,传入’plain’表示纯文本,最终的MIME就是’text/plain’,最后一定要用utf-8编码保证多语言兼容性。
    
    
    1. 通过SMTP把邮件发出去:
    # 服务器地址和端口号
    smtp = smtplib.SMTP(smtpserver, 25)
    # set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息。
    smtp.set_debuglevel(1)
    # 登录SMTP服务器
    smtp.login(username, password)
    # 发送邮件
    smtp.sendmail(sender, receiver, msg.as_string())
    # 关闭SMTP会话
    smtp.quit()
    

    set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息。
    SMTP协议就是简单的文本命令和响应。login()方法用来登录SMTP服务器,sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文是一个str,as_string()把MIMEText对象变成str。

    1. 第一次用网易的邮箱发邮件,多次尝试均提示退信代码,注意到控制台提示的信息,于是点开了提示网易退信代码的网址
      554 DT:SPM 和554 IP is rejected,用SMTP发送多次以后IP被禁,所以之后就直接用QQ邮箱了。
      以后调试看到错误提示不要慌张,看清楚提示信息知道哪里出错,有针对性地修改代码就好。
      IP地址被禁

    4.调试过程还出现

    'list' object has no attribute 'encode' 
    

    意思是说“列表”不能被“编码”;后来检查发现是contents格式不是str,导致无法utf-8编码提示错误。

    msg = MIMEText(contents, 'plain', 'utf-8')
    
    1. 结合这篇blog理解了Python中if __name__ == '__main__':的作用和原理 指路
      简而言之,在if __name__ == '__main__':以下的代码只有在 所在的.py文件中,文件直接作为脚本执行时,if __name__ == '__main__':以下的代码才会被执行。

    6.用smtplib库的方法还可以实现发附件、图片、读取文档or群发邮件,可参考指路

    相关文章

      网友评论

          本文标题:学习:Python smtplib模块基于SMTP发送邮件

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