Symfony使用Gmail发邮件出现(3D =20) quoted-printable编码异常
Symfony Mailer Gmail HTML邮件编码异常解决方案
问题根因:手动重复添加
Content-Type、Content-Transfer-Encoding邮件头,破坏了Symfony Mailer自动生成的合规邮件结构,导致Gmail无法正确识别内容编码,直接展示原始的quoted-printable编码串。
- 第一步:删除手动添加邮件头的两行冗余代码
Symfony调用Email::html()方法后会自动生成符合规范的text/html; charset=utf-8内容类型头,也会根据传输层自动适配内容传输编码,不需要手动新增重复头。 - 第二步:如有强制指定传输编码的需求,使用Symfony原生Header操作方法修改已有头,而非新增重复头
如需强制使用quoted-printable编码:
如需强制使用base64编码:// 不要用addTextHeader新增,直接修改已生成的头 $email->getHeaders()->get('Content-Transfer-Encoding')->setBody('quoted-printable');
注意:不要手动对$email->getHeaders()->get('Content-Transfer-Encoding')->setBody('base64');$emailContent做base64/quoted-printable编码,Symfony会自动按照指定编码对原始HTML内容做符合RFC规范的编码处理,自动处理每行长度换行,不会出现内容截断问题 - 第三步:校验传入的
$emailContent编码,确保内容本身为原生UTF-8格式,未提前做多余的转义、编码处理。
修正后的完整业务代码参考:
$userEmail = $this->getUser()->getGoogleEmail(); $userGoogleAppPassword = $this->getUser()->getGoogleAppPassword(); $email = (new \Symfony\Component\Mime\Email()) ->from($userEmail) ->to($clientDetails->getPrimaryEmail()) ->subject($emailFound->getSubject()) ->html($emailContent); // 移除原有的两行手动加头代码,如有强制编码需求按上述方法修改已有的头即可 $transport = new GmailSmtpTransport($userEmail, $userGoogleAppPassword); $handler = new MessageHandler($transport); $bus = new MessageBus([ new HandleMessageMiddleware(new HandlersLocator([ SendEmailMessage::class => [$handler], ])), ]); $mailer_new = new Mailer($transport, $bus); $mailer_new->send($email);
内容的提问来源于stack exchange,提问作者PeterJ
相关产品推荐
相关产品推荐

