You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为自定义域名生成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
    • 末尾规则说明:~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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:18:39