用python实现发送邮件
阅读原文时间:2021年04月20日阅读:1

知识背景:

  1. SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
  2. Internet Mail Access Protocol(缩写为IMAP,以前称作交互邮件访问协议(interactive mail access protocol))IMAP是斯坦福大学在1986年开发的一种邮件获取协议。它的主要作用是邮件客户端(例如MS Outlook Express)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。 

首先,你要知道,你申请邮箱之后用邮箱来收发电子邮件,电子邮件并不是存在你本地的电脑上的,而是存在邮箱服务提供商的数据中心里,如下图所示

你的邮箱账号和密码就是用来登陆 Gmail 或者 QQ 邮箱的邮箱服务器的

而在这些服务器集群里,会跑着 IMAP 服务器和 SMTP 服务器

当接收邮件时,情况如下图所示

用户接收邮件时,可以通过 Web 界面来登录邮箱并阅读邮件,也可以通过第三方邮件客户端,包括但不限于 Outlook,Foxmail,Mutt等来收取,而第三方客户端与邮件服务器通信时遵守的协议就是 IMAP

通过 IMAP 协议,第三方客户端可以下载邮件头或者邮件全文到本地,如上图中箭头所示

以前也有用 POP3 协议的,至于 POP3 与 IMAP 的区别不是重点就暂时不写了

当发送邮件时,情况如下图所示

比如使用 Gmail 的用户 A 要给使用 QQ 邮箱的用户 B 发送一封电子邮件,那么流程如下:

首先 A 与 Gmail 的 SMTP 服务器通信,将邮件标题、内容、收件人邮件地址等信息发送至 Gmail 的 SMTP 服务器

然后,Gmail 的 SMTP 将该封邮件投递至 QQ 邮箱的 SMTP 服务器

B 收到 QQ 邮箱的提醒,通过 IMAP 协议收取该封邮件

所以,不管是用户向邮件服务器发送邮件信息,还是邮件服务器向另一台邮件服务器发送邮件信息,都需要走 SMTP 协议

#coding: utf-8

from email.mime.text import MIMEText
import smtplib

mail_content = "This is a content of the mail"
try:
    content = MIMEText(mail_content, 'plain', 'utf-8') # 第一个参数:邮件的内容;第二个参数:邮件内容的格式,普通的文本,可以使用:plain,如果想使内容美观,可以使用:html;第三个参数:设置内容的编码,这里设置为:utf-8
    reveivers = "xxx1@qq.com,xxx2@qq.com"
    content['To'] = reveivers # 设置邮件的接收者,多个接收者之间用逗号隔开
    content['From'] = str("xxx0@qq.com") # 邮件的发送者,最好写成str("这里填发送者"),不然可能会出现乱码
    content['Subject'] = "这是一封测试邮件" # 邮件的主题

    ##############使用qq邮箱的时候,记得要去开启你的qq邮箱的smtp服务;##############
    # 方法:
    # 1)登录到你的qq邮箱;
    # 2)找到首页顶部的【设置】并点击;
    # 3)找到【账户】这个选项卡并点击,然后在页面中找到“SMTP”相关字样,找到【开启】的超链接,点击后会告诉你开启方法(需要发个短信),然后按照指示操作,最终会给你一个密码,这个密码可以用于在代码中当作邮箱密码
    # 注意!!!:163邮箱之类的不知道要不要这些操作,如果是163邮箱你可以忽略此步骤
    ###########################################################################
    smtp_server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 第一个参数:smtp服务地址(你发送邮件所使用的邮箱的smtp地址,在网上可以查到,比如qq邮箱为smtp.qq.com) 第二个参数:对应smtp服务地址的端口号
    smtp_server.login("xxx0", "****************") # 第一个参数:发送者的邮箱账号 第二个参数:对应邮箱账号的密码
    #################################

    smtp_server.sendmail("xxx0@qq.com", ["xxx1@qq.com" ,"xxx2@qq.com"], content.as_string()) # 第一个参数:发送者的邮箱账号;第二个参数是个列表类型,每个元素为一个接收者;第三个参数:邮件内容
    smtp_server.quit() # 发送完成后加上这个函数调用,类似于open文件后要跟一个close文件一样
except Exception as e:
    print str(e)

资料参考:https://www.zhihu.com/question/27287653