使用 SendGrid 发送电子邮件


本教程介绍如何使用 SendGrid 从 Compute Engine 虚拟机 (VM) 实例上运行的应用发送电子邮件。

目标

  • 在 Compute Engine 实例上通过 Postfix 使用 SendGrid。
  • 在 Compute Engine 实例上运行的 Java 代码中使用 SendGrid。
  • 在 Compute Engine 实例上运行的 Node.js 代码中使用 SendGrid。
  • 将 CompedGrid 与 Compute Engine 实例上的 Microsoft Exchange 边缘传输服务器配合使用。

如需详细了解如何设置 SendGrid,请参阅 SendGrid 开发者文档

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

  • Compute Engine

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  5. 确保您的 Google Cloud 项目已启用结算功能

  6. 在 Google Cloud 控制台中,转到创建实例页面。

    转到“创建实例”

  7. 名称设置为 sendgrid-tutorial
  8. 启动磁盘部分中,点击更改开始配置您的启动磁盘。
  9. Public images 标签页上,选择 a Debian or CentOS image version
  10. 点击选择
  11. 如需创建虚拟机,请点击创建
  12. 使用 Google Cloud Marketplace 注册 SendGrid 电子邮件服务。记下您的 SendGrid SMTP 账号凭据,其中包括用户名、密码和主机名。您的 SMTP 用户名和密码与您注册该服务时使用的相同。SendGrid 主机名为 smtp.sendgrid.net
  13. 创建 API 密钥:
    1. 登录到 SendGrid 并转到设置 > API 密钥
    2. 创建 API 密钥。
    3. 为该密钥选择权限。该密钥必须至少具有邮件发送权限才能发送电子邮件。
    4. 点击保存以创建该密钥。
    5. SendGrid 会生成一个新的密钥。这是该密钥的唯一副本,因此请务必复制并保存该密钥以供日后使用。

使用 Postfix 从实例发送邮件

完成以下步骤以连接到您的 sendgrid-tutorial 实例并使用 Postfix 运行 SendGrid。

使用 SSH 连接到您的 sendgrid-tutorial 实例

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 在虚拟机实例列表中,点击要连接的实例所在行中的 SSH

使用 Postfix 将 SendGrid 配置为 SMTP 中继

在 SSH 终端中运行以下命令,以使用 Postfix 将 SendGrid 用作 SMTP 中继。

  1. 成为超级用户:

    sudo su -
    
  2. 设置安全 umask 值:

    umask 077
    
  3. 安装 Postfix 邮件传输代理:

    Debian

    apt update && apt -y install postfix libsasl2-modules

    CentOS

    yum install postfix cyrus-sasl-plain cyrus-sasl-md5 -y

    如果出现提示,请选择仅限本地配置并接受默认域名。

  4. 修改 Postfix 配置选项。打开 /etc/postfix/main.cf 进行修改。例如,若要使用 nano 文本编辑器,请输入以下命令:

    nano /etc/postfix/main.cf
    
  5. 更新文件:

    1. 注释掉以下几行代码:

      # default_transport = error
      # relay_transport = error
      
    2. 将以下几行代码添加到文件末尾:

      relayhost = [smtp.sendgrid.net]:2525
      smtp_tls_security_level = encrypt
      smtp_sasl_auth_enable = yes
      smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
      header_size_limit = 4096000
      smtp_sasl_security_options = noanonymous
      

      上述代码行强制支持 SSL/TLS 并为这些请求配置 SMTP 身份验证。由一个简单的访问和安全层 (SASL) 模块负责处理 Postfix 配置中的身份验证。

  6. 保存并关闭文件。

  7. 使用您在准备工作部分中生成的 API 密钥生成 SASL 密码映射。将 your-api-key 替换为您生成的 API 密钥。

    echo [smtp.sendgrid.net]:2525 apikey:your-api-key >> /etc/postfix/sasl_passwd
  8. 使用 postmap 实用程序生成一个 .db 文件:

    postmap /etc/postfix/sasl_passwd
    
  9. 验证您有一个 .db 文件:

    ls -l /etc/postfix/sasl_passwd*
    
    -rw------- 1 root root    ...  /etc/postfix/sasl_passwd
    -rw------- 1 root root    ...  /etc/postfix/sasl_passwd.db
    
  10. 移除包含您的凭据的文件,因为我们已不再需要它:

    rm /etc/postfix/sasl_passwd
    
  11. 设置 .db 文件的权限并验证已移除其他文件:

    chmod 600 /etc/postfix/sasl_passwd.db
    ls -la /etc/postfix/sasl_passwd*
    
    -rw------- 1 root root    ...  /etc/postfix/sasl_passwd.db
    
  12. 重新加载您的配置以加载修改后的参数:

    Debian

    /etc/init.d/postfix restart
    

    CentOS

    postfix reload
    

  13. 安装 mailutilsmailx 软件包:

    Debian

    apt -y install mailutils

    CentOS

    yum install mailx -y
    

  14. 发送测试电子邮件:

    echo 'message' | mail -s subject email@example.com

    替换以下内容:

    • message:电子邮件的正文。
    • subject:电子邮件的主题。
    • email@example.com:收件人电子邮件地址。

    在系统日志中查找包含 status 和表示成功的服务器响应代码 (250) 的状态行:

    Debian

    tail -n 5 /var/log/syslog
    

    CentOS

    tail -n 5 /var/log/maillog
    

在您的实例上通过 Java 发送邮件

使用 SSH 连接到您的 sendgrid-tutorial 实例

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 在虚拟机实例列表中,点击要连接的实例所在行中的 SSH

构建并发送电子邮件

以下说明利用 SendGrid Java 客户端库,通过 SendGrid 构建并发送电子邮件。您可以在 GitHub 上查看完整示例。

在您的 SSH 终端中:

  1. 成为超级用户并设置一个安全的 umask:

    sudo su -
    umask 077
    
  2. 安装 Java 和 Maven:

    apt -y update && apt -y install git-core openjdk-11-jdk maven
    
  3. 克隆 GitHub 代码库:

    git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
    
  4. 转到示例的主源代码:

    cd /root/java-docs-samples/compute/sendgrid/src/main/java/com/example/compute/sendgrid
    
  5. 打开 SendEmailServelet.java 进行修改。

    • your-sendgrid-api-key 替换为您的 SendGrid 账号的 API 密钥

    • your-sendgrid-from-email 替换为发件人电子邮件地址。

    • destination-email 替换为收件人电子邮件地址。

  6. 转到示例代码的根目录:

    cd /root/java-docs-samples/compute/sendgrid
    
  7. 打包 Java 类:

    mvn clean package
    
  8. 转到新的 target 目录:

    cd target
    
  9. 设置可让您执行 jar 文件的权限:

    chmod +x compute-sendgrid-1.0-SNAPSHOT-jar-with-dependencies.jar
    
  10. 运行备用 Java 版本选择器:

    update-alternatives --config java
    

    选择 java-11-openjdk-amd64 选项。

  11. 执行 Java 文件:

    java -jar compute-sendgrid-1.0-SNAPSHOT-jar-with-dependencies.jar
    

在您的实例上通过 Node.js 发送邮件

如需运行此示例,您必须在虚拟机实例上安装 Node.js 7.6 或更高版本。

使用 SSH 连接到您的 sendgrid-tutorial 实例

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 在虚拟机实例列表中,点击要连接的实例所在行中的 SSH

构建并发送电子邮件

在您的 SSH 终端中:

  1. 成为超级用户并设置一个安全的 umask:

    sudo su -
    umask 077
    
  2. 更新您的软件包代码库:

    Debian

    apt update
    

    CentOS

    yum update -y
    

  3. 安装 Node.js 依赖项:

    Debian

    apt -y install git-core curl build-essential openssl libssl-dev
    

    CentOS

    yum install git-core curl openssl openssl-devel -y
    yum groupinstall "Development Tools" -y
    

  4. 安装 Node.js。默认情况下,在安装过程中,系统也会安装 npm

    Debian

    curl -sL https://deb.nodesource.com/setup_14.x | sudo bash -
    sudo apt -y install nodejs
    

    CentOS

    curl --silent --location https://rpm.nodesource.com/setup_14.x | bash -
    

    然后,安装 Node.js:

    yum -y install nodejs
    

  5. 安装 SendGrid Node.js 客户端:

    npm install sendgrid
    
  6. 克隆示例代码库:

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
    
  7. 转到包含 SendGrid 示例的目录:

    cd nodejs-docs-samples/compute
    
  8. 复制 sendgrid.js 文件:

    cp sendgrid.js sendmail.js
    
  9. 打开 sendmail.js 进行修改。

    • your-sendgrid-api-key 替换为您的 SendGrid 账号的 API 密钥

    • from-email@example.com 替换为发件人电子邮件地址。

    • to-email@example.com 替换为收件人电子邮件地址。

    // This sample is based off of:
    // https://github.com/sendgrid/sendgrid-nodejs/tree/master/packages/mail
    const sendgrid = require('@sendgrid/mail');
    sendgrid.setApiKey(process.env.SENDGRID_API_KEY || '<your-sendgrid-api-key>');
    
    async function sendgridExample() {
      await sendgrid.send({
        to: 'to_email@example.com',
        from: 'from_email@example.com',
        subject: 'Sendgrid test email from Node.js on Google Cloud Platform',
        text: 'Well hello! This is a Sendgrid test email from Node.js on Google Cloud Platform.',
      });
    }
    sendgridExample();

  10. 运行该程序,通过 SendGrid 发送一封电子邮件:

    node sendmail.js
    

从 Exchange 边缘传输服务器发送邮件

您可以通过配置出站发送连接器来将 Microsoft Exchange 设置为使用 SendGrid 发送出站电子邮件。如需了解详情,请参阅在 Compute Engine 上部署 Microsoft Exchange Server 2016

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

为了避免产生费用,最简单的方法是删除您为本教程创建的项目。

如需删除项目,请执行以下操作:

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除您的 Compute Engine 实例

如需删除 Compute Engine 实例,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 选中您的 sendgrid-tutorial 实例对应的复选框。
  3. 如需删除实例,请点击更多操作,点击删除,然后按照说明操作。

后续步骤

探索有关 Google Cloud 的参考架构、图表和最佳做法。查看我们的 Cloud Architecture Center