如何为自定义域名生成DKIM、DMARC、SPF记录及Node.js实现方法
自定义域名DKIM、DMARC、SPF记录生成及Node.js实现
一、手动生成DKIM、DMARC、SPF记录
1. SPF记录
SPF用于授权可发送你域名邮件的服务器/服务商,核心是定义允许的发送源:
- 先明确你的邮件发送渠道:自己的SMTP服务器IP、第三方服务商(如SendGrid、Mailgun)
- 生成TXT格式记录,基础模板:
v=spf1 [规则集] ~all- 规则示例:
- 允许单个IPv4:
ip4:192.168.1.1 - 包含第三方服务商SPF:
include:sendgrid.net - 最终示例:
v=spf1 ip4:192.168.1.1 include:sendgrid.net ~all
- 允许单个IPv4:
- 末尾规则说明:
~all是软失败(邮件可能被标记但不拒收),-all是硬失败(直接拒收未授权邮件),按需选择
- 规则示例:
2. DKIM记录
DKIM通过RSA密钥对签名邮件,验证发件身份,步骤如下:
- 用OpenSSL生成2048位以上密钥对:
openssl genrsa -out private.key 2048 openssl rsa -in private.key -pubout -out public.key - 处理公钥:去掉
-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----标记,把换行替换成空格 - 创建TXT记录:主机名一般用
default._domainkey(也可自定义前缀如mail._domainkey),内容格式:v=DKIM1; k=rsa; p=[处理后的公钥内容] - 注意:私钥要妥善保存,发送邮件时需用它签名
3. DMARC记录
DMARC告诉收件服务器如何处理未通过SPF/DKIM验证的邮件,配置步骤:
- 创建TXT记录,主机名固定为
_dmarc - 内容模板:
v=DMARC1; p=[全局策略]; sp=[子域名策略]; rua=[汇总报告邮箱]; ruf=[ forensic报告邮箱 ]- 策略选项:
none:仅收集验证报告,不干预邮件投递quarantine:将可疑邮件标记为垃圾邮件reject:直接拒收未通过验证的邮件
- 示例:
v=DMARC1; p=quarantine; sp=quarantine; rua=mailto:dmarc-reports@yourdomain.com; ruf=mailto:dmarc-forensic@yourdomain.com
- 策略选项:
二、Node.js实现自动化生成及配置
1. 生成DKIM密钥对
借助node-forge库生成RSA密钥对,无需依赖OpenSSL:
const forge = require('node-forge'); function generateDKIMKeys() { const keyPair = forge.pki.rsa.generateKeyPair(2048); const privateKeyPem = forge.pki.privateKeyToPem(keyPair.privateKey); const publicKeyPem = forge.pki.publicKeyToPem(keyPair.publicKey); // 处理公钥,适配DKIM DNS记录格式 const dkimPublicKey = publicKeyPem .replace(/-----BEGIN PUBLIC KEY-----/, '') .replace(/-----END PUBLIC KEY-----/, '') .replace(/\n/g, ''); return { privateKey: privateKeyPem, publicKey: publicKeyPem, dkimPublicKeyRecord: dkimPublicKey }; } // 调用生成密钥 const dkimKeys = generateDKIMKeys(); console.log('DKIM私钥:\n', dkimKeys.privateKey); console.log('DKIM公钥(用于DNS记录):\n', dkimKeys.dkimPublicKeyRecord);
2. 自动构建SPF和DMARC记录字符串
通过函数动态生成符合格式的记录:
// 生成SPF记录 function generateSPFRecord(allowedIPs = [], includedServices = []) { const spfSegments = ['v=spf1']; allowedIPs.forEach(ip => spfSegments.push(`ip4:${ip}`)); includedServices.forEach(service => spfSegments.push(`include:${service}`)); spfSegments.push('~all'); // 默认软失败,可改为'-all' return spfSegments.join(' '); } // 示例:允许IP+包含SendGrid const spfRecord = generateSPFRecord(['192.168.1.1'], ['sendgrid.net']); console.log('SPF记录:\n', spfRecord); // 生成DMARC记录 function generateDMARCRecord(policy = 'none', subdomainPolicy = policy, ruaEmail, rufEmail) { const dmarcSegments = ['v=DMARC1']; dmarcSegments.push(`p=${policy}`); dmarcSegments.push(`sp=${subdomainPolicy}`); if (ruaEmail) dmarcSegments.push(`rua=mailto:${ruaEmail}`); if (rufEmail) dmarcSegments.push(`ruf=mailto:${rufEmail}`); return dmarcSegments.join('; '); } // 示例:隔离策略+指定报告邮箱 const dmarcRecord = generateDMARCRecord('quarantine', 'quarantine', 'dmarc-reports@yourdomain.com', 'dmarc-forensic@yourdomain.com'); console.log('DMARC记录:\n', dmarcRecord);
3. 可选:自动更新DNS记录(需服务商API)
如果你的域名服务商提供API(如Cloudflare、AWS Route53),可通过Node.js SDK自动添加记录。以Cloudflare为例:
const { Cloudflare } = require('cloudflare'); async function addDNSRecord(domain, type, name, content) { const cf = new Cloudflare({ apiToken: '你的Cloudflare API令牌' }); const zone = await cf.zones.get({ name: domain }); await cf.dnsRecords.create(zone.id, { type, name, content, ttl: 3600, proxied: false // DNS记录无需代理,避免影响验证 }); } // 批量添加记录 (async () => { await addDNSRecord('yourdomain.com', 'TXT', '@', spfRecord); await addDNSRecord('yourdomain.com', 'TXT', 'default._domainkey', `v=DKIM1; k=rsa; p=${dkimKeys.dkimPublicKeyRecord}`); await addDNSRecord('yourdomain.com', 'TXT', '_dmarc', dmarcRecord); })();
内容的提问来源于stack exchange,提问作者ROSHAN G
相关产品推荐
相关产品推荐

