【问题标题】:Error in subject with special characters sending Email SMPT by openssl and s_client通过 openssl 和 s_client 发送电子邮件 SMTP 的特殊字符主题错误
【发布时间】:2021-03-02 21:09:12
【问题描述】:

我在 Linux 中有一个用于发送电子邮件的 bash 脚本。我通过 openssl 和 s_client 使用 SMTP。

它是多语言的,所以有时会有特殊字符(è、à...)在正文中正确显示,但在任何基于 Microsoft(Outlook、Hotmail...)的主题中都没有。

使用 openssl

我使用以下命令:

openssl s_client -crlf -quiet -starttls smtp -connect <smarhost.server>:<port> < <configuration_and_body_file>

<configuration_and_body_file> 是一个纯文本文件,其中包含以下连接协议和电子邮件数据

MAIL FROM: example@example.com
RCPT TO: emailto@emailto.com
DATA
From: Sender <example@example.com>
To:  emailto@emailto.com
Subject: accès à ...

Some text with special characters as (è, à, ë...)


.
QUIT

如果我将它发送到 Gmail 或任何不同于 Microsoft(Outloik、Hotmail)的邮件,则主题和正文是正确的。但是当收款人使用 Hotmail 或 Outlook 时,特殊字符被错误解码为à 或其他字符。

命令的输出如下:

verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign GCC R3 DV TLS CA 2020
verify return:1
depth=0 CN = *.<foodomain>
verify return:1
250 DSN
250-gefwml03e.<foodomain>
250-PIPELINING
250-SIZE 31457280
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
250 2.1.0 Ok
250 2.1.5 Ok
354 End data with <CR><LF>.<CR><LF>
250 2.0.0 Ok: queued as 27C77671AE7_3E83FBF
221 2.0.0 Bye

在这种情况下可能是 250-8BITMIME 我该如何更改它?我尝试添加 -utf8 但它不起作用。

使用 mailx 和 postfix

我已经安装了 mailutils 包并配置了 postfix。将智能主机添加到relayhost 并设置inet_interfaces = loopback-only

我已使用以下命令发送电子邮件:

echo "Some text with special characters è à" | mailx -s "From: Some text with special characters è à" -a "Sender &lt;norepley@sender.com&gt;" some_email@example.com

由于来自 smarthost 的 UTF8,我得到错误:

status=bounced (SMTPUTF8 is required, but was not offered by host &lt;smarthost&gt;

我已将参数添加到后缀以避免该错误smtputf8_enable = no

如果我执行最后一个邮件命令来发送电子邮件,则会发送电子邮件,但特殊字符在基于 Microsoft 的电子邮件中打印错误,但在 Gmail 中是正确的。

作为解决方法,我创建了一个包含特殊字符的正文失败。我发送为:

mailx -s "Some text with special characters è à" -a "From: Sender &lt;norepley@sender.com&gt;" some_email@example.com &lt; body.txt

此电子邮件在所有电子邮件帐户中以正确的方式显示为正文的特殊字符,但在基于 Microsoft 的帐户中主题仍然错误。

关于如何强制主题也以正确的方式打印为基于 Microsoft 电子邮件的一些线索?

提前致谢

【问题讨论】:

    标签: utf-8 outlook openssl smtp mailx


    【解决方案1】:

    这里有很多要讨论的:

    • 除非所有相关系统都支持 SMTPUTF8 扩展,否则您不能在标头字段中使用 UTF-8。
    • 8BITMIME 扩展名仅表示正文中保留了 8 位内容(例如 UTF-8,而 ASCII 仅是 7 位内容)。作为客户端,一旦服务器在响应您的EHLO 命令时表明它支持8BITMIME,您就表明您发送一个带有MAIL FROM:&lt;example@example.com&gt; BODY=8BITMIME 的8 位正文。
    • 如果所有涉及的服务器都支持8BITMIME,您应该使用标题MIME-Version: 1.0Content-Transfer-Encoding: 8bitContent-Type: text/plain; charset=utf-8 将您的正文标记为接收邮件客户端。如果不是所有人都支持8BITMIME,你必须使用Content-Transfer-Encoding
    • 由于SMTPUTF8 未被广泛支持,您必须根据RFC 2047 使用Encoded-Word encoding 编码非ASCII。例如,主题¡Buenos días!可以编码为=?ISO-8859-1?Q?=A1Buenos_d=EDas!?=
    • RFC 5321 需要在MAIL FROMRCPT TO 命令中的地址周围加上尖括号。您的示例必须是 MAIL FROM:&lt;example@example.com&gt;RCPT TO:&lt;emailto@emailto.com&gt;
    • STARTTLS 之后,客户端和服务器被重置为初始状态。作为客户端,您应该发送另一个 EHLO 命令,服务器可以使用与 TLS 握手之前不同的扩展列表来响应该命令。
    • 并非所有服务器都支持PIPELINING,即使支持,您也应该在发送任何命令之前等待初始问候语,并等待服务器对EHLODATA 命令的响应,然后再继续。虽然你所做的可以工作,但不遵守 RFC 标准可用于filter spam
    • 根据RFC 5322Date是一个必填的头域。

    【讨论】:

    • 非常感谢您提供如此扩展和完整的解释。最后,我按照您的建议使用 ISO-8859-1 根据 RFC 2047 对主题进行了编码,并且工作正常
    • 不客气!作为补充说明:我在上面的示例中使用了 ISO-8859-1,因为它对所有支持的字符使用单个字节。使用 UTF-8 会产生更长的编码。像 ? 这样的主题不能用 ISO-8859-1 编码。可能的编码是=?UTF-8?B?8J+Zgg==?=。如果您自己编写编码,您可能希望始终选择 UTF-8 和 Base64 编码。
    • 很高兴知道,我会记住的。感谢您的帮助!
    猜你喜欢
    • 2012-12-12
    • 2019-09-01
    • 1970-01-01
    • 2014-04-25
    • 2015-02-21
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多