Nodemailer 是一个用于 Node.js 应用程序的模块,用于发送电子邮件。它支持各种传输方法,包括 SMTP、Amazon SES、SendGrid 等。
Nodemailer 在本地环境中可以正常工作,但在 AWS Lambda 函数中无法正常工作。
原因:本地环境和 Lambda 环境存在差异,可能导致某些依赖或配置在 Lambda 中无法正常工作。
解决方法:
npm install --production
来安装生产环境的依赖,减少不必要的包。原因:Lambda 是一个无服务器环境,异步处理方式可能与本地环境不同。
解决方法:
async/await
或回调函数。exports.handler = async (event) => {
try {
await transporter.sendMail(mailOptions);
return {
statusCode: 200,
body: JSON.stringify('Email sent successfully'),
};
} catch (error) {
return {
statusCode: 500,
body: JSON.stringify(`Error sending email: ${error.message}`),
};
}
};
原因:Lambda 函数可能无法访问外部 SMTP 服务器。
解决方法:
原因:Lambda 函数默认超时时间可能不足以完成邮件发送操作。
解决方法:
exports.handler = async (event) => {
// 设置超时时间为 30 秒
const timeout = 30000;
const timeoutPromise = new Promise((_, reject) => {
setTimeout(() => reject(new Error('Function timed out')), timeout);
});
try {
await Promise.race([
transporter.sendMail(mailOptions),
timeoutPromise,
]);
return {
statusCode: 200,
body: JSON.stringify('Email sent successfully'),
};
} catch (error) {
return {
statusCode: 500,
body: JSON.stringify(`Error sending email: ${error.message}`),
};
}
};
原因:无法确定具体错误原因。
解决方法:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.Console(),
],
});
exports.handler = async (event) => {
try {
logger.info('Sending email...');
await transporter.sendMail(mailOptions);
logger.info('Email sent successfully');
return {
statusCode: 200,
body: JSON.stringify('Email sent successfully'),
};
} catch (error) {
logger.error(`Error sending email: ${error.message}`);
return {
statusCode: 500,
body: JSON.stringify(`Error sending email: ${error.message}`),
};
}
};
通过以上方法,应该能够解决 Nodemailer 在 Lambda 上无法正常工作的问题。
领取专属 10元无门槛券
手把手带您无忧上云