使用 SendGrid 发送电子邮件

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

目标

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

费用

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

Google Cloud 新用户可能有资格申请免费试用

准备工作

  1. 登录您的 Google 帐号。

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

  2. 在 GCP Console 的项目选择器页面上,选择或创建 GCP 项目。

    转到项目选择器页面

  3. 确保您的 Google Cloud Platform 项目已启用结算功能。 了解如何确认您的项目已启用结算功能

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

    转到“虚拟机实例”页面

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

  9. 点击选择
  10. 点击创建以创建实例。
  11. 使用 Google Cloud 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 实例

使用 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 实例

构建并发送电子邮件

以下说明利用 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 实例

构建并发送电子邮件

在您的 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. 在项目列表中,选择您要删除的项目,然后点击删除 delete。
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除您的 Compute Engine 实例

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

后续步骤

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

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

发送以下问题的反馈:

此网页
Compute Engine 文档