65.9K
CodeProject 正在变化。 阅读更多。
Home

Google Cloud Platform 的无服务器实验:第二部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (2投票s)

2017 年 7 月 1 日

CPOL

3分钟阅读

viewsIcon

10439

在云函数中发送和接收电子邮件

6. 电子邮件服务

第一部分,你应该知道 Google Cloud Platform (GCP) 的Functions是在发生某事时调用的代码片段。对于各种小型任务,您无需支付自己的全职服务器费用。

发送电子邮件的问题似乎是选择许多 Node.JS 模块中的一个(只需搜索“send email nodejs”)。或者也许学习一些像Gmail API这样的东西,我也从未尝试过。

但是,如果没有永久运行的电子邮件服务器,谁会接收电子邮件?幸运的是,有各种服务可以代替我们完成这项工作。进入 k Email/SMShttps://elements.heroku.com/addons上查看一些。

由于只需注册一次,我选择了Mailgun,它既可以发送也可以接收。

实际上,处理一万封(也许https://www.mailgun.com/google与 GCP 结合使用)电子邮件是免费的。如果您不需要自己的电子邮件域(不要试图通过Mailgun征服整个gmail.com),这意味着当您对类似sandbox1234567890abcdefghijklmnopqrst.mailgun.org的内容满意时,因为您仅将电子邮件用作服务之间的偶然转换媒介或少数授权的电子邮件收件人,那么您无需支付任何费用。

注册只需要一个能够接收 SMS 的电话,并且在不输入任何付款方式的情况下即可正常工作,有一些限制。可以在稍后在帐户设置中设置付款方式

为了清楚起见,Mailgun 是一个用于发送和接收的服务的。它不会永久存储电子邮件,但它允许临时存储

6.1. 发送电子邮件

注册后,进入您的Mailgun dashboard

在底部,您将看到您的沙盒域名(类似于sandbox1234567890abcdefghijklmnopqrst.mailgun.org)。点击它会出现API Base URL(类似于)和API Key(例如key-abcdefghijklmnopqrst1234567890)。

API Key等同于仪表板主页右侧可见的Secret API Key

沙盒域名仅限于授权收件人。使用按钮进入Authorized Recipients 此处Invite new一个。收件人必须通过Agree链接回复邀请电子邮件,因此请与您自己的电子邮件开始实验。假设它是yourname@gmail.com

切换到 GCP 控制台此处,在Cloud Functions中,创建一个具有 http 触发器的新函数(更多详细信息请参阅第一部分)。

不要忘记在index.js中输入您的电子邮件、API keyAPI Base URL

/**
 * sends email using mailgun's https api
 *
 * @param {!Object} req Cloud Function request context.
 * @param {!Object} res Cloud Function response context.
 */
exports.sendEmailFunction = function sendEmailFunction(req, res) {
    
//based on https://github.com/shz/node-mailgun/blob/master/mailgun.js
//https://documentation.mailgun.com/quickstart-sending.html#send-via-api
var request = require("request");

var mailgunapiKey = new Buffer('api:' + "key-abcdefghijklmnopqrst1234567890").toString('base64');

var mailFormData = {
    from: "mailgun@mailgun.org",
    to: "yourname@gmail.com",
    subject: "sendEmailFunction",
    text: "Hallo from cloud"
  };
  
request({
  uri: "https://api.mailgun.net/v3/sandbox1234567890abcdefghijklmnopqrst.mailgun.org/messages",
  headers: {'User-Agent': 'request',
            'Authorization': 'Basic ' + mailgunapiKey,
           },
  method: "POST",
  form: mailFormData,
}, function(error, response, body) {
            res.status(200).send('Success: ' + error + "&" + response.statusCode + "&" + body + ' end');
});
  
};

当然,mailFormData的成员可以从变量中填充,甚至可以从req(其中脚本的调用者必须支持它)接收。

    subject: req.body.subject,

请记住,由于脚本中使用了require("request"),因此您需要将request添加到package.json的依赖项中。

6.2. 接收电子邮件

有了像Mailgun这样的服务,接收电子邮件很容易。接收新的传入电子邮件后,它将调用您的Function。您必须定义哪个Function将被哪个电子邮件调用。

在您的 Mailgun dashboard中进入Routes。在那里Create Route,初学者可以是最简单的。

Expression类型中,选择Catch All。这意味着所有传入的电子邮件(实际上是发送到您的info@sandbox1234567890abcdefghijklmnopqrst.mailgun.orgcontact@sandbox1234567890abcdefghijklmnopqrst.mailgun.org等)都将被此Route处理。

Actions中,选择Forward并输入触发您的 GCP Function的 URL,例如

由于这是我们创建的唯一Route,因此无论您选择Stop the processing of emails(符合定义的过滤器(Catch All))还是不选择,都没有关系。

GCP receiveEmailFunction可能是什么样的?

/**
 * Receive email from Mailgun.
 *
 * @param {!Object} req Cloud Function request context.
 * @param {!Object} res Cloud Function response context.
 */
exports.receiveEmailFunction = function receiveEmailFunction(req, res) {
//https://documentation.mailgun.com/user_manual.html#routes
  if (req.body.subject === undefined) {
    // This is an error case, as "subject" is required.
    res.status(400).send('No subject defined!');
  } else {
    // Everything is okay.
    console.log(req.body['body-plain']);
    res.status(200).send('Success: ' + req.body['body-plain']);
  }
};

将这仅仅看作一个简单的例子。即使电子邮件没有标题,也没有理由说由Mailgun调用的Function将具有req.body.subject未定义。

请注意,与发送相比,电子邮件部分具有不同的名称。相同的纯文本正文一次是text,一次是body-plain。由于名称中存在连字符,因此必须使用方括号进行访问。

收到的电子邮件正文已以多种方式预解析,请在此处查看body-plain 附近

现在发送电子邮件(从您的yourname@gmail.com)到沙盒(例如whatever@sandbox1234567890abcdefghijklmnopqrst.mailgun.org)然后瞧:对于发件人,没有任何可见的变化。

为了确保电子邮件已收到,请在此处的Mailgun logs和(一分钟后)在 GCP here(在Functions中,打开您的Function并点击右上角的VIEW LOGS)中查看。


第二部分结束。在第三部分中,我计划将 Functions 与其他 Web 服务连接。

© . All rights reserved.