Python发送邮件

作者: 海天一树X | 来源:发表于2018-06-15 14:24 被阅读48次

    一、启用邮箱的SMTP访问

    Python发邮件需要有SMTP服务,可以在本地搭建SMTP服务,也可以使用第三方的SMTP服务(比如网易邮箱或QQ邮箱)。
    这里我使用了网易126邮箱来发邮件。

    1 登录网易邮箱

    2 设置-->POP3/SMTP/IMAP-->设置POP3/SMTP/IMAP,勾选“POP3/SMTP服务”和“IMAP/SMTP服务”。

    1.png

    3 设置客户端授权密码,要求邮箱绑定手机,设置验证码之前需要先输入短信验证码
    注意:网易授权密码,一天最多只能接收3次

    2.png 3.png

    用手机网易邮箱登录邮件账号时,所填的密码不是你的登录密码,而是上面这个授权密码。
    同样地,用Python发邮件也是使用授权密码,而不是邮箱登录密码。

    二、编写发邮件程序

    (一)用到的模块

    python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用。
    smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。
    email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。

    (二)消息对象

    构造一个邮件对象就是一个Message对象,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:

    4.png

    邮件发送程序为了防止有些邮件阅读软件不能显示处理HTML格式的数据,通常都会用两类型分别为"text/plain"和"text/html"

    构造MIMEText对象时,第一个参数是邮件正文,第二个参数是MIME的subtype,最后一定要用utf-8编码保证多语言兼容性。比如:

    text = "Hi!\nHow are you?\n "    
    text_plain = MIMEText(text,'plain', 'utf-8')   
    

    (三)发送邮件的代码

    import smtplib
    from email.mime.text import MIMEText
    
    # 第三方 SMTP 服务
    mail_host = 'smtp.126.com'              # 设置服务器
    mail_username = 'zhenghaishu@126.com'   # 用户名
    mail_auth_password = "**********"       # 授权密码 
     
    sender = 'zhenghaishu@126.com'
    #receivers = '270114497@qq.com'         # 一个收件人
    receivers = '270114497@qq.com, zhenghaishu@126.com' # 多个收件人
     
    message = MIMEText('这里是邮件正文', 'plain', 'utf-8')
    message['From'] = sender
    message['To'] =  receivers
    message['Subject'] = "这里是邮件主题5"
     
    try:
        smtpObj = smtplib.SMTP(mail_host, 25)                               # 生成smtpObj对象,使用非SSL协议端口号25
        #smtpObj = smtplib.SMTP_SSL(mail_host, 465)                         # 生成smtpObj对象,使用SSL协议端口号465
        smtpObj.login(mail_username, mail_auth_password)                    # 登录邮箱
        # smtpObj.sendmail(sender, receivers, message.as_string())          # 发送给一人
        smtpObj.sendmail(sender, receivers.split(','), message.as_string()) # 发送给多人
        print ("邮件发送成功")
    except smtplib.SMTPException:
        print ("Error: 无法发送邮件")
    

    运行结果:

    5.png 6.png

    注意,若收件箱里没有收到邮件,记得去垃圾箱里找。

    (四)发送带附件的邮件代码

    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
     
    # 第三方 SMTP 服务
    mail_host = 'smtp.126.com'              # 设置服务器
    mail_username = 'zhenghaishu@126.com'   # 用户名
    mail_auth_password = "***********"      # 授权密码 
     
    sender = 'zhenghaishu@126.com'
    #receivers = '270114497@qq.com'         # 一个收件人
    receivers = '270114497@qq.com, zhenghaishu@126.com' # 多个收件人
     
    message = MIMEMultipart()
    message['From'] = sender
    message['To'] =  receivers
    message['Subject'] = "这里是邮件主题2"
    
    message.attach(MIMEText('这是邮件正文', 'plain', 'utf-8'))
    
    # 构造附件1,传送当前目录下的test1.txt 文件
    att1 = MIMEText(open('test1.txt', 'rb').read(), 'base64', 'utf-8')
    att1["Content-Type"] = 'application/octet-stream'
    # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
    att1["Content-Disposition"] = 'attachment; filename="test1.txt"'
    message.attach(att1)
     
    # 构造附件2,传送当前目录下的test2.txt文件
    att2 = MIMEText(open('test2.txt', 'rb').read(), 'base64', 'utf-8')
    att2["Content-Type"] = 'application/octet-stream'
    att2["Content-Disposition"] = 'attachment; filename="test_2.txt"'
    message.attach(att2)
     
    try:
        smtpObj = smtplib.SMTP(mail_host)                                   # 生成smtpObj对象,默认使用非SSL协议端口号25
        #smtpObj = smtplib.SMTP_SSL(mail_host, 465)                         # 生成smtpObj对象,使用SSL协议端口号465
        smtpObj.login(mail_username, mail_auth_password)                    # 登录邮箱
        # smtpObj.sendmail(sender, receivers, message.as_string())          # 发送给一人
        smtpObj.sendmail(sender, receivers.split(','), message.as_string()) # 发送给多人
        print ("邮件发送成功")
    except smtplib.SMTPException:
        print ("Error: 无法发送邮件")
    

    运行结果:

    7.png 8.png

    注意,若收件箱里没有收到邮件,记得去垃圾箱里找。

    TopCoder & Codeforces & AtCoder交流QQ群:648202993
    更多内容请关注微信公众号


    wechat_public_header.jpg

    相关文章

      网友评论

        本文标题:Python发送邮件

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