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

如何通过Mailgun与Node.js发送图片附件?远程图片附件报错排查

解决Mailgun无法添加远程Cloudinary图片作为附件的问题

我明白你的问题——Mailgun确实不支持直接把远程URL作为附件传入,它的Attachment构造函数默认只认本地文件路径或者二进制Buffer。你看到的ENOENT错误就是因为它把Cloudinary的URL当成了本地文件路径去找,自然找不到。

要实现把Cloudinary的图片作为邮件附件发送,核心思路是先把远程图片下载到内存(Buffer),再传给Mailgun的Attachment。下面是具体的解决方案:

步骤1:安装HTTP客户端依赖

我们需要用工具下载远程图片,这里推荐axios(你也可以用node-fetch或者原生http模块):

npm install axios

步骤2:修改代码实现下载+附件发送

替换你原来的代码,改成异步下载图片后再创建附件:

const axios = require('axios');
const mailgun = require('mailgun-js')({apiKey: '你的Mailgun API密钥', domain: '你的Mailgun域名'});

// 封装成异步函数处理邮件发送
async function sendPostEmail(post) {
  try {
    // 1. 从Cloudinary下载第一张图片到Buffer(注意去掉URL末尾多余的空格)
    const imageUrl = post.images[0].trim();
    const imageResponse = await axios.get(imageUrl, {
      responseType: 'arraybuffer' // 确保下载的是二进制数据
    });
    const imageBuffer = Buffer.from(imageResponse.data, 'binary');

    // 2. 创建Mailgun附件对象
    const attachment = new mailgun.Attachment({
      data: imageBuffer,
      filename: `post-image.${imageUrl.split('.').pop()}`, // 自动提取图片后缀
      contentType: imageResponse.headers['content-type'] // 从响应头获取正确的MIME类型
    });

    // 3. 准备邮件数据并发送
    const emailData = {
      from: "你的名称 <your-email@your-domain.com>",
      to: "recipient@example.com",
      subject: 'New Post with Image Attachment',
      html: 'Here is a new post and here are the images attached:',
      attachment: attachment
    };

    await mailgun.messages().send(emailData);
    console.log('邮件发送成功,已附带图片附件');
  } catch (error) {
    console.error('发送邮件出错:', error);
    throw error;
  }
}

// 调用示例(传入你的post对象)
// sendPostEmail(yourPostObject);

关键细节说明

  • 去掉URL末尾的空格:你原来的代码里pictures.push(photos + " ")给URL加了空格,这会导致下载失败,所以用trim()清理
  • 二进制数据处理:通过responseType: 'arraybuffer'获取图片的二进制数据,再转成Node.js的Buffer类型,这是Mailgun Attachment支持的格式
  • 动态文件名和MIME类型:自动提取图片后缀和从响应头获取contentType,能保证邮件客户端正确识别附件类型
  • 多张图片支持:如果要添加多张附件,只需循环下载每个Cloudinary URL,创建多个Attachment对象,然后把数组传给attachment参数(Mailgun支持传入附件数组)

额外注意事项

  • 确保你的服务器有访问Cloudinary的网络权限
  • 处理下载图片失败的情况(比如URL失效、网络问题)
  • 如果图片很大,考虑下载到临时文件而不是内存(避免内存占用过高),但一般Cloudinary的图片都经过优化,内存处理没问题

内容的提问来源于stack exchange,提问作者Jordan Pisani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:44:32