从 App Engine Mail API 迁移到基于 SMTP 的服务

为了提高邮件安全性并确保可靠地发送大量邮件,请从旧版 Mail API 迁移到使用简单邮件传输协议 (SMTP) 的标准第三方邮件服务提供商服务,例如 SendGridMailgunMailjet

本指南介绍了将出站邮件服务从 Mail API 迁移到基于 SMTP 的邮件服务的流程。您可以按照这些说明迁移到任何基于 SMTP 的第三方邮件服务提供商,也可以使用其他受支持的运行时。本指南未提供有关迁移使用第三方替代方案的入站消息传递的步骤。

与旧版 App Engine Mail API 相比,SMTP 标准具有以下优势:

  • 基于 SMTP 的服务可降低邮件被标记为垃圾邮件的可能性,从而提高邮件递送率。

  • 对于基于 SMTP 的服务,您可以访问有关邮件打开、点击和退回的详细分析报告。这些报告可提供有关用户如何与您的邮件互动的有用信息。

  • 您可以完全控制发件人声誉和邮件身份验证。

  • 与旧版 Mail API 相比,每日发信上限更高,并且可以使用 A/B 测试、细分和模板等高级功能。

迁移过程概览

迁移过程包括以下步骤:

  1. 设置基于 SMTP 的邮件服务,以获取您的 SMTP 凭证。
  2. 验证发件人身份,以通过网域或邮箱进行身份验证。
  3. 使用 SMTP 凭证和发送方法配置源文件,然后部署应用。
  4. 测试应用,以检查邮件功能。

设置基于 SMTP 的邮件服务

在采用 SMTP 的标准第三方邮件服务提供商(例如 SendGrid、Mailgun 或 Mailjet)处设置账号,然后从所选提供商处检索以下信息:

  • SMTP 主机:用于发送邮件的 SMTP 服务器地址。例如 smtp.sendgrid.netexample.mailjet.com

  • 端口:连接的端口号。例如,587 用于 TLS 加密。

  • 用户名:您账号的 SMTP 登录用户名。

  • 密码或 API 密钥:您的账号密码或 API 密钥,用作 SMTP 连接的密码。对于某些提供商(例如 SendGrid),用户名是固定值(例如 apikey),而 API 密钥用作密码。

验证发件人身份

为防范垃圾邮件,所有邮件服务都要求您验证自己是否是您用来发送邮件的邮箱或网域的所有者。此步骤通常涉及向域名托管服务商的 DNS 管理页面添加特定的 DNS 详细信息,例如 CNAME 记录。

请按照提供商的说明验证发件人身份,然后再继续进行应用配置。

如需将 DNS 记录添加到您的域名托管服务商,请按照以下步骤操作:

  1. 登录您的 DNS 提供商服务。
  2. 前往您网域的 DNS 管理页面。
  3. 完全按照邮件服务提供商提供的 CNAME 记录添加。对于每条记录,请执行以下操作:

    • 名称主机字段中,输入主机详细信息。
    • 积分字段中,输入相应值。

DNS 更改可能需要几小时才能生效。如果验证失败,请等待一段时间,然后重试。

配置源文件

如需添加 SMTP 功能,请按照以下步骤操作:

  1. 运行以下命令以安装 Maven:

    sudo apt install maven
    
  2. pom.xml 文件中添加以下代码,以切换到 SMTP 服务:

    1. 添加 appengine-api-1.0-sdk 依赖项的版本:

       <dependency>
         <groupId>com.google.appengine</groupId>
         <artifactId>appengine-api-1.0-sdk</artifactId>
         <version>2.0.38</version>
       </dependency>
      
    2. 更新项目 ID:

        <configuration>
          <deploy.projectId>PROJECT-ID</deploy.projectId>
          <deploy.version>1</deploy.version>
        </configuration>
      

      请将 PROJECT-ID 替换为您的 Google Cloud 项目 ID。

  3. appengine-web.xml 文件中添加以下环境变量,以纳入您的 SMTP 发件人配置:

    ...
    <runtime>RUNTIME</runtime>
    <service>default</service>
    <threadsafe>true</threadsafe>
    <app-engine-apis>true</app-engine-apis>
    <env-variables>
    <!-- This is the master switch to enable the SMTP service.-->
    <env-var name="APPENGINE_USE_SMTP_MAIL_SERVICE" value="true" />
    <!-- SMTP Server Configuration -->
    <!-- The server address from your mail provider.-->
    <env-var name="APPENGINE_SMTP_HOST" value="SMTP_HOST" />
    <!-- The recommended port for TLS connections. -->
    <env-var name="APPENGINE_SMTP_PORT" value="587" />
    <!-- The username for your SMTP login. -->
    <env-var name="APPENGINE_SMTP_USER" value="SMTP_USER" />
    <!-- The API key or password -->
    <env-var name="APPENGINE_SMTP_PASSWORD" value="SMTP_PASSWORD" />
    <!--  Use TLS for a secure connection. -->
    <env-var name="APPENGINE_SMTP_USE_TLS" value="true" />
    </env-variables>
    ...
    </appengine-web-app>
    

    替换以下内容:

    • RUNTIME受支持的 Java 运行时版本。
    • SMTP_HOST:SMTP 主机地址。例如 smtp.sendgrid.netexample.mailjet.com
    • SMTP_USER:您账号的 SMTP 登录用户名。例如 apiKey
    • SMTP_PASSWORD:从第三方邮件服务提供商处获取的密码或 API 密钥。为了提高安全性,我们建议您使用 Secret Manager 存储 API 密钥,而不是将其放在 appengine-web.xml 文件中。
  4. 运行以下命令以部署应用:

    mvn package appengine:deploy
    

测试您的应用

如果您能够部署应用并且没有出现错误,则迁移成功。如需验证您的邮件服务是否正常运行,请按照以下步骤操作:

  1. 触发应用中发送邮件的部分。
  2. 检查 Logs Explorer,以确保没有与 API 调用或 SMTP 连接尝试相关的错误。
  3. 登录您的第三方邮件服务提供商的账号(例如,Mailgun、Mailjet、SendGrid),并检查其活动动态、日志或递送信息中心。您的测试邮件应显示在 Feed 中,且递送状态标记为 ProcessedDelivered 或类似内容。

后续步骤