April946

导航

Python收发邮件

  • 发送邮件使用SMTP协议,接受POP3或IMAP;
  • 创建邮件内容email模块,发送邮件smtplib模块。发送邮件比较简单,只需先创建SMTP对象,登录服务器后根据发收邮箱地址发送即可;
  • POP3接受邮件poplib模块,接收到的是原始邮件,需经email模块解析成为能阅读的邮件
  • IMAP接收邮件imaplib模块
  • 收发邮件都比较简单,相反,麻烦的是构造邮件以及解析邮件,因为邮件内容的形式可以有多种多样(纯文本、HTML、图片、附件等)

 


 

1,电子邮件发送流程:

  使用邮件用户代理(客户端)编辑收取email,在一封email的传输过程中,其首先由客户端发送到email服务的提供商(如网易、Google、qq)的服务器上(MTA),不同的提供商之间的MTA进行传输,最终将该email发到收件人邮箱的MTA上,再经由MTA投递到邮件投递代理MDA上,它就像小区的邮箱,email就静静的躺在提供商的服务器里,等待用户使用MUA来对这封email进行处理。

  MUA -> MTA ->....-> MTA -> MDA -> MUA

  对于MTA、MDA以及他们的实现方式,是邮件服务提供商提供的服务器,他们的实现相当于电子邮件的基础设施,邮局以及邮局工作人员一样的存在。我们关心的是在MUA上编辑邮件将它发送出去以及从MDA上收取邮件的过程。

  发邮件时,MUA和MTA使用的是SMTP:Simple Mail Transfer Protocol。发送邮件前,需要配置SMTP服务器,即指明你要发送到哪个MTA服务器上,同时,需要提供用户名及密码来进行用户认证。

  收邮件时,MUA和MDA使用的协议是POP3:Post Office Protocol,以及IMAP:Internet Message Access Protocol。收邮件是也需要提供用户名密码来认证。

 


 

2,SMTP发送邮件

  email模块构造邮件,smtplib模块发送邮件

  1)email构造邮件(邮件内容、收发件人、主题等)

    查看email文档:https://docs.python.org/3/library/email.mime.html

   2)smtplib发送邮件到SMTP服务器

    查看smtplib文档:https://docs.python.org/3/library/smtplib.html

  • class smtplib.SMTP(host=''port=0local_hostname=None[timeout]source_address=None)
  • class smtplib.SMTP_SSL(host=''port=0local_hostname=Nonekeyfile=Nonecertfile=None[timeout]context=Nonesource_address=None)
  • class smtplib.LMTP(host=''port=LMTP_PORTlocal_hostname=Nonesource_address=None)   
from email.header import Header
from email.mime.text import MIMEText
import smtplib

from_addr = '...@qq.com'
password = '...'  # qqSMTP服务授权码
to_addr = '...'
smtp_server = 'smtp.qq.com'# SMTP服务器地址
smtp_port = 465

# 构造文本邮件
msg = MIMEText('MIMEText对象构造的是纯文本邮件对象,类型为plain', 'plain', 'utf-8')
msg['From'] = '...'
msg['To'] = '...'
msg['Subject'] = Header('主题', 'utf-8').encode()

# 发送邮件
try:
    # server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25 !错误
    server = smtplib.SMTP_SSL(smtp_server, smtp_port)
    server.set_debuglevel(1)  # 打印和SMTP服务器交互的所有信息
    server.login(from_addr, password)  # 登录SMTP服务器
    server.sendmail(from_addr, [to_addr], msg.as_string())  # 发邮件
    server.quit()
except:
    print('出错了!!!')

 


 

3,POP接收邮件

  POP3协议收取的是邮件的原始文本,不能直接阅读,(SMTP协议发送的也是经编码后的一段文本)。需要使用email模块提供的类解析原始文本,才能变成可阅读的邮件。

  1)poplib收取邮件的原始文本下载到本地

    查看poplib文档:https://docs.python.org/3/library/poplib.html

    POP3类:提供到POP3服务器的连接,并实现了POP协议

    POP3_SSL类:支持到POP3服务器的连接,并以SSL为基础协议层(SSL加密socket)

    note:POP3逐渐被淘汰(?),质量不佳。所以如果邮件服务支持IMAP,建议使用imaplib.IMAP4类,因为IMAP服务实现的更棒。

  • class poplib.POP3(hostport=POP3_PORT[, timeout])  标准POP3端口-110
  • class poplib.POP3_SSL(hostport=POP3_SSL_PORTkeyfile=Nonecertfile=Nonetimeout=Nonecontext=None)
from email.parser import Parser
import poplib

# 邮件地址, 口令和POP3服务器地址:
email = '...@qq.com '
password = '...'
pop3_server = 'pop.qq.com'
# 连接到POP3服务器:
server = poplib.POP3_SSL(pop3_server)
server.set_debuglevel(1)  # 调试信息
# 身份认证:
server.user(email)
server.pass_(password)

# stat()返回(邮件数量,占用空间)
print('Messages: %s. Size: %s' % server.stat())
# list()返回所有邮件的编号: (response, ['mesg_num octets', ...], octets)
resp, mails, octets = server.list()
# 查看返回的列表,类似  [b'1 4482', b'2 23956', ...]
print(mails)

# 获取最新一封邮件, 注意索引号从1开始:
index = len(mails)
resp, lines, octets = server.retr(index)  # lines存储邮件的原始文本的每一行
# 获得整个邮件的原始文本:
msg_content = b'\r\n'.join(lines).decode('utf-8')

# 解析出邮件: 把邮件文本解析成Message对象,还需要更多内容...
msg = Parser().parsestr(msg_content)

# 关闭连接:
server.quit()

 

  2)email解析原始文本

 


  

4,IMAP接收邮件  

    查看imaplib文档:https://docs.python.org/3/library/imaplib.html

 


 

使用QQ邮箱时,收发邮件的登录密码都要使用SMTP/POP/IMAP服务的授权码,同时在建立与服务器的连接时,使用SMTP_SSL / POP3_SSL对象而不能是SMTP / POP3。

  

posted on 2017-10-14 11:23  April946  阅读(402)  评论(0编辑  收藏  举报