NestJS中使用Nodemailer对接Hotmail时认证失败求助
NestJS + Nodemailer 对接Hotmail账户认证失败(已使用应用密码)
我查阅了大量相关帖子但都未能解决问题,特此求助:在NestJS应用中尝试通过Nodemailer发送邮件,使用文档提供的Ethereal测试邮箱时一切正常,但对接已获取应用密码的Hotmail账户时却失败。
相关代码
export async function sendEmail(createTicketDto: CreateTicketDto) { const { username, email, ticket_body, issue_type } = createTicketDto; const emailBody = ` User ${email} reporting issue regarding ${issue_type}:\n\t${ticket_body}\n \t\tActive username is: ${username}`; const transporter = nodemailer.createTransport({ service: 'hotmail', host: 'smtp-mail.outlook.com', secure: false, port: 587, auth: { user: 'xxx@hotmail.com', pass: 'PASSWORD', }, tls: { ciphers: 'SSLv3', }, }); console.log(emailBody); const mailData = await transporter.sendMail({ from: '"XXXSUPPORT"<XXX@hotmail.com>', to: 'YYY@gmail.com', subject: issue_type, text: emailBody, }); Logger.log(`Email sent with ID: ${mailData.messageId}`); return mailData; }
错误信息
[Nest] 22727 - 02/10/2023, 1:32:32 PM ERROR [ExceptionsHandler] Invalid login: 535 5.7.3 Authentication unsuccessful [MN2PR17CA0007.namprd17.prod.outlook.com 2023-02-10T18:32:32.130Z 08DB0B4DDC8F1521]
解决方案
修正TLS加密协议配置
代码中指定的SSLv3已被Hotmail的SMTP服务器弃用,会直接导致认证失败。移除ciphers: 'SSLv3'配置,或替换为支持的协议:tls: { minVersion: 'TLSv1.2' }验证应用密码有效性
确保Hotmail账户已开启双重验证,应用密码是在双重验证开启后生成的「其他(自定义名称)」类型,且代码中pass字段是完整的应用密码,无空格或截断。统一账号一致性
确认auth.user与from字段中的邮箱完全一致,Hotmail会严格校验发件人账号和认证账号的匹配性,避免使用别名或不一致的邮箱地址。优化SMTP配置参数
移除service: 'hotmail'避免自动配置冲突,手动指定参数确保正确性:const transporter = nodemailer.createTransport({ host: 'smtp-mail.outlook.com', port: 587, secure: false, // 587端口使用STARTTLS,secure需设为false auth: { user: 'xxx@hotmail.com', pass: '你的应用密码', }, tls: { minVersion: 'TLSv1.2' }, });检查账户状态
登录Hotmail网页版确认账户未被限制发送邮件,排查是否因近期发送行为触发反垃圾机制导致认证失败。
内容的提问来源于stack exchange,提问作者Adam C. MacKinnon
相关产品推荐
相关产品推荐

