【问题标题】:Mail (nodemailer/maigun-js) does not send from Node邮件(nodemailer/maigun-js)不从节点发送
【发布时间】:2019-11-26 18:58:22
【问题描述】:

对于完整的注册确认,我正在尝试向即将唱歌的用户发送确认邮件。我正在使用 node.js,对于邮件发送,我尝试了 nodemailermailgun-js。在 localhost 上进行测试时,任何一个 nodemailer/mailgun 都可以正常工作,电子邮件可以完美发送。但是,一旦我部署它(在带有 ubuntu 的 azure 虚拟机上)电子邮件不会发送。我尝试了许多不同的方法,但都没有成功:都具有相同的行为:邮件在本地主机上发送,但从每个特定文档中使用 相同代码 从实时服务器运行时没有任何反应。是什么阻止了服务器发送电子邮件?

一个更重要的线索:在服务器上,使用带有swaks命令行,邮件发送成功。 另外一个独立的 js 文件,其中包含用于从服务器发送电子邮件的代码。

var API_KEY = 'MY_API_KEY';
var DOMAIN = 'MY_DOMAIN_NAME';
var HOST = 'MY_EU_HOST';
var mailgun = require('mailgun-js')({apiKey: API_KEY, domain: DOMAIN, host: HOST});

const data = {
  from: 'Excited User <me@samples.mailgun.org>',
  to: 'foo@example.com',
  subject: 'Hello',
  text: 'Testing some Mailgun awesomeness!'
};

mailgun.messages().send(data, (error, body) => {
  console.log(body);
});

更新:我让它工作的唯一方法是使用mailgun.js 而不是mailgun-js。问题仍然存在,因为隔离发送邮件节点脚本也适用于 mailgun-js。问题是 ma​​ilgun.js 在项目中可以工作,而 ma​​ilgun-js 不能。我非常不清楚为什么会发生这种情况,并且仍然会对两者之间的差异进行任何解释。为了解决这个问题,mailgun official documentation 在他们的示例中有 require('mailgun-js')NOT require('mailgun.js')

【问题讨论】:

    标签: node.js azure virtual-machine mailgun nodemailer


    【解决方案1】:

    你是对的,如果你使用的是 3rd party email service ,它与 Azure VM 的 25 端口无关。

    无论您在示例 js 中还是通过 API 调用电子邮件函数,它都应该使用相同的协议。根据您的代码,我编写了一个示例 API,用于将电子邮件发送到我的邮箱,并将 API 托管在 Azure Linux (ubuntu 18.04) VM 上:

    var express = require('express');
    var app = express();
    
    app.get('/email', function (req, res) {
    
        const mailgun = require("mailgun-js");
        const DOMAIN = "sandbox3b95c6dff0fb4b4a8aaa3c59a7eb9abc.mailgun.org";
        const mg = mailgun({apiKey: "<key here>", domain: DOMAIN});
        const data = {
            from: "Mailgun Sandbox <postmaster@sandbox3b95c6dff0fb4b4a8aaa3c59a7eb9abc.mailgun.org>",
            to: "<my email address>",
            subject: "Hello",
            text: "Testing some Mailgun awesomness!"
        };
        mg.messages().send(data, function (error, body) {
            console.log(body);
        });
    
    
       res.end("email has been sent!!!");
    })
    
    var server = app.listen(8081, function () {
       var host = server.address().address
       var port = server.address().port
       console.log("Example app listening at http://%s:%s", host, port)
    })
    

    如您所见,我的节点服务器监听 8081 端口,因此我在我的 VM 网络安全组上启用了 8081 端口(您可以将其视为 Azure 平台级防火墙): 使用 get 方法直接调用 API: Azure VM 端收到请求: 成功收到邮件:

    似乎一切正常,希望对您有所帮助。

    【讨论】:

    • 嗨@CezarCobuz,还有什么我可以帮忙的吗?
    • 创建了一个简单的独立 js 文件并从实时服务器运行它。该脚本具有用于发送电子邮件的相同代码,但使用模拟数据,它在服务器上完美运行,它发送电子邮件,所以我假设在这种情况下端口 25 不是问题。
    • @Stanley Gong 我不知道怎么做,但是如果我直接从服务器运行脚本而不是任何用户调用触发相同(-ish)脚本的 api,它会是不同的协议吗?
    • 嗨@CezarCobuz,我为你做了一些测试并更新了我的答案,请检查一下。
    • 我让它工作的唯一方法是使用mailgun.js 而不是mailgun-js。问题仍然存在,因为也隔离了 mailgun-js 的发送邮件节点脚本词。问题是 mailgun.js 在项目中有效,而 mailgun-js 不能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2019-10-06
    • 2017-12-22
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    相关资源
    最近更新 更多