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

Node.js使用nodemailer+AWS SES发邮件的异步函数无法正确返回值如何解决

问题原因

你当前的函数返回null是因为transporter.sendMail是异步回调执行的逻辑,你定义的async函数没有等待这个异步操作完成就直接return了sendResult,此时回调还没触发,sendResult还是初始的null值。

解决方案

nodemailer的sendMail方法本身支持Promise调用,你不需要手动写回调包装,直接用await接收结果即可,修改后的代码如下:

const nodemailer = require("nodemailer");
const AWS = require("aws-sdk");
require("dotenv").config();

exports.sendMail = async (obj) => {
    try {
        const transporter = nodemailer.createTransport({
            SES: new AWS.SES({
                apiVersion: "2010-12-01",
                accessKeyId: process.env.AWS_ACCESS_KEY_ID,
                secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
                region: process.env.AWS_REGION,
            }),
        });

        const info = await transporter.sendMail({
            from: process.env.MAIL_SENDER_ADDRESS,
            to: obj.receiver,
            subject: "Mail send success!",
            text: "Hello World"
        });
        // 发送成功逻辑
        console.log("sendEmail: " + JSON.stringify(info.envelope));
        console.log(info.messageId);
        return true;
    } catch (err) {
        // 发送失败逻辑
        console.log(err);
        return false;
    }
};

补充说明

如果你遇到其他仅支持回调的异步API,也可以手动封装Promise实现同样的效果,示例逻辑如下:

// 手动封装回调为Promise的通用写法
const sendResult = await new Promise((resolve) => {
    transporter.sendMail({/* 邮件配置 */}, (err, info) => {
        if (err) {
            console.log(err);
            resolve(false);
        } else {
            console.log("sendEmail: " + JSON.stringify(info.envelope));
            console.log(info.messageId);
            resolve(true);
        }
    })
})
return sendResult;

内容的提问来源于stack exchange,提问作者Gary Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:48:03