使用 SendGrid 发送电子邮件

本教程将介绍如何使用 SendGrid 从 Compute Engine 实例上运行的应用发送电子邮件。SendGrid 是第三方电子邮件服务,可供 Compute Engine 用户免费试用,允许他们每月免费发送 12000 封事务性邮件。

目标

  • 在 Compute Engine 实例上通过 Postfix 使用 SendGrid。
  • 在 Compute Engine 实例上运行的 Java 代码中使用 SendGrid。
  • 在 Compute Engine 实例上运行的 Node.js 代码中使用 SendGrid。

费用

本教程使用 Cloud Platform 的可计费组件,包括 Google Compute Engine。

Cloud Platform 新用户可能有资格免费试用

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册新帐号

  2. 选择或创建 Google Cloud Platform 项目。

    转到“管理资源”页面

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

    了解如何启用结算功能

  4. 在 GCP Console 中,转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  5. 点击创建实例
  6. 名称设置为 sendgrid-tutorial
  7. 启动磁盘部分中,点击更改开始配置您的启动磁盘。
  8. 操作系统映像 标签页中,选择 Debian 或 CentOS 映像

  9. 点击选择
  10. 点击创建以创建实例。
  11. 使用 GCP Marketplace 注册 SendGrid 电子邮件服务。记下您的 SendGrid SMTP 帐号凭据,其中包括用户名、密码和主机名。您的 SMTP 用户名和密码与您用于注册该服务的用户名和密码相同。SendGrid 主机名是 smtp.sendgrid.net。
  12. 创建一个 API 密钥:
    1. 登录到 SendGrid 并转到设置 > API 密钥
    2. 创建一个 API 密钥。
    3. 选择该密钥的权限。密钥至少需要拥有 Mail send 权限才能发送电子邮件。
    4. 点击 Save 以创建密钥。
    5. SendGrid 会生成一个新的密钥。这是密钥的唯一副本,因此请务必复制并保存该密钥以供日后使用。

在您的实例上利用 Postfix 发送邮件

执行以下步骤连接到您的 sendgrid-tutorial 实例,并通过 Postfix 运行 SendGrid。

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

  1. 在 GCP Console 中,转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

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

使用 Postfix 将 SendGrid 配置为 SMTP 中继

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

  1. 成为超级用户:

    sudo su -
    
  2. 设置安全撤销掩码:

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

    Debian

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

    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 密码映射:

    echo [smtp.sendgrid.net]:2525 apikey:[YOUR_API_KEY] >> /etc/postfix/sasl_passwd
    

    其中 [YOUR_API_KEY] 是您已生成的 API 密钥。

  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.db
    
    -rw------- 1 root root    ...  /etc/postfix/sasl_passwd.db
    
  12. 重新加载您的配置以加载修改后的参数:

    Debian

    /etc/init.d/postfix restart
    

    CentOS

    postfix reload
    

  13. 安装 mailutilsmailx 包:

    Debian

    apt-get install mailutils -y

    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. 在 GCP Console 中,转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

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

构建并发送电子邮件

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

在您的 SSH 终端中:

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

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

    apt-get update -y && apt-get install git-core openjdk-8-jdk maven -y
    
  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-8-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. 在 GCP Console 中,转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

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

构建并发送电子邮件

在您的 SSH 终端中:

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

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

    Debian

    apt-get update
    

    CentOS

    yum update -y
    

  3. 安装 Node.js 依赖项:

    Debian

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

    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_6.x | sudo -E bash -
    sudo apt-get install -y nodejs
    

    CentOS

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

    然后,安装 Node.js:

    yum -y install nodejs
    

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

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

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

    cd nodejs-compute/samples
    
  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
    

清理

为避免因本教程中使用的资源而导致您的 Google Cloud Platform 帐号产生费用,请执行以下操作:

删除项目

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

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

  1. 在 GCP Console 中,转到“项目”页面。

    转到“项目”页面

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

删除您的 Compute Engine 实例

要删除 Compute Engine 实例,请运行以下命令:

  1. 在 GCP Console 中,转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击您的sendgrid-tutorial实例旁边的复选框。
  3. 点击页面顶部的删除按钮以删除实例。

后续步骤

亲自试用其他 Google Cloud Platform 功能。查阅我们的教程

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档