45.简单邮件传输协议 SMTP

时间:2021-01-29 18:08:15

一丶简单邮件传输协议 简单邮件传输协议 简单邮件传输协议 SMTP

 

  • smtplib 模块:(在 Python3版本中,可以通过 SMTP协议发送邮件的模块常为 smtplib, 并且这个模块属于内置模块,不需要额外安装,以下为该模块常用函数介绍  )
    • smtplib.SMTP(host='', port=0, local_hostname=None, [timeout,])     (实例化 SMTP对象,并可以远程 SMTP服务器进行连接;)
      • host:远程 smtp主机 地
      • port:远程 smtp主机端口。
      • local_hostname:标示本地连接用户身份
      • timeout:连接超时选项
    • smtplib.SMTP_SSL(host='',port=0,local_hostname=None,keyfile=None,certfile=None,[timeout, ]context=None,)  (用于连接需要 SSL安全加持才可以连接的MSTP服务器, 是现在比较常用的SMTP实例化连接方式 ;)
      • host:远程 smtp主机地址。
      • port:远程 smtp主机端口。
      • local_hostname:标示本地连接用户身份  。
      • keyfile、certfile:ssl连接时使用的 验证书及 私人秘钥文件。
      • timeout:连接超时选项。 
      • context:ssl连接时配置选项 ;
        • 参考 :https://docs.python.org/3.6/library/ssl.html#ssl.SSLContext 
  • SMTP实例化对象内置函数:
    • SMTP.set_debuglevel(level):
      • level设置实例的调试级别。
      • 0,不输出任何调试信息,同时,0也是默认值。
      • 1:输出每次请求的单行信息。
      • 2:*别调试信息输出,记录每一行发送及接收时的命令。
    • SMTP.connect(host='localhost', port=0)
      • 如果在实例化 SMTP对时候,我们并没有指出连接的主机及端口地址,那么可以在后续的示例中使用该函数进行 smtp服务器的连接  ,其中参数部分为:
      • host:smtp主机地址。
      • port:smtp主机端口,常用主机端口为 25。
        • 如果采用加密方式连接时,常端口为 465或 587
    • SMTP.helo([hostname])
      • 使用 helo指令向服务器确认身份,告知 smtp服务器连接者身份
    • SMTP.verify(address)
      • 判断 address所指向的smtp服务器是否存在 ;
      • 不过出于安全考虑,一般  smtp邮件服务器都会屏蔽这个指令。 
    • SMTP.login(user,passwd)
      • 成功连接到smtp服务器之后,可以通过该函数登录对应邮箱账号。 
      • user:对应 smtp服务器邮件登录用户名。
      • passwd:对应 smtp服务器邮件登录密码。
    • STMP.starttls(keyfiles=None,cerfile=None,context=None)
      • 启用 TLS安全传输命令,之后所有的 SMTP指令在传输的时候,都会加密传输。 
    • SMTP.sendmail(from_addr,to_addrs,msg)
      • 通过登录邮件服务器用户向目标发送。
      • from_addr:发送者邮箱
      • to_addrs:接收邮件的用户箱。
        • 这个值可以是一有效邮箱用户列表 [ ''xx1@xx.com", 'xx2@xx.com']
      • 这里需要注意的是,邮件内容有一定格式字符串 :
        'From: from@xx.com \r\n' +  \                                   #其中第一行为发件人信息;

        'To: to@xx.com \r\n' + \                                         #第二行为接收邮件用户信息;

        'Subject:主题 ' \r\n + \                                              #第三行为邮件主题;

        '\r\n' + \                                                                 #第四行为与邮件内容分隔的一个'\r\n';

        '邮件内容 '                                                               #第五行为具体邮件内容。
    • SMTP.quit()
      •  断开与  smtp主机的连接 。
  • smtplib 发送邮件(这里要看对应服务器是否支持ssl加密,不支持就用25端口)

    #发送简单的邮件.py
    import smtplib
    mail_host = 'smtp.qq.com' #qq邮箱服务器
    from_addr = "1039821294@qq.com"   #发送者用户
    from_addr_passwd = "**************"      #记住的密码并不是你的qq邮箱登录的密码,而是IMAP/SMTP服务,在第三方客户端登录时,密码框里的授权码:
    to_addrs = ["1039821294@qq.com","1039821294@qq.com"] #接受者用户
    smtp = smtplib.SMTP_SSL(mail_host,465)  #连接qq邮箱服务器,端口465
    smtp.set_debuglevel(2)
    smtp.login(from_addr, from_addr_passwd)
    content = '这是一封测试邮件!'   #这里是定义发送内容的变量
    for to_addr in to_addrs:
        msg = 'From: %s\r\n' % from_addr + \
        'To: %s\r\n' % to_addr + \
        'Subject: %s\r\n' % '测试邮件' + \
        '\r\n' + \
        '%s' % content   #记住换行要加 \
        smtp.sendmail(from_addr, to_addr, msg.encode('utf-8'))  

    运行结果:

  • 45.简单邮件传输协议 SMTP
  • 通过 MIME标准定制邮件

    •  MIME(Multipurpose Internet Mail Extensions)名为多用途互联网邮件扩展类型 ,可以让 可以让 我们在使用 我们在使用 我们在使用 SMTP协议进行发送邮件时,让内容更加丰富多彩。浏览器也会根据MIME格式对应支持的内容来打开一些特殊文件 , 比如图像音频HTML文件等。 

    • 其中 MIME Type类型 定义在邮件传输时的 Content-type Herder中,常见MIME类型格式如下:
      Content-Type : type/subtype; charset='utf-8'
    • 其中 type对应的格式有如下:
      • Text:用于 标准文本信息, 文本信息可以使多种字符集或格式的。
      • Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型单独的数据
      • Application:用于传输应程序数据或者二进制。
      • Message:用于包装一个简单消息。
      • Image:用于传输静态图片资源。 
      • Audio:用于传输音频 用于传输音频
      • Video:用于传输视频资源
      • text/plain:纯文本内容
      • text/html:HTML内容
      • image/gif:GIF图像
      • image/jpeg:JPEG图像
      • mage/png:PNG图像
      • application/octet-stream:二进制数据
      • application/xhtml+xml:XHTML 文档
      • application/pdf:PDF文档
      • application/msword:Mirosoft Word文件
      • multipart/alternative:HTML邮件的 HTML形式 和纯文本形式 
      • application/x-www-form-urlencoded:使用 HTTP的 POST方法提交的表单 
  • 发送 HTML格式邮件:(常用这个)
    • 发送 HTML格式邮件时,我们需要额外导入 email.mime.text模块下的 MIMEText,该类可以为我们初始化 HTML邮件数据, 之后可以很方便的通过 smtp实例进行发送  。
    • email.mime.text.MIMEText(_text, _subtype='plain', _charset=None )
      • _text:发送邮件的 HTML内容
      • _subtype:文本类型 。
        • plain:纯文本格式 纯文本格式 纯文本格式 。
        • html:html格式
      • _charset:邮件 HTML数据编码格式 ;为了支持中文, 常为 'utf-8'。
    • #发送简单的html格式邮件.py
      import smtplib
      from email.mime.text import MIMEText
      mail_host = 'smtp.qq.com' #qq邮箱服务器
      from_addr = "1039821294@qq.com"   #发送者用户
      from_addr_passwd = "****************"      #记住的密码并不是你的qq邮箱登录的密码,而是IMAP/SMTP服务,在第三方客户端登录时,密码框里的授权码:
      to_addrs = ["1039821294@qq.com","1039821294@qq.com"] #接受者用户
      smtp = smtplib.SMTP_SSL(mail_host,465)  #连接qq邮箱服务器,端口465
      smtp.set_debuglevel(2)
      smtp.login(from_addr, from_addr_passwd)
      content = '<a href="http://www.python.org">>学习python使我快乐!<</a>'   #这里是定义发送内容的变量
      msg = MIMEText(content,'html','utf-8')  #创建 MIME格式 HTML邮件
      msg['From'] = from_addr    #邮件内容中的发送人信息
      msg['Subject'] = 'HTML邮件测试' #邮件主题
      for to_addr in to_addrs:
          msg['To'] = to_addr  #邮件内容中的接收人信息 
          smtp.sendmail(from_addr, to_addr, msg.as_string())
      

      运行结果:

    • 45.简单邮件传输协议 SMTP