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

EmailJS嵌入图片问题求助:React.js表单图片无法添加

问题解答

EmailJS不支持直接嵌入本地上传的图片,必须先将图片转换为可公开访问的URL(比如base64编码字符串,或者上传到第三方存储服务获取URL),才能在邮件模板中显示。

实现思路

EmailJS的sendForm或send方法只能传递文本/字符串类型的数据,本地文件对象(Blob/File)无法直接被解析并嵌入邮件。核心步骤:

  • 小体积图片:直接转成base64编码字符串(快速实现)
  • 大体积图片:上传到云存储(如Firebase Storage、OSS等)获取公开URL
  • 将base64字符串/URL作为参数传给EmailJS,在邮件模板中用<img>标签引用

React.js 代码实现(base64快速方案)

以下是包含文件转base64、EmailJS发送逻辑的完整组件示例:

import React, { useState } from 'react';
import emailjs from '@emailjs/browser';

const ImageUploadForm = () => {
  const [imageBase64, setImageBase64] = useState('');
  const [formData, setFormData] = useState({ name: '', email: '' });

  // 处理文件上传并转base64
  const handleFileChange = (e) => {
    const file = e.target.files[0];
    if (!file) return;

    const reader = new FileReader();
    reader.onload = (event) => {
      setImageBase64(event.target.result);
    };
    reader.readAsDataURL(file);
  };

  // 处理表单输入
  const handleInputChange = (e) => {
    setFormData({ ...formData, [e.target.name]: e.target.value });
  };

  // 提交表单到EmailJS
  const handleSubmit = (e) => {
    e.preventDefault();

    // 替换为你的EmailJS配置信息
    const serviceId = 'your_service_id';
    const templateId = 'your_template_id';
    const publicKey = 'your_public_key';

    const templateParams = {
      ...formData,
      user_image: imageBase64,
    };

    emailjs.send(serviceId, templateId, templateParams, publicKey)
      .then(() => {
        alert('提交成功!');
        // 重置表单
        setFormData({ name: '', email: '' });
        setImageBase64('');
        e.target.reset();
      })
      .catch((err) => {
        console.error('发送失败:', err);
        alert('提交失败,请重试');
      });
  };

  return (
    <form onSubmit={handleSubmit}>
      <div>
        <label>姓名:</label>
        <input
          type="text"
          name="name"
          value={formData.name}
          onChange={handleInputChange}
          required
        />
      </div>
      <div>
        <label>邮箱:</label>
        <input
          type="email"
          name="email"
          value={formData.email}
          onChange={handleInputChange}
          required
        />
      </div>
      <div>
        <label>上传图片:</label>
        <input
          type="file"
          accept="image/*"
          onChange={handleFileChange}
          required
        />
      </div>
      <button type="submit">提交</button>
    </form>
  );
};

export default ImageUploadForm;

EmailJS 邮件模板配置

登录EmailJS后台,编辑对应模板时,用<img>标签引用代码中定义的参数名:

<div style="max-width: 600px; margin: 0 auto;">
  <h3>用户提交信息</h3>
  <p><strong>姓名:</strong> {{name}}</p>
  <p><strong>邮箱:</strong> {{email}}</p>
  <h4>上传的图片:</h4>
  <img src="{{user_image}}" alt="用户上传图片" style="max-width: 100%; border-radius: 4px;" />
</div>

注意事项

  1. base64体积限制:base64编码会让图片体积增大约30%,如果图片超过1MB,可能触发EmailJS参数长度限制,建议改用云存储上传方案。
  2. 参数名一致性:代码中templateParams的key必须和模板中的{{变量名}}完全匹配。
  3. 配置正确性:确保EmailJS的服务ID、模板ID、公钥没有填写错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:55:18