我很难用node.js和nodemailer设置DKIM签名。
这是我得到的:
在hosteurope.com上像[email protected]这样的常规自托管SMTP电子邮件
具有DNS设置的域托管在inwx.com上
Node.js 8.4.0
步骤1:生成DKIM密钥。
我进入https://www.port25.com/dkim-wizard/并输入了我的域名,然后点击了生成密钥或其他。然后我得到了应该作为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设置中设置公钥:
第2步:
下载私钥。我将其放在文件中,并将其命名为dkim.pem。
第三步:
设置一个简单的node.js程序,该程序发送dkim签名的电子邮件。
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: '[email protected]',
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: "[email protected]"};
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: "[email protected]", // 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...');
});
打开收到的电子邮件的原始数据,没有发现任何错误。
我已经使用苹果邮件功能来检查电子邮件,但是电子邮件中没有dkim记录哈希或其他内容。 mail-tester.com在dkim上也没有给我带来积极的结果。它只是说:“您的消息未使用DKIM签名”
感谢您解决此问题的任何帮助:-)谢谢
最佳答案
我终于明白了。基本上,这不是一个更愚蠢的问题:我没有使用最新的nodemailer版本。我使用过2.4,但是dkim参数至少需要nodemailer 3-我使用过nodemailer 4.2。