在电子邮件正文中发送加重字符,如何解决编码问题

Send accentuated characters inside an email body, how to fix encoding issues

提问人:Sumak 提问时间:12/17/2020 最后编辑:CommunitySumak 更新时间:12/17/2020 访问量:102

问:

在发送电子邮件的脚本中,我必须弄清楚如何正确编码电子邮件正文以支持重音字符。我将电子邮件分为 3 个部分:标题、正文和附件,如本教程所示 https://www.tutorialspoint.com/ruby/ruby_sending_email.htmNet::SMTP

修复标题字段的此问题没什么大不了的:Subject

require 'base64'

MARKER = 'FOOBAR'

def self.headers
  <<~EOF
    From: [email protected]
    To: [email protected]
# Base64 encoded UTF-8
    Subject: =?UTF-8?B?#{Base64.strict_encode64('Accentuated characters supportés')}?=
    Date: #{Time.now.to_s}
    MIME-Version: 1.0
    Content-Type: multipart/mixed; boundary=#{MARKER}
    --#{MARKER}
  EOF
end

我很想为电子邮件正文重现相同的逻辑,但没有任何成功。我再次尝试了几个标头,例如 Language、Content-LanguageContent-Tranfer-Encoding,但没有任何成功。 使用 Ruby 也是无效的。.encode!('utf-8')

我能想到的唯一可行的解决方案是发送 HTML 编码字符:使用 而不是在 HTML 块内。不过,我想避免这种解决方案,因为我必须提高对编码问题的理解。&eacuteé

有人对这个问题有建议吗?


这是我到目前为止的代码,如果它可以帮助任何人:

module Reports
  module SMTP
    MARKER = 'FOOBAR'

    def self.send_report(file_path)
      file_content    = File.binread(file_path)
      encoded_content = [file_content].pack('m') # Base64

      mail_content = headers + body + attachment(file_path, encoded_content)

      begin
        Net::SMTP.start('my.smtp.srv', 25, 'HELO_fqdn', 'username', 'p455w0rD', :plain) do |smtp|
          smtp.send_message(mail_content, '[email protected]', ['[email protected]', '[email protected]'])
        end
      rescue => e
        puts e.inspect, e.backtrace
      end
    end

    def self.headers
      # see above
    end

    def self.body
      <<~EOF
        Content-Type: text/html
        Content-Transfer-Encoding:utf8

        Here's a franglish text with some characters accentués

        --#{MARKER}
      EOF
    end

    def self.attachment(file_path, encoded_content)
      <<~EOF
        Content-Type: multipart/mixed; name = #{file_path}
        Content-Transfer-Encoding:base64
        Content-Disposition: attachment; filename = #{file_path}

        #{encoded_content}

        --#{MARKER}--
      EOF
    end
  end
end

注意:这些电子邮件由 ProtonMail 网络客户端正确解码,但我们公司的网络客户端 (OBM) 无法正确显示突出字符或附件。

Ruby 编码 UTF-8 SMTP

评论


答:

0赞 Sumak 12/17/2020 #1

从正文部分添加到标题解决了我的问题。;charset="utf-8"Content-Type

Content-Type: text/html;charset="utf-8"