使用自定义SMTP服务器在Strapi中发送邮件时出现连接拒绝错误
问题详情
用Strapi做项目后端,已经按照官方文档配置了自定义SMTP服务器作为邮件服务商,但创建新条目触发邮件发送时,出现连接拒绝错误:
Error: connect ECONNREFUSED 145.145.145.145:587 at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1161:16) at TCPConnectWrap.callbackTrampoline (node:internal/async_hooks:130:17) { errno: -4078, code: 'ESOCKET', syscall: 'connect', address: '145.145.145.145', port: 587, command: 'CONN' }
相关配置代码
plugins.js中的邮件配置:
email: { config: { provider: 'nodemailer', providerOptions: { host: env('SMTP_HOST'), port: env('SMTP_PORT'), auth: { user: env('SMTP_USERNAME'), pass: env('SMTP_PASSWORD'), }, pool: true, logger: true, debug: true, maxConnections: 10000, secure: false, tls: { rejectUnauthorized: false, }, }, settings: { defaultFrom: env('SMTP_FROM'), defaultReplyTo: env('SMTP_REPLY_TO'), }, }, },
触发邮件的afterCreate生命周期钩子:
module.exports = { async afterCreate(event) { const { result } = event; try { await strapi .plugin('email') .service('email') .send({ to: result.send_to[0].email, subject: result.subject, text: result.content, }) } catch (error) { console.log(error) } } }
排查与解决方案
这个错误核心是无法连接到指定的SMTP服务器地址和端口,按以下步骤逐一排查:
验证SMTP地址与端口正确性
确认SMTP_HOST环境变量的值确实是145.145.145.145,且该服务器的587端口对外正常开放。部分服务商可能要求使用465端口(对应配置里的secure: true),可以尝试切换端口并调整secure参数。检查网络连通性
在Strapi所在服务器执行telnet 145.145.145.145 587或nc -zv 145.145.145.145 587,测试能否正常建立连接。如果连接失败,排查服务器防火墙、安全组是否放行587端口,或者SMTP服务商是否限制了当前服务器的IP。核对SMTP认证信息
确认SMTP_USERNAME和SMTP_PASSWORD环境变量配置正确,部分邮件服务商要求使用授权码而非账号登录密码,别搞混了。调整Nodemailer配置细节
可以先临时关闭pool: true,避免连接池带来的干扰,测试基础连接是否正常。另外,587端口通常用STARTTLS模式(对应secure: false),465端口用SSL模式(对应secure: true),别搞反。rejectUnauthorized: false仅适合测试环境,生产环境建议开启证书验证。检查环境变量加载情况
在钩子代码里临时打印env('SMTP_HOST')等变量的值,确认Strapi正确读取了环境变量,避免出现变量未加载导致的空值或错误值。
内容的提问来源于stack exchange,提问作者hmd.fullstack

