javascript - 使 node.js 的 nodemailer 与 dkim smtp 一起工作

标签 javascript node.js email nodemailer dkim

我在使用 node.js 和 nodemailer 设置 DKIM 签名时遇到了困难。 这是我得到的: 常规的自托管 SMTP 电子邮件,例如 hosteurope.com 上的 you@yourpersonalwebsite.com 在 inwx.com 托管的具有 DNS 设置的域 Node 8.4.0

第 1 步:生成 DKIM key 。 我去了https://www.port25.com/dkim-wizard/然后输入我的域名并点击生成 key 或其他任何东西。然后我得到了我应该将 TXT 记录放入我的域名注册商的 DNS 设置中的东西。 为了确保它能正常工作,我运行了:

dig TXT default._domainkey.example.com

得到了

; <<>> DiG 9.8.3-P1 <<>> TXT default._domainkey.mydomain.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28927
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;default._domainkey.mydomain.com. IN    TXT

;; ANSWER SECTION:
default._domainkey.mydomain.com. 3554 IN TXT    "k=rsa\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmwCHK6Szd9ObPoD9I4JkdB9+W7a/IzGKnntAbWnHitMxQyl4TsmofRm+RZDS/Ije99opzmjLBeaCiiNXYs6nvhaVR4lrN9IFpmaJ5yuyicmE9HCDM99qlPUUzgk4l3YAGVSNK83FS7UNc5r0Ymh1bWKKB6FFwqgjVAzP6yJ7Bst0C88Wko0UHSJqeg3Y4mfeys9p6yyro4" "HnFJ+UQGYtwGD11z5+MdHI9D5eIa1TC7t0VSRYll94n4VHZI43uGO+jk3tm/LCMaYaksEiMD55rLUg78VAhh0pDsNPowbeXxcBYITqv9oMn7tNZQQKmXRU5G/WwsBpi9wrJuja7vl22wIDAQAB"

;; Query time: 0 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Tue Oct 17 13:53:10 2017
;; MSG SIZE  rcvd: 464

在这里看我是如何在 DNS 设置中设置公钥的:

inwx dkim settings

第 2 步: 下载私钥。我把它放在一个文件中并命名为 dkim.pem。

第 3 步: 设置一个发送 dkim 签名电子邮件的简单 node.js 程序。

var fs = require('fs');
var nodemailer = require('nodemailer');
var EmailTemplate = require('email-templates').EmailTemplate
var path = require('path')

// config of nodemailer
var poolConfig = {
    pool: true
    , host: 'mail.example.com'
    , port: 25
    , secure: false // use SSL
    , auth: {
            user: 'info@example.com',
            pass: 'mypassword'
    }, tls: {
            rejectUnauthorized: false
    }, dkim: {
            domainName: 'example.com'
            , keySelector: 'default'
            , privateKey: fs.readFileSync('./certificates/dkim/dkim.pem', "utf8")
            , cacheDir: '/tmp'
            , cacheTreshold: 100 * 1024
    }
};

// use config to generate a transporter
var transporter = nodemailer.createTransport(poolConfig);

// the email and its content as json
var user = {email: "info@example.com"};
var message = {
    template : "contactform"
    , subject : "Message from Simon"
    , pageData : {formdata: {salutation : "salutation", firstname: "firstname", lastname : "lastname", phone : "phone", email: "email", subject : "subject", text : "text" }}
};

// send the email
if(user && user.email) {
    if(message.template && message.subject && message.pageData ) {
        var path_email = path.join(__dirname, 'templates', message.template)
        var template_email = new EmailTemplate(path_email)

        message.pageData.base_url = "https://example.com";

        console.log(message.pageData);

        template_email.render(message.pageData, function (err, result) {
            if (err) {
                return console.error(err)
            }
            // actual sending of the email
            transporter.sendMail({
                from: "info@example.com", // sender address
                to: user.email, // list of receivers
                subject: message.subject, // Subject line
                html: result.html,
                text: result.text.replace(/<\/p>/g,'\n').replace(/<\/?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[\^'">\s]+))?)+\s*|\s*)\/?>/g,'')
            }, function (err, responseStatus) {
                if (err) {
                    return console.error(err)
                }
                console.log("email send to " + user.email);
            })
        })
    } else {
        console.log("Error no template, subject or pageData", null);
    }
} else {
    console.log("Error no user or email", null);
}

// create a hello world nodejs server to wait until email has send...
var express = require('express');
var app = express();
app.listen(3000, function () {
  console.log('Example app listening on port 3000. Waiting for email to be send...');
});
  1. 打开收到邮件的原始数据,发现没有任何dkim。 我已经使用苹果邮件功能来检查电子邮件,但没有 dkim 记录哈希或电子邮件中的任何内容。 mail-tester.com 也没有给我关于 dkim 的正面结果。它只是说:“您的邮件未使用 DKIM 签名”

我感谢解决此问题的任何帮助:-) 谢谢

最佳答案

我终于明白了。基本上这不可能是一个更愚蠢的问题:我没有使用最新的 nodemailer 版本。我使用的是 2.4,但 dkim 参数至少需要 nodemailer 3 - 我使用的是 nodemailer 4.2。

关于javascript - 使 node.js 的 nodemailer 与 dkim smtp 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46789720/

相关文章:

javascript - 根据页面更改更改下拉值

node.js - 在 GitLab CI/CD 中缓存 Node.js 依赖项的便捷方法

javascript - 如何在node/loopback中同步调用model.find方法?

javascript - 如何使用 gulp-inject 将文件的内容插入到我的 index.html 中?

email - CakePHP 3 - 如何在电子邮件模板中传递对象数据

ruby - 用于在 ruby​​ 中的行之间匹配内容的正则表达式

email - 通过php邮件功能发送图片

javascript - 当图像超出限制时停止视差效果

javascript - javascript中的onfocus函数不使用id

javascript - 瞬时字数计数器