SendGrid模板邮件主题特殊字符编码失效问题求助
解决SendGrid-Ruby发送邮件主题特殊字符转义问题
看起来你遇到的是SendGrid模板邮件中主题字段被意外HTML转义的问题,导致单引号、&这类特殊字符变成了'这类实体编码。这里有两种可靠的解决方案:
方案一:直接设置Personalizations的Subject字段(推荐)
问题的核心在于你把主题放在了dynamic_template_data里,而这个对象是给模板中的变量提供数据的,SendGrid会默认对其中的内容做HTML转义处理。正确的做法是直接把主题设置在personalizations的subject字段中——这是邮件的原生主题字段,不会经过模板的转义流程。
修改你的代码如下:
# 直接在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




