• Python 自动发送邮件


    简单邮件传输协议(SMTP)是一种协议,用于在邮件服务器之间发送电子邮件和路由电子邮件。Python提供smtplib模块,该模块定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听器守护程序向任何互联网机器发送邮件。

    SMTP通讯的基本流程可以概括为以下几点:

    1.连接SMTP服务器

    2.登陆用户名和密码

    3.发送指定邮件内容

    4.退出SMTP连接

    一、发送纯文本格式邮件

     1 #coding:utf-8
     2 import sys
     3 reload(sys)
     4 sys.setdefaultencoding('utf8')
     5 import smtplib
     6 from smtplib import SMTP
     7 from email.mime.text import MIMEText
     8 from email.header import  Header
     9 
    10 #构造纯文本邮件内容
    11 msg = MIMEText('hello,send by Python.....','plain','utf-8')
    12 
    13 #发送者邮箱
    14 sender = 'xxxxx@XXXXX.com.cn'
    15 
    16 #发送者的登陆用户名和密码
    17 user = 'xxxxx@XXXX.com.cn'
    18 password = 'xxxxxx'
    19 
    20 #发送者邮箱的SMTP服务器地址
    21 smtpserver = 'xxxx'
    22 
    23 #接收者的邮箱地址
    24 receiver = ['xxxxxx@qq.com','xxxxxx@outlook.com'] #receiver 可以是一个list
    25 
    26 smtp = smtplib.SMTP() #实例化SMTP对象
    27 smtp.connect(smtpserver,25) #(缺省)默认端口是25 也可以根据服务器进行设定
    28 smtp.login(user,password) #登陆smtp服务器
    29 smtp.sendmail(sender,receiver,msg.as_string()) #发送邮件 ,这里有三个参数
    30 '''
    31 login()方法用来登录SMTP服务器,sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文
    32 是一个str,as_string()把MIMEText对象变成str。
    33 '''
    34 smtp.quit()

    运行之后就会收到邮件:

    但是仔细观察会发现:

    1.邮件没有主题

    2.看不到收件人的信息

    这是因为邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给MTA,而是包含在发给MTA的文本中的,所以,我们必须把FromToSubject添加到MIMEText,才是一封完整的邮件:

    1 msg = MIMEText('hello,send by Python.....','plain','utf-8')
    2 msg['From'] = Header('Python测试','utf-8')
    3 msg['To'] = Header('管理员','utf-8')
    4 subject = 'python SMTP 测试邮件'
    5 msg['Subject'] = Header(subject,'utf-8')

    二、发送HTML格式的邮件

    如果我们要发送HTML邮件,而不是普通的纯文本文件怎么办?方法很简单,在构造MIMEText对象时,把HTML字符串传进去,再把第二个参数由plain变为html就可以了:

    1 msg = MIMEText('<html><h1>你好!<h1><html>','html','utf-8') #发送HTML格式邮件就只需要把对应的第二个参数改为html即可

    三、发送带附件的邮件

    发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。

     1 #coding:utf-8
     2 import sys
     3 reload(sys)
     4 sys.setdefaultencoding('utf8')
     5 import smtplib
     6 from email.mime.text import MIMEText
     7 from email.mime.multipart import MIMEMultipart
     8 from email.header import Header
     9 
    10 #发送邮件服务器
    11 smtpserver = 'xxxxx'
    12 #发送邮箱用户名和密码
    13 user = 'xxxxxx'
    14 password = 'xxxxxx'
    15 #发送邮箱
    16 sender = 'xxxxx'
    17 #接受邮箱
    18 receiver = 'xxxxxxx'
    19 
    20 #创建一个带附件的实例
    21 message = MIMEMultipart()
    22 message['From'] = Header('Python 测试','utf-8')
    23 message['To'] = Header('测试','utf-8')
    24 subject = 'Python SMTP邮件测试'
    25 message['Subject'] = Header(subject,'utf-8')
    26 
    27 #邮件正文内容
    28 message.attach(MIMEText('这是测试Python发送附件功能....','plain','utf-8'))
    29 
    30 #构造附件1,传送当前目录下的test.txt文件
    31 att1 = MIMEText(open('123.txt','rb').read(),'base64','utf-8')
    32 att1['Content-Type'] = 'application/octet-stream'
    33 #这里的filename可以任意写,写什么名字 邮件中就显示什么名字
    34 att1['Content-Disposition'] = 'attachment;filename:"123.txt"'
    35 message.attach(att1)
    36 
    37 smtp = smtplib.SMTP()
    38 smtp.connect(smtpserver,25)
    39 smtp.login(user,password)
    40 smtp.sendmail(sender,receiver,message.as_string())
    41 smtp.quit()

    小结

    使用Python的smtplib发送邮件十分简单,只要掌握了各种邮件类型的构造方法,正确设置好邮件头,就可以顺利发出。

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

    Message
    +- MIMEBase
       +- MIMEMultipart
       +- MIMENonMultipart
          +- MIMEMessage
          +- MIMEText
          +- MIMEImage
    

    这种嵌套关系就可以构造出任意复杂的邮件。你可以通过email.mime文档查看它们所在的包以及详细的用法。

  • 相关阅读:
    maven下载源配置
    nvm及node下载源配置
    SourceInsight 添加Symbol Lookup路径
    8.31-使用vscode进行c/c++程序设计
    10.08-vscode-plantuml建模
    6.26-vscode 配置文件
    3.5-VSCode 学习
    3.6-WizNote 常用快捷键
    10.04-CTEST-GTest
    180325-log4cplus
  • 原文地址:https://www.cnblogs.com/stephenmc/p/8028411.html
Copyright © 2020-2023  润新知