使用 Mailjet 发送电子邮件


Mailjet 是一项第三方全球电子邮件服务,该服务为 Compute Engine 用户提供一个免费层级,每月可免费发送 6,000 封电子邮件。此外,Mailjet 还提供以下功能和特性:

  • 用于发送交易和营销电子邮件的 API、界面和 SMTP 中继。
  • 符合欧洲数据隐私合规要求。
  • 电子邮件和可递送性功能,例如可自定义的优先级设置和自动限制管理。
  • Go、PHP、Nodejs、Java、Python 和 Ruby 版 API 资源库,用于管理子账号、身份验证、联系人、广告系列、自定义载荷、统计信息、实时事件以及通过 Event API 进行解析。
  • 集成的 MJML 框架,用于创建自适应 HTML 电子邮件模板。
  • 全天候提供 4 种以上语言支持。
  • 支持从 gmail.com 以外的网域发送电子邮件。

本文档介绍如何使用以下方法配置虚拟机实例以通过 Mailjet 发送邮件:

  • 通过 SMTP 中继使用以下项发送:
  • 直接通过使用 Java 的 Mailjet API 发送

有关其他电子邮件解决方案的详尽文档,包括与最常见 SMTP 服务器、库和框架集成的示例,请参阅 Mailjet 的文档

准备工作

  1. 在 Mailjet 的 Google 合作伙伴页面* 上创建一个新的 Mailjet 账号。 注册时,请提供您要用来发送电子邮件的网域和电子邮件地址。

  2. 获取您的 Mailjet SMTP 账号凭据

  3. 确保您要从中发送电子邮件的电子邮件地址已通过验证

  4. 设置防火墙规则以允许 TCP 流量进入端口 2525。

* Google 会因为客户注册付费账号而获得报酬。

将 Mailjet 配置为 SMTP 中继

将 Mailjet 配置为邮件中继后,您可以将电子邮件转发到 Mailjet 进行远程递送。

使用 Postfix

  1. 使用 SSH 连接到您的虚拟机,将 instance-name 替换为您要从中发送电子邮件的实例的名称:

    gcloud compute ssh instance-name
  2. 在虚拟机上,安装 Postfix 邮件传输代理。出现提示时,请接受默认的域名选项,但选择 Local Only 配置。

    Debian

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

    CentOS

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

  3. 修改 Postfix 配置选项。Postfix 配置选项在 main.cf 文件中设置。使用您所选的文本编辑器打开该文件:

    sudo vi /etc/postfix/main.cf
    
  4. 更新文件:

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

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

      relayhost = in-v3.mailjet.com:2525
      smtp_tls_security_level = encrypt
      smtp_sasl_auth_enable = yes
      smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
      smtp_sasl_security_options = noanonymous
      

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

    3. 保存更改并关闭该文件。

  5. 使用您所选的文本编辑器创建 SASL 密码映射:

    sudo vi /etc/postfix/sasl_passwd
    
  6. sasl_passwd 文件中添加以下配置行,为 Mailjet 提供凭据:

    in-v3.mailjet.com:2525 YOUR_API_KEY:YOUR_SECRET_KEY
    
  7. 使用 postmap 实用程序生成一个 .db 文件:

    sudo postmap /etc/postfix/sasl_passwd
    sudo ls -l /etc/postfix/sasl_passwd*
    

    您应该会收到以下响应:

    -rw------- 1 root root    68 Jun  1 10:50 /etc/postfix/sasl_passwd
    -rw------- 1 root root 12288 Jun  1 10:51 /etc/postfix/sasl_passwd.db
    
  8. 接着,移除包含您凭据的文件,因为将不再需要该文件:

    sudo rm /etc/postfix/sasl_passwd
    
  9. 设置您 .db 文件的权限:

    sudo chmod 600 /etc/postfix/sasl_passwd.db
    sudo ls -la /etc/postfix/sasl_passwd.db
    
  10. 最后,重新加载您的配置以加载修改后的参数:

    Debian

    sudo /etc/init.d/postfix restart
    

    CentOS

    sudo postfix reload
    

  11. 测试您的配置。安装 mailxmailutils 软件包并测试您的配置。

    Debian

    sudo apt -y install mailutils
    

    CentOS

    sudo yum install mailx -y
    

    发送一封测试邮件:

    echo 'Test passed.' | mail -s 'Test-Email' -aFrom:from-email destination-email

    请替换以下内容:

    • from-email已通过验证的电子邮件地址。
    • destination-email:用于接收电子邮件的目标地址。

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

    Debian

    sudo tail -n 5 /var/log/syslog
    

    CentOS

    sudo tail -n 5 /var/log/maillog
    

如果您在使用 Mailjet 设置 Postfix 时遇到问题,请参阅 Mailjet Postfix 设置说明

使用 Nodemailer

以下说明将介绍如何在 Debian Wheezy 上通过 Node.js 来使用 Mailjet。

Debian
  1. 使用 SSH 连接到您的实例:
    gcloud compute ssh instance-name
  2. 更新您的软件包代码库:
    user@test-wheezy:~# sudo apt update
  3. 安装 Node.js 依赖项:
    user@test-wheezy:~# sudo apt -y install git-core curl build-essential openssl libssl-dev
  4. 从 GitHub 克隆 Node.js 代码库:
    user@test-wheezy:~# git clone https://github.com/nodejs/node
  5. 将当前目录切换到 Node.js 源代码树:
    user@test-wheezy:~# cd node
  6. 为此操作系统和虚拟机配置节点软件:
    user@test-wheezy:~# ./configure
  7. 构建 Node.js、npm 和相关对象:
    user@test-wheezy:~# sudo make

    此操作可能需要几分钟时间才能完成。

  8. 在默认位置安装 Node.js、npm 和其他软件:
    user@test-wheezy:~# sudo make install
  9. 安装 mailer 软件包:
    user@test-wheezy:~# npm install nodemailer nodemailer-smtp-transport
  10. node 目录中,创建一个名为 sendmail.js 的新文件,其中包含以下 JavaScript 代码:
    const mailer = require('nodemailer');
    const smtp = require('nodemailer-smtp-transport');
    
    async function mailjet() {
      const transport = mailer.createTransport(
        smtp({
          host: 'in.mailjet.com',
          port: 2525,
          auth: {
            user: process.env.MAILJET_API_KEY || '<your-mailjet-api-key',
            pass: process.env.MAILJET_API_SECRET || '<your-mailjet-api-secret>',
          },
        })
      );
    
      const json = await transport.sendMail({
        from: 'ANOTHER_EMAIL@ANOTHER_EXAMPLE.COM', // From address
        to: 'EMAIL@EXAMPLE.COM', // To address
        subject: 'test email from Node.js on Google Cloud Platform', // Subject
        text: 'Hello!\n\nThis a test email from Node.js.', // Content
      });
      console.log(json);
    }
    mailjet();
  11. 运行该程序,通过 Mailjet 发送一封电子邮件:
    user@test-wheezy:~# node sendmail.js
CentOS
  1. 使用 SSH 连接到您的实例:
    gcloud compute ssh instance-name
  2. 更新软件包代码库:
    user@test-centos:~# sudo yum update -y
  3. 安装 Node.js 依赖项:
    user@test-centos:~# sudo yum install git-core curl openssl openssl-dev -y
    ...
    user@test-centos:~# sudo yum groupinstall "Development Tools" -y
    ...
  4. 从 GitHub 克隆 Node.js 代码库:
    user@test-centos:~# git clone https://github.com/nodejs/node
  5. 将当前目录切换到 Node.js 源代码树:
    user@test-centos:~# cd node
  6. 为此操作系统和虚拟机配置节点软件:
    user@test-centos:~# ./configure
  7. 构建 Node.js、npm 和相关对象:
    user@test-centos:~# sudo make

    此操作可能需要几分钟时间才能完成。

  8. 在默认位置安装 Node.js、npm 和其他软件:
    user@test-centos:~# sudo make install
  9. 安装 mailer 软件包:
    user@test-centos:~# npm install npm install nodemailer nodemailer-smtp-transport
  10. node 目录中,创建一个名为 sendmail.js 的新文件,其中包含以下 JavaScript 代码:
    const mailer = require('nodemailer');
    const smtp = require('nodemailer-smtp-transport');
    
    async function mailjet() {
      const transport = mailer.createTransport(
        smtp({
          host: 'in.mailjet.com',
          port: 2525,
          auth: {
            user: process.env.MAILJET_API_KEY || '<your-mailjet-api-key',
            pass: process.env.MAILJET_API_SECRET || '<your-mailjet-api-secret>',
          },
        })
      );
    
      const json = await transport.sendMail({
        from: 'ANOTHER_EMAIL@ANOTHER_EXAMPLE.COM', // From address
        to: 'EMAIL@EXAMPLE.COM', // To address
        subject: 'test email from Node.js on Google Cloud Platform', // Subject
        text: 'Hello!\n\nThis a test email from Node.js.', // Content
      });
      console.log(json);
    }
    mailjet();
  11. 运行该程序,通过 Mailjet 发送一封电子邮件:
    user@test-centos:~# node sendmail.js

通过使用 Java 的 Mailjet API 发送邮件

如需查看使用 Mailjet API 的更多示例,请参阅官方 Mailjet 文档

Debian
  1. 使用 SSH 连接到您的实例:
    gcloud compute ssh instance-name
  2. 更新您的软件包代码库并安装所需的软件包:
    user@test-instance:~# sudo apt update && sudo apt install git-core openjdk-8-jdk maven
  3. 从 GitHub 克隆 Java 代码库:
    user@test-instance:~# git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
  4. 转到本示例的主要源代码所在的目录,位于:
    /root/java-docs-samples/compute/mailjet/src/main/java/com/example/compute/mailjet
  5. 配置您的 Mailjet 设置。请参阅 Mailjet 身份验证文档,了解如何替换以下变量:

    • your-mailjet-api-key:您的 Mailjet 账号的对应 API 密钥。
    • your-mailjet-secret-key:您的 Mailjet 账号的对应密钥。

    public class MailjetSender {
    
      public static void main(String[] args) throws MailjetException {
        final String mailjetApiKey = "YOUR-MAILJET-API-KEY";
        final String mailjetSecretKey = "YOUR-MAILJET-SECRET-KEY";
        ClientOptions options =
            ClientOptions.builder().apiKey(mailjetApiKey).apiSecretKey(mailjetSecretKey).build();
        MailjetClient client = new MailjetClient(options);
    
        MailjetSender sender = new MailjetSender();
        sender.sendMailjet(args[0], args[1], client);
      }
    
      public MailjetResponse sendMailjet(String recipient, String sender, MailjetClient client)
          throws MailjetException {
        MailjetRequest email =
            new MailjetRequest(Emailv31.resource)
                .property(
                    Emailv31.MESSAGES,
                    new JSONArray()
                        .put(
                            new JSONObject()
                                .put(
                                    Emailv31.Message.FROM,
                                    new JSONObject().put("Email", sender).put("Name", "pandora"))
                                .put(
                                    Emailv31.Message.TO,
                                    new JSONArray().put(new JSONObject().put("Email", recipient)))
                                .put(Emailv31.Message.SUBJECT, "Your email flight plan!")
                                .put(
                                    Emailv31.Message.TEXTPART,
                                    "Dear passenger, welcome to Mailjet!" 
                                    + "May the delivery force be with you!")
                                .put(
                                    Emailv31.Message.HTMLPART,
                                    "<h3>Dear passenger, welcome to Mailjet!</h3>"
                                    + "<br />May the delivery force be with you!")));
    
        try {
          // trigger the API call
          MailjetResponse response = client.post(email);
          // Read the response data and status
          System.out.println(response.getStatus());
          System.out.println(response.getData());
          return response;
        } catch (MailjetException e) {
          System.out.println("Mailjet Exception: " + e);
          return null;
        }
      }
    }
  6. mailjet 目录中,使用 Maven 将类打包为一个 JAR 文件:
    user@test-instance:~# mvn clean package
  7. 确保您使用的是 OpenJDK 8:
    user@test-instance:~# sudo update-alternatives --config java
  8. 要发送电子邮件,请用您的收件人和发件人电子邮件地址作为参数,从打包目标目录运行此 JAR 文件:
    user@test-instance:~# java -jar
            compute-mailjet-1.0-SNAPSHOT-jar-with-dependencies.jar
            recipient-email sender-email
CentOS
  1. 使用 SSH 连接到您的实例:
    gcloud compute ssh instance-name
  2. 更新您的软件包代码库并安装所需的软件包:
    user@test-centos:~# sudo yum update && sudo yum install git-core openjdk-8-jdk maven
  3. 从 GitHub 克隆 Java 代码库:
    user@test-centos:~# git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
  4. 转到本示例的主要源代码所在的目录,位于:
    /root/java-docs-samples/compute/mailjet/src/main/java/com/example/compute/mailjet
  5. 配置您的 Mailjet 设置。如需了解如何替换以下变量,请参阅 Mailjet 身份验证文档:

    • your-mailjet-api-key:您的 Mailjet 账号的对应 API 密钥。
    • your-mailjet-secret-key:您的 Mailjet 账号的对应密钥。

    public class MailjetSender {
    
      public static void main(String[] args) throws MailjetException {
        final String mailjetApiKey = "YOUR-MAILJET-API-KEY";
        final String mailjetSecretKey = "YOUR-MAILJET-SECRET-KEY";
        ClientOptions options =
            ClientOptions.builder().apiKey(mailjetApiKey).apiSecretKey(mailjetSecretKey).build();
        MailjetClient client = new MailjetClient(options);
    
        MailjetSender sender = new MailjetSender();
        sender.sendMailjet(args[0], args[1], client);
      }
    
      public MailjetResponse sendMailjet(String recipient, String sender, MailjetClient client)
          throws MailjetException {
        MailjetRequest email =
            new MailjetRequest(Emailv31.resource)
                .property(
                    Emailv31.MESSAGES,
                    new JSONArray()
                        .put(
                            new JSONObject()
                                .put(
                                    Emailv31.Message.FROM,
                                    new JSONObject().put("Email", sender).put("Name", "pandora"))
                                .put(
                                    Emailv31.Message.TO,
                                    new JSONArray().put(new JSONObject().put("Email", recipient)))
                                .put(Emailv31.Message.SUBJECT, "Your email flight plan!")
                                .put(
                                    Emailv31.Message.TEXTPART,
                                    "Dear passenger, welcome to Mailjet!" 
                                    + "May the delivery force be with you!")
                                .put(
                                    Emailv31.Message.HTMLPART,
                                    "<h3>Dear passenger, welcome to Mailjet!</h3>"
                                    + "<br />May the delivery force be with you!")));
    
        try {
          // trigger the API call
          MailjetResponse response = client.post(email);
          // Read the response data and status
          System.out.println(response.getStatus());
          System.out.println(response.getData());
          return response;
        } catch (MailjetException e) {
          System.out.println("Mailjet Exception: " + e);
          return null;
        }
      }
    }
  6. mailjet 目录中,使用 Maven 将类打包为一个 JAR 文件:
    user@test-centos:~# mvn clean package
  7. 确保您使用的是 OpenJDK 8:
    user@test-centos:~# sudo alternatives --config java
  8. 如需发送电子邮件,请用您的收件人和发件人电子邮件地址作为参数,从打包目标目录运行此 JAR 文件:
    user@test-centos:~# java -jar
            compute-mailjet-1.0-SNAPSHOT-jar-with-dependencies.jar
            recipient-email sender-email

Mailjet SMTP 设置

以下是专门适用于 Mailjet 的 SMTP 设置的快速参考信息,这些设置用于配置客户端:

  • 主机:in-v3.mailjet.com
  • 端口:2525

后续步骤

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