E-mail Composition and Decoding

一、邮件涉及协议及本文说明
1. 协议

  • SMTP(Simple Mail Transfer Protocal) 简单邮件传输协议,用于发送邮件。
  • MIME(Mutipurpose Internet Mail Extensions) 多用途互联网邮件扩展,可发送附件。但由于,程序不许要这个功能,因此我们有学习,也就不会出现在本文中。
  • POP(Post Office Protocal) 邮局协议,一般用POP3。可以用以较为简单的方式接收邮件(从邮件服务器上下载邮件到主机上)。
  • IMAP(Internet Mail Access Protocal) 也用于接收邮件,功能较POP3更为强大些。

2. 在下面中会更详细的介绍这些协议,以及在Python中的使用方式。
二、邮件格式粗糙解释
  Email在组织的时候遵循header和body的映射模式。而header是固定一些可选的如 From, To, Subject, Date time, Receiver, Message-ID, Content, Attachment。它们的组织形式如:

  • From: ....(显示发送者邮箱)
  • To: ... (显示目的地邮箱)
  • Subject: ... (显示主题)
  • Date: ... (显示发送时间还是到达时间?)
  • Content: ... (邮件主体内容)
  • Attachment: ... (附件)

  对于我来说,我只需要From, To, Subject, Content。
三、撰写“极简单”邮件
1. 下面以一个例子说明怎样生成一封邮件。

from email.message import Message
# 一个email一般封装在Message类中,所以需要在email.message中引入Message类。

# 这是邮件主体内容
text = """ Hello,
This is a test message from vicczx.

--viczzx--"""

msg = Message() # 构造一个Message实例
msg['To'] = "toUserName@example.com" #接收者邮箱
msg['From'] = "myUserName@example.com" #自己的邮箱
msg['Subject'] = 'Test Message' #邮件主题
msg.set_payload(text) #将上面的邮件内容通过set_payload()函数封装进msg

# 通过上面也可一看到, 邮件格式就是通过映射的方式进行组织的。需要注意的是:'To','From'等区分大小写,否则接收者无法解析

print(msg.as_string()) # 查看邮件内容

2. 添加Date和Message-ID header
  绝大多数邮件有个Date header,这个可以通过email.utils库进行生成;
  你也可以生成一个Message-ID header,就可以区别世界上所有其他的邮件了。这个也是通过email.utils模块的函数进行生成。
  对于我来说,因为我不打算做一个功能强大的邮件客户端,因此,这些都是可有可无的。不过加上这些内容后,也算比较完整了。如下代码:

from email.utils
from email.message import Message
# 一个email一般封装在Message类中,所以需要在email.message中引入Message类。

# 这是邮件主体内容
text = """ Hello,
This is a test message from vicczx.

--viczzx--"""

msg = Message() # 构造一个Message实例
msg['To'] = "toUserName@example.com" #接收者邮箱
msg['From'] = "myUserName@example.com" #自己的邮箱
msg['Subject'] = 'Test Message' #邮件主题
msg['Date'] = email.utils.formatdate(localtime=1) #函数详细说明请查看官方Python API Reference
msg['Message-ID'] = email.utils.make_msgid() 
msg.set_payload(text) #将上面的邮件内容通过set_payload()函数封装进msg

# 通过上面也可一看到, 邮件格式就是通过映射的方式进行组织的。需要注意的是:'To','From'等区分大小写,否则接收者无法解析

print(msg.as_string()) # 查看邮件内容

四、解析邮件(Parsing Messages)
  知道了怎样生成邮件的,其实解析邮件就能够大致了解了。

# 已知msg 为下载下来的Message()实例邮件。
print("This message is from : ", msg['From'] )
print("This message is to : ", msg['To'])
print("Subject: ", msg['Subject']) # 主题
print("Content: ", msg.get_payload()) # 得到主体内容

  但是在实际上,可能没有这么简单。因为需要使用到中文,邮件解析还要考虑这一点;其他问题在这里不再这里过多说明,我会在后面详细的讲解程序开发过程中遇到的种种问题,所以,如果有需要请看后面几篇文章。