构建一个邮件客户端有多难? - Python
我现在在探索一个陌生的领域……
我在尝试弄明白用Python实现一个电子邮件客户端会有多难:
- 获取电子邮件
- 发送电子邮件
- 格式化电子邮件
- 显示电子邮件
我还在想,所有的协议支持起来是简单还是困难,比如SMTP、IMAP、POP3等等……
希望有人能给我指个方向 :)
5 个回答
我做了两个库,可以轻松解决一些问题:
下面是这两个库的简单示例:
from redbox import EmailBox
from redmail import EmailSender
USERNAME = "me@example.com"
PASSWORD = "<PASSWORD>"
box = EmailBox(
host="imap.example.com",
port=993,
username=USERNAME,
password=PASSWORD
)
sender = EmailSender(
host="smtp.example.com",
port=587,
username=USERNAME,
password=PASSWORD
)
然后你就可以发送邮件了:
email.send(
subject='email subject',
sender="me@example.com",
receivers=['you@example.com'],
text="Hi, this is an email.",
html="""
<h1>Hi,</h1>
<p>this is an email.</p>
""",
attachments={
'data.csv': Path('path/to/file.csv'),
'raw_file.html': '<h1>Just some HTML</h1>',
}
)
或者读取邮件:
from redbox.query import UNSEEN, FROM
# Select an email folder
inbox = box["INBOX"]
# Search and process messages
for msg in inbox.search(UNSEEN & FROM('they@example.com')):
# Process the message
print(msg.headers)
print(msg.from_)
print(msg.to)
print(msg.subject)
print(msg.text_body)
print(msg.html_body)
# Set the message as read/seen
msg.read()
如果你需要进行复杂的逻辑操作,Red Box完全支持使用查询语言。你还可以轻松访问邮件的各个部分。
关于Red Mail的链接:
关于Red Box的链接:
我觉得你会发现很多客户需要的重要功能已经打包好了:
邮件获取 - 这部分有很多Python库可以处理。
邮件发送 - 这也不难,应该也有相关的库可以用。
邮件格式化 - 我知道这部分是有的,因为我刚刚用它来解析单个和多个部分的邮件。
邮件渲染 - 我建议使用某种HTML渲染器。Mozilla项目有一个Python接口可以用来渲染。我猜还有其他渲染引擎也有Python接口。我知道wxWidgets有一些简单的HTML功能,而且会轻量很多。想想看,Mozilla引擎可能还包含你需要的其他功能。你需要研究每个部分。
这方面的内容远不止上面列出的那些。就像任何值得做的事情一样,这不会一蹴而就。我建议你先明确你想要实现的功能。然后开始制作一个原型。先建立一个简单的框架,做一些基本的事情。比如只支持消息的文本部分,不包含HTML。然后再在这个基础上继续扩展。
我对Python提供的丰富编码模块感到惊讶。我需要过滤HTML邮件、解析样式表、嵌入样式,还有很多其他功能。我几乎在某个Python库中找到了我需要的每一个功能。当我发现有些CSS样式表是经过gzip压缩的,并且有相应的模块可以处理时,我特别高兴!
所以如果你认真对待这个项目,就深入研究吧。你会学到很多东西。:)
Python语言在它的标准库中确实提供了对所需协议的基本支持。不过,要正确使用这些协议,并且正确解析和组装一个“现代化”的电子邮件消息,其实是挺难的。
另外,你没有说你是否想为你的电子邮件客户端创建一个图形界面。如果你想要一个好用的图形界面,那可得花不少功夫。
本地存储电子邮件相对简单一些,除非你想要正确实现一个mbox文件格式 RFC-4155,这样其他软件才能方便地读写你获取的邮件。否则,你可以使用ORM或者面向对象的数据库,比如ZODB或者MongoDB,把邮件存储为Python对象。
如果你想要的不仅仅是一个玩具电子邮件应用,那你得做很多工作,比如正确编码电子邮件的头部、服务器认证、安全认证和传输层、以及解码非ASCII格式的邮件正文。虽然Python标准库中的模块实现了很多这些功能,但它们的文档在示例方面不够详细,而一个完整的电子邮件客户端需要用到所有这些功能。
当然,开始制作一个电子邮件客户端,哪怕是一个简单的玩具应用,最好的起点就是查看最新的电子邮件RFC(你可以从这里选择 http://www.ietf.org/rfc/rfc-index,因为在谷歌上搜索“email rfc”得到的结果不太好)。