在python应用程序中发送和接收电子邮件(无IMAP或POP3)

时间:2014-02-20 23:03:51

标签: python email smtp smtplib smtpd

我正在构建一个需要发送和接收电子邮件的应用程序。

但我不想拥有单独的电子邮件服务器(或使用IMAP和POP3),因为我需要动态创建/删除/管理收件箱,没有电子邮件收件箱密码等。

我有一个电子邮件存储数据库,我可以使用自定义smtpd服务器接收电子邮件,替换postfix。但是,这样我就无法通过postfix发送电子邮件(使用smtplib,通过端口25连接到postfix并发送电子邮件)

解决这个问题的方法是什么?如何使用自定义smtp服务器发送电子邮件?我可以配置postfix将所有传入的电子邮件中继到另一个端口运行的自定义smtp服务器,并仍然使用端口25上的postfix发送电子邮件吗?

感谢您的时间

1 个答案:

答案 0 :(得分:3)

通过使用自定义SMTP服务器,您可能会以某种方式无意中创建安全漏洞或违反SMTP协议。有这么多伟大的SMTP服务器(Postfix,exim,sendmail ......),这对我来说听起来不是一个好选择。

我能想到解决该问题的最简单方法是使用Postfix来中继入站和出站电子邮件。 可以将入站电子邮件配置为通过管道传送到应用程序,并将出站电子邮件配置为由Postfix直接传送,或通过其他服务器中继。

这样,您可以使用能够解析符合RFC822的消息文件的应用程序而不是自定义SMTP服务器。这比完全相同的事情更好,但是需要实现SMTP协议的开销。

如果您需要接收大量消息,这种方法可能无法很好地扩展 - 每条消息都会分叉+执行一个新进程。如果这是一项要求,一个好方法是保持自定义SMTP服务器来完成这项工作,但让Postfix将消息转发给它 - 您将在解析器前受益于Postfix的架构。

假设您遵循将消息传递给应用程序的方法,您在Postfix中需要做的就是

  1. 配置Postfix的alias_maps'参数以查找此类地图:

    alias_maps = hash:/etc/aliases, hash:/etc/postfix/app-aliases
    
  2. 然后,配置映射以将发送到每个地址的消息传递到应用程序中:

    test:         "|/usr/local/bin/your-app"
    
  3. 像往常一样,不要忘记$ postalias app-aliases

  4. 这会将发送到test@yourdomain的邮件发送到/usr/local/bin/your-app,该邮件充当您应用程序的电子邮件网关。