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

电商应用支付后发邮件报错:mailgun.messages is not a function求解决

解决"mailgun.messages is not a function"错误及其他Mailgun API使用方式

错误原因

你在utils.js中导出的mailgun是一个返回Mailgun实例的函数,而非直接的实例对象。在orderRoutes.js中直接调用mailgun.messages()时,相当于在调用这个函数的messages方法,但函数本身并没有这个方法,因此抛出错误。

快速修复方案

方案1:修改调用方式(推荐,保持原utils.js结构)

在orderRoutes.js中,先执行mailgun()获取实例,再调用messages().send():

// 替换原mailgun.messages().send(...)部分
mailgun().messages().send(
  {
    from: "Sales <sales@cocoTiCosmetics.com>",
    to: `${order.user.firstName} <${order.user.email}>`,
    subject: `New Order ${order._id}`,
    html: payOrderEmailTemplate(order),
  },
  (error, body) => {
    if (error) {
      console.log(error);
    } else {
      console.log(body);
    }
  }
);

方案2:修改utils.js的导出方式

直接在utils.js中创建并导出Mailgun实例,无需包裹函数:

// utils.js修改后
export const mailgun = mg({
  apiKey: process.env.MAILGUN_API_KEY,
  domain: process.env.MAILGUN_DOMAIN,
});

这样orderRoutes.js中原来的mailgun.messages().send()调用就可以正常工作了。

其他使用Mailgun API的方式

方式1:使用Mailgun SDK的Promise语法(贴合async/await风格)

Mailgun SDK支持Promise,用async/await替代回调函数,代码更简洁:

// 确保mailgun是实例(按方案2修改utils.js后)
try {
  const body = await mailgun.messages().send({
    from: "Sales <sales@cocoTiCosmetics.com>",
    to: `${order.user.firstName} <${order.user.email}>`,
    subject: `New Order ${order._id}`,
    html: payOrderEmailTemplate(order),
  });
  console.log(body);
} catch (error) {
  console.log(error);
}

方式2:直接发送HTTP请求(不依赖SDK)

如果不想用SDK,可以直接通过fetch调用Mailgun的REST API:

const apiKey = process.env.MAILGUN_API_KEY;
const domain = process.env.MAILGUN_DOMAIN;

const auth = `Basic ${Buffer.from(`api:${apiKey}`).toString('base64')}`;

try {
  const response = await fetch(`https://api.mailgun.net/v3/${domain}/messages`, {
    method: 'POST',
    headers: {
      'Authorization': auth,
      'Content-Type': 'application/x-www-form-urlencoded',
    },
    body: new URLSearchParams({
      from: "Sales <sales@cocoTiCosmetics.com>",
      to: `${order.user.firstName} <${order.user.email}>`,
      subject: `New Order ${order._id}`,
      html: payOrderEmailTemplate(order),
    }),
  });
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.log(error);
}

内容的提问来源于stack exchange,提问作者Cyan the Computer Scientist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:00:57