使用 SMTP 中继在 AWS EC2 上设置 Postfix

使用 SMTP 中继在 AWS EC2 上设置 Postfix

在 ec2 实例上,IP 是动态的,如果我想使用第三方 SMTP 网关(例如 sendgrid),以下字段的建议值是什么?

myorigin
myhostname 
mydestination

假设我的实例主机名 (FQDN) 是

ip-12-34-56-78.us-west-2.compute.internal

而且我没有任何其他主机名映射到这台机器,因为它本质上是纯动态的,但是,我可以通过以下地址接收电子邮件[email protected]

更新:我无法使用弹性 IP,因为每个区域只有 5 个,并且我想要一个无需使用固定 IP 即可工作的解决方案。

答案1

在 ec2 实例上,IP 是动态的,

这是恰恰什么EC2 弹性 IP是。获取一个 EIP,将其与您的服务器关联,然后您可以将适当的 DNS 记录指向该 EIP。

答案2

我有一个类似的通过 mailgun 进行中继的设置。

首先,您可以使用以下方法获取实例的公共 IP:

http://169.254.169.254/latest/meta-data/public-ipv4

在实例内部,就我而言,我使用业务流程编排(即 Chef + OpsWorks)在启动时为实例自动在 Route53 中创建 DNS 记录。

您可能还会使用:

http://169.254.169.254/latest/meta-data/public-hostname

获取实例主机名,然后将其插入到您的 postfix 配置中。

我使用 servername.servers.mydomain.com (在启动时自动创建)作为hostnameandmydomainmydestination空。

我还必须在 /etc/postfix/transport 中创建一个传输文件,其内容如下:

*                smtp:smtp.mailgun.org

答案3

首先,大多数第三方 SMTP 网关提供商支持将其服务用作经过身份验证的加密中继主机:

关键是,您不必使用 IP 地址或主机名进行访问控制。您使用加密 (TLS) 和身份验证,因此一旦设置了身份验证,SMTP 提供商就应该“信任”来自您本地 postfix 实例的所有邮件。大多数sendmail也有使用方法。

至于配置值:

  • myorigin肯定应该是example.com- 您希望用户看到您的邮件来自哪里。
  • 我认为myhostname将被设置为:
    1. 保留myhostname默认设置,因为这对你的 SMTP 提供商来说无关紧要
    2. 出于同样的原因,只需将其硬编码myhostname为任意名称即可aws-web.example.com- 这对你的 SMTP 提供商来说并不重要
  • mydestination应保留为默认设置 - 您不会在本地传递任何邮件。

如果你想变得非常花哨,你也可以使用sender_dependent_relayhost_maps选项。

最后,您还没有描述您使用什么从 EC2 实例发送电子邮件。根据语言和库(我正在查看您php 邮件)您的邮件提交代理(MSA)可能会做一些奇怪的事情来破坏您的消息,可能会忽略上面设置的值。php mail 是臭名昭著的,因为在大多数系统上它试图调用二进制文件sendmail,您必须明确解决这个问题,以防止以运行 Web 服务器的用户身份发送消息(例如www-dataapache

答案4

sendgrid 使用基于密码的身份验证(配置详情见下文)。它不会关心您的 IP 或您使用的主机名(myhostname、myorigin 等)。

您的服务器在 HELO(或 EHLO)问候语中向 sendgrid 提供的主机名可能会出现在邮件标头中。某些收件人的垃圾邮件软件可能会检查它,因此请使用公共 DNS 中确实存在且不与可疑域关联的名称,但很少有系统会注意到这些内容。做得好是好事,但并不重要。

我有一个配置,我通过 sendgrid 为多个域发送邮件,因此 postfix 需要知道每个发件人域使用哪个 sendgrid 帐户。(如果它不是已知的发件人域,它会通过本地中继发送,而不使用 sendgrid)。这并不是您真正想要的,但我猜您认为的问题与域名有关,而您的 IP 转移实际上与使用 sendgrid 进行身份验证有关。

主文件:

relayhost = smtp.example.com
smtp_sender_dependent_authentication = yes
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous

在/etc/postfix/sender_relay中:

@domain1.example.com       [smtp.sendgrid.net]:submission
@domain2.example.com       [smtp.sendgrid.net]:submission

在 /etc/postfix/sasl_passwd 中:

@domain1.example.com       sendgrid-user-1:Pa$$w0rd1
@domain2.example.com       sendgrid-user-2:Pa$$w0rd2

相关内容