Nodemailer如何设置Reply-To地址解决发件人地址被拒问题
解决方案
你遇到的553报错是因为SMTP服务要求from字段必须是当前认证账号有权使用的发件地址,随意填写第三方用户邮箱会触发SPF/DKIM身份校验失败。要实现点击回复直接回信给用户的需求,使用邮件协议原生支持的replyTo字段即可,不需要修改from字段。
步骤1:修改发送邮件工具函数
还原from字段为你的合法发件地址,新增replyTo参数配置:
const sendEmail = async options => { const transporter = nodemailer.createTransport({ host: process.env.SMTP_HOST, port: process.env.SMTP_PORT, auth: { user: process.env.SMTP_EMAIL, pass: process.env.SMTP_PASSWORD } }); let message = { // from固定使用你自己的合法发件地址,避免校验失败 from: `${options.fromName} <${process.env.FROM_EMAIL}>`, to: options.email, subject: options.subject, text: options.message, html: options.body, // 新增回复地址配置,管理员点击回复时会自动填充这个地址 replyTo: options.replyToEmail }; const info = await transporter.sendMail(message); console.log('Message sent: %s', info.messageId); }; module.exports = sendEmail;
步骤2:调整发信调用参数
新增replyToEmail字段传入用户邮箱即可:
try { await sendEmail({ fromName: emailBody.name, // 发件人名称还是可以用用户的名字,管理员收件时辨识度更高 replyToEmail: emailBody.email, // 回复地址设为用户邮箱 email: 'admin@email.com', subject: `${emailBody.name} sent a message!`, body: emailBodyText }); } catch (err) { console.log(err); return next(new ErrorResponse('Email could not be sent', 500)); }
这个方案完全符合邮件协议规范,不会触发任何发件人校验报错,同时完全满足需求:管理员收到邮件时发件人显示用户的姓名,点击回复按钮时收件人会自动填充为用户的邮箱地址,不需要手动复制粘贴。
内容的提问来源于stack exchange,提问作者connorcode
相关产品推荐
相关产品推荐

