我尝试使用自己的仅发送服务器来发送邮件。我正在运行此 SMTP 网关以使用 TLS,因此我用来发送邮件的客户端需要证书。我使用的是自签名证书,如果使用 postfix/ssmtp 发送邮件,这很容易配置,但我不确定如何在 Discourse 邮件客户端中使用自定义证书。
为了简要说明情况:
简单场景:
Discourse —发送—邮件—> Mailgun —发送—邮件—> 用户
我的场景:
Discourse —发送—邮件—> 运行 SMTP 网关的我的服务器 —使用 AWS SES API 中继邮件—> 用户
谢谢。
我想更正一下我的问题。我确实不需要添加任何证书即可使其工作,但它仍然无法通过 TLS 进行通信。如果我使用 swaks 进行测试,则一切正常。示例命令:
swaks --to user@example.com --from me@example.com --auth PLAIN --auth-user myusername -tls -s smtp.somehost.com:2525
您可以直接使用 AWS SES SMTP 来实现这一功能,为什么还要搭建本地中继呢?
@itsbhanusharma AWS SES 每月提供 6 万封免费邮件。据我所知,这些邮件调用需要从 EC2 实例发起才能享受免费,否则将按正常费率收费。我的 Discourse 实例托管在 DigitalOcean 的 Droplet 上。我可能说错了,但这是我的理解和背后的理由。
因此,即使您的 SES API 从 DigitalOcean 的 IP 地址接收邮件,这也会产生费用。您可以考虑使用其他服务,或在 EC2 实例上部署 Exim,作为您的 DigitalOcean Droplet 与 AWS SES 之间的桥梁。我不确定这是否可行,但您可以尝试一下。
理论上,流程应如下:
- Discourse(运行在 DigitalOcean 上)将邮件发送至 EC2 中的 Exim IP 地址
- EC2 将来自 DigitalOcean 的邮件中继至 SES
- SES 将邮件投递给最终用户。
我已经通过在 EC2 上运行本地 SMTP 服务器解决了中继问题,该服务器最终会将 SMTP 请求转发到 SES。问题在于 Discourse 与该 SMTP 服务器的 TLS 握手失败,而 Postfix、Swaks 等类似应用程序则运行正常。
解决该问题应很简单,只需使用端口 25(无需加密)即可。
我能否查看 SMTP 握手是在哪里处理的?比如 Discourse 在 Ruby 背后使用了哪些库?我不想在此处禁用 TLS。
然后使用有效的 SSL 证书(即使是 Let’s Encrypt 也可以正常工作)
不知为何,使用 Let’s Encrypt 的有效证书并没有解决问题。我也不清楚原因。
但在 app.yaml 中设置以下内容后,邮件功能现在可以正常使用了。
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
也许有更懂 SMTP 的人能解释为什么这样设置会生效,不过目前对我来说已经够用了。
Stephen
(Stephen)
11
这最终是否比将 Discourse 实例直接迁移到 S3 更便宜?
我有一台在 AWS 上运行的 5 美元 EC2 实例,用于中继多个域名。将 Discourse 迁移到 EC2 会比 Digital Ocean 稍贵一些,但说实话,贵不了多少(总共也就几美元)。
不过,关键在于,即使将 Discourse 迁移到 EC2,我仍然需要这个中继服务来支持我在 Digital Ocean 上为其他域名拥有的其余 Droplets。所以,为什么不直接修复 Discourse 呢:slight_smile:
Stephen
(Stephen)
13
好吧,既然你自己也承认 Discourse 并没有问题,它与 SES 的接口运行得非常顺畅。
你这样做只是为了绕过 SES 关于免费转发邮件的限制。
确实如此,但 Discourse 在此处与 SES 无关。Discourse 是与 SMTP 服务器通信,该服务器可以是任何服务(目前是一个中继服务)。我想知道为什么 postfix、swaks 等工具与同一 DigitalOcean VPC 中的这台 SMTP 服务器配合使用一切正常,而 Discourse 却不行。设置该变量后问题已解决,但我仍想了解 Discourse 使用的是哪个库来执行 SMTP 握手,以便我亲自验证是否有可改进之处。