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

使用NextJS+emailJS(npm包)发送图片附件报错:文件不存在

解决NextJS中使用emailjs npm包发送图片附件报错的问题

核心原因

emailjs npm包处理附件时,服务端需要本地文件系统的绝对路径,而客户端无法直接访问本地文件,只能通过base64编码传递。你之前尝试的路径要么是网页URL、相对客户端路径,要么是错误的服务端相对路径,所以无法识别文件。

分场景解决方案

1. 在服务端代码中使用(API路由、Server Components)

服务端可以直接访问项目文件系统,用process.cwd()获取项目根目录,拼接出图片的绝对路径:

import emailjs from '@emailjs/nodejs';

const sendEmail = async () => {
  const message = {
    // 你的邮件主题、收件人等配置
    attachment: [
      { data: '...', alternative: true },
      {
        path: `${process.cwd()}/public/image.jpeg`, // 项目根目录拼接的绝对路径
        type: 'image/jpeg',
        name: 'image.jpeg'
      }
    ]
  };

  await emailjs.send(/* 你的服务端配置参数 */);
};

2. 在客户端代码中使用(Client Components、页面组件)

客户端不能直接读取本地文件,需要将图片转为base64编码,通过data字段传递:

import emailjs from '@emailjs/browser';

const sendEmail = async () => {
  // 读取public中的图片并转为base64
  const res = await fetch('/image.jpeg');
  const blob = await res.blob();
  const base64Data = await new Promise((resolve) => {
    const reader = new FileReader();
    reader.onload = () => resolve(reader.result);
    reader.readAsDataURL(blob);
  });

  const message = {
    // 你的邮件配置
    attachment: [
      { data: '...', alternative: true },
      {
        data: base64Data, // 使用base64编码的图片数据
        type: 'image/jpeg',
        name: 'image.jpeg'
      }
    ]
  };

  await emailjs.send(/* 你的客户端配置参数 */);
};

额外注意事项

  • 确保安装对应环境的emailjs包:服务端用@emailjs/nodejs,客户端用@emailjs/browser,不要混用
  • 网络图片必须使用完整URL(带http://或https://),比如https://www.url.com/images/image.jpeg
  • 检查文件名拼写:确认public目录下的文件是image.jpeg而非image.jpg,大小写也要完全匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:55:41