构建一个邮件客户端有多难? - Python

27 投票
5 回答
47227 浏览
提问于 2025-04-16 15:38

我现在在探索一个陌生的领域……

我在尝试弄明白用Python实现一个电子邮件客户端会有多难:

  • 获取电子邮件
  • 发送电子邮件
  • 格式化电子邮件
  • 显示电子邮件

我还在想,所有的协议支持起来是简单还是困难,比如SMTP、IMAP、POP3等等……


希望有人能给我指个方向 :)

5 个回答

5

我做了两个库,可以轻松解决一些问题:

  • 发送邮件:Red Mail(使用SMTP协议)
  • 接收邮件:Red Box(使用IMAP协议)

下面是这两个库的简单示例:

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的链接:

8

我觉得你会发现很多客户需要的重要功能已经打包好了:

邮件获取 - 这部分有很多Python库可以处理。

邮件发送 - 这也不难,应该也有相关的库可以用。

邮件格式化 - 我知道这部分是有的,因为我刚刚用它来解析单个和多个部分的邮件。

邮件渲染 - 我建议使用某种HTML渲染器。Mozilla项目有一个Python接口可以用来渲染。我猜还有其他渲染引擎也有Python接口。我知道wxWidgets有一些简单的HTML功能,而且会轻量很多。想想看,Mozilla引擎可能还包含你需要的其他功能。你需要研究每个部分。

这方面的内容远不止上面列出的那些。就像任何值得做的事情一样,这不会一蹴而就。我建议你先明确你想要实现的功能。然后开始制作一个原型。先建立一个简单的框架,做一些基本的事情。比如只支持消息的文本部分,不包含HTML。然后再在这个基础上继续扩展。

我对Python提供的丰富编码模块感到惊讶。我需要过滤HTML邮件、解析样式表、嵌入样式,还有很多其他功能。我几乎在某个Python库中找到了我需要的每一个功能。当我发现有些CSS样式表是经过gzip压缩的,并且有相应的模块可以处理时,我特别高兴!

所以如果你认真对待这个项目,就深入研究吧。你会学到很多东西。:)

32

Python语言在它的标准库中确实提供了对所需协议的基本支持。不过,要正确使用这些协议,并且正确解析和组装一个“现代化”的电子邮件消息,其实是挺难的。

另外,你没有说你是否想为你的电子邮件客户端创建一个图形界面。如果你想要一个好用的图形界面,那可得花不少功夫。

本地存储电子邮件相对简单一些,除非你想要正确实现一个mbox文件格式 RFC-4155,这样其他软件才能方便地读写你获取的邮件。否则,你可以使用ORM或者面向对象的数据库,比如ZODB或者MongoDB,把邮件存储为Python对象。

如果你想要的不仅仅是一个玩具电子邮件应用,那你得做很多工作,比如正确编码电子邮件的头部、服务器认证、安全认证和传输层、以及解码非ASCII格式的邮件正文。虽然Python标准库中的模块实现了很多这些功能,但它们的文档在示例方面不够详细,而一个完整的电子邮件客户端需要用到所有这些功能。

当然,开始制作一个电子邮件客户端,哪怕是一个简单的玩具应用,最好的起点就是查看最新的电子邮件RFC(你可以从这里选择 http://www.ietf.org/rfc/rfc-index,因为在谷歌上搜索“email rfc”得到的结果不太好)。

撰写回答