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

使用Next.js和API路由中的renderToString实现带图片邮件发送

问题原因及解决方案

核心问题

你用的Next.js <Image> 组件是为Web浏览器优化设计的,它会生成带特殊属性(比如data-src)的DOM结构,还依赖Next.js的图片优化服务。而renderToString渲染后,这些结构在邮件客户端里无法被正确解析,导致图片不显示。另外你代码里还有个小错误:把样式对象当成类名传给了className,这也会导致样式不生效。

解决步骤

1. 替换Next.js <Image>为原生<img>标签

邮件客户端对原生<img>支持最好,直接用它替代Next Image:

// 移除import Image from 'next/image'
// 替换成原生img标签
<img 
  src='https://source.unsplash.com/zTNv5fteUWI' 
  width={200} 
  height={120} 
  alt='邮件配图' 
  style={{display: 'block', margin: '0 auto'}} // 可选,加一些内联样式适配邮件
/>

2. 修复样式绑定错误

你把样式对象mailMainWrapper传给了className,应该改成style属性:

// 错误写法
<main className={mailMainWrapper}>
// 正确写法
<main style={mailMainWrapper}>

3. 邮件样式最佳实践

邮件客户端对CSS支持有限,尽量全部用内联样式,避免用类名或外部样式表。比如把所有样式都写在元素的style属性里。

修改后的完整Quotes组件

import React from 'react'

const Quotes = props => {
  const mailMainWrapper = {
    backgroundColor: 'green',
    padding: '20px', // 加个内边距让内容不挤
  }

  const styling = {color: 'blue', fontWeight: 'bolder'}

  return (
    <main style={mailMainWrapper}>
      <img 
        src='https://source.unsplash.com/zTNv5fteUWI' 
        width={200} 
        height={120} 
        alt='邮件配图' 
        style={{display: 'block', marginBottom: '15px'}}
      />
      <div style={mailMainWrapper}>
        <p style={styling}>Client email:    { props.clientEmail } </p>
        <p>Full name:       { props.firstName + ' ' + props.lastName} </p>
        <p>Contact number:  { props.phone } </p>
        <p>Message:         { props.message } </p>
      </div>
    </main>
  )
}

export default Quotes

额外检查

  • 确保图片URL是公开可访问的,没有防盗链限制(比如Unsplash的这个链接是没问题的,但如果是你自己的图片,要确认邮件客户端能访问到)
  • sendEmailHTML函数要正确把生成的HTML作为邮件正文发送,并且设置正确的Content-Type: text/html头

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:16:46