You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SendGrid模板邮件主题特殊字符编码失效问题求助

解决SendGrid-Ruby发送邮件主题特殊字符转义问题

看起来你遇到的是SendGrid模板邮件中主题字段被意外HTML转义的问题,导致单引号、&这类特殊字符变成了'这类实体编码。这里有两种可靠的解决方案:

方案一:直接设置Personalizations的Subject字段(推荐)

问题的核心在于你把主题放在了dynamic_template_data里,而这个对象是给模板中的变量提供数据的,SendGrid会默认对其中的内容做HTML转义处理。正确的做法是直接把主题设置在personalizationssubject字段中——这是邮件的原生主题字段,不会经过模板的转义流程。

修改你的代码如下:

# 直接在personalizations里设置主题
@body_json['personalizations'][0]['subject'] = "How's it going & this works"

# 动态模板数据只保留模板需要的其他变量
@body_json['personalizations'][0]['dynamic_template_data'] = { 
  'email_title': @email_title, 
  'content': @description 
}

SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY']).client.mail._('send').post(request_body: @body_json)

这样发送后,邮件主题会直接显示原始的特殊字符,不会被转义。

方案二:如果必须通过模板变量设置主题,关闭转义

如果你因为业务需求必须通过dynamic_template_data传递主题,那需要修改SendGrid模板中的主题输出方式:

  • 打开你的SendGrid模板编辑器,找到主题设置栏
  • 把原来的{{subject}}改成{{{subject}}}(三个大括号)

Handlebars模板中,双大括号{{}}会自动转义HTML特殊字符,而三大括号{{{}}}会输出原始字符串,避免转义。这样就能保证你传递的主题字符串原样显示。

为什么之前的编码尝试没用?

你尝试的ASCII、ISO_8859_1编码解决不了这个问题,因为问题根源不是字符编码不兼容,而是SendGrid对模板变量的HTML转义处理——不管你用什么编码,只要经过模板的转义逻辑,特殊字符都会被转换成HTML实体。

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

火山引擎 最新活动