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

邮件重音字符显示为问号?MySQL/AmazonSES/Gmail问题求助

解决Amazon SES发送含特殊字符邮件在Gmail中乱码的问题

这个问题绝对不是Gmail端的锅,核心原因是你发送邮件时没有正确指定UTF-8编码,导致SES传递的邮件内容编码不明确,Gmail只能用默认编码解析,才出现了乱码。下面是具体的解决步骤:

1. 明确声明邮件正文的编码

不管你发的是HTML邮件还是纯文本邮件,必须在Content-Type头里明确指定charset=utf-8:

  • 如果是HTML正文:
    数据库里读出来的UTF-8字符串可以直接用,不需要额外用htmlentities转义(HTML本身支持UTF-8特殊字符的直接显示)。用AWS SDK构建邮件时,要给Body的Html部分指定Charset:
    $htmlBody = '<p>Bebé Elosúa Sierra</p>';
    $message = [
        'Body' => [
            'Html' => [
                'Data' => $htmlBody,
                'Charset' => 'UTF-8'
            ]
        ]
    ];
    
  • 如果是纯文本正文,同样要给Text部分指定Charset为UTF-8,避免Gmail用非UTF-8编码解析。

2. 修复邮件主题的编码问题

邮件主题的乱码更严重,是因为主题没有按照RFC 2047标准进行编码。邮件客户端对主题的编码要求更严格,不能直接传原始UTF-8字符串,需要做MIME编码处理。

比如在PHP里可以用mb_encode_mimeheader函数处理主题:

$rawSubject = 'Bebé Elosúa Sierra';
$encodedSubject = mb_encode_mimeheader($rawSubject, 'UTF-8', 'B'); // B代表Base64编码,也可以用Q编码

然后在SES的Message参数里,把Subject的Data设为这个编码后的字符串,同时指定Charset为UTF-8。

3. 避免多余的编码转换

你的数据库已经是utf8mb4_unicode_ci,读取出来的字符串本身就是UTF-8编码的,不要用htmlentities处理后再作为邮件内容发送——这个函数会把é转成&eacute;,如果邮件头没明确编码,反而会加重解析混乱。

4. 验证邮件原始内容

你可以在Gmail里点击“显示原始内容”,检查两个关键点:

  • 确认Content-Type头包含charset=utf-8
  • 确认主题是=?UTF-8?B?xxxx?=这类符合MIME标准的编码格式

只要这些设置都正确,Gmail就能正常显示特殊字符了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:45:21