使用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
相关产品推荐
相关产品推荐

