通过 openssl 和 s_client 发送电子邮件 SMTP 的带有特殊字符的主题出错
Error in subject with special characters sending Email SMPT by openssl and s_client
我在 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 <norepley@sender.com>" some_email@example.com
由于来自智能主机的 UTF8,我收到错误消息:
status=bounced (SMTPUTF8 is required, but was not offered by host <smarthost>
我已将参数添加到后缀中以避免该错误smtputf8_enable = no
如果我执行最后一个邮件命令发送电子邮件,电子邮件已发送,但特殊字符在 Microsoft 电子邮件中打印错误,但在 Gmail 中是正确的。
作为解决方法,我创建了一个包含特殊字符的正文失败。我发送为:
mailx -s "Some text with special characters è à" -a "From: Sender <norepley@sender.com>" some_email@example.com < body.txt
这封电子邮件在所有电子邮件帐户中以正确的方式显示为正文,但主题在基于 Microsoft 的帐户中仍然是错误的。
有关如何强制以正确方式打印 Microsoft 电子邮件主题的线索?
提前致谢
这里有很多要讨论的:
- 除非所有涉及的系统都支持
SMTPUTF8
扩展,否则您不能在 header 字段中使用 UTF-8。
8BITMIME
扩展名仅表示body中保留了8位内容(如UTF-8,而ASCII只是7位内容)。作为客户端,一旦服务器表明它支持 8BITMIME
对您的 EHLO
命令的响应,您就表明您发送带有 MAIL FROM:<example@example.com> BODY=8BITMIME
的 8 位 body。
- 如果所有涉及的服务器都支持
8BITMIME
,您应该使用 headers MIME-Version: 1.0
、[=17= 为接收邮件客户端标记 body ],以及 Content-Type: text/plain; charset=utf-8
。如果不是每个人都支持8BITMIME
,你必须使用Content-Transfer-Encoding
。
- 由于
SMTPUTF8
未得到广泛支持,您必须使用 Encoded-Word encoding according to RFC 2047 对 non-ASCII 进行编码。例如,主题 ¡Buenos días!
可以编码为 =?ISO-8859-1?Q?=A1Buenos_d=EDas!?=
.
- RFC 5321 要求在
MAIL FROM
和 RCPT TO
命令中将地址括在尖括号中。您的示例必须是 MAIL FROM:<example@example.com>
和 RCPT TO:<emailto@emailto.com>
.
STARTTLS
之后,客户端和服务器将重置为初始状态。作为客户端,您应该发送另一个 EHLO
命令,服务器可以使用与 TLS 握手之前不同的扩展列表响应该命令。
- 并非所有服务器都支持
PIPELINING
and even if they do, you should wait for the initial greeting before sending any command and wait for the server's response to the EHLO
and DATA
commands before continuing. While what you do can work, not adhering to the RFC standard can be used to filter spam。
- 根据 RFC 5322,
Date
是必填字段 header。
我在 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 <norepley@sender.com>" some_email@example.com
由于来自智能主机的 UTF8,我收到错误消息:
status=bounced (SMTPUTF8 is required, but was not offered by host <smarthost>
我已将参数添加到后缀中以避免该错误smtputf8_enable = no
如果我执行最后一个邮件命令发送电子邮件,电子邮件已发送,但特殊字符在 Microsoft 电子邮件中打印错误,但在 Gmail 中是正确的。
作为解决方法,我创建了一个包含特殊字符的正文失败。我发送为:
mailx -s "Some text with special characters è à" -a "From: Sender <norepley@sender.com>" some_email@example.com < body.txt
这封电子邮件在所有电子邮件帐户中以正确的方式显示为正文,但主题在基于 Microsoft 的帐户中仍然是错误的。
有关如何强制以正确方式打印 Microsoft 电子邮件主题的线索?
提前致谢
这里有很多要讨论的:
- 除非所有涉及的系统都支持
SMTPUTF8
扩展,否则您不能在 header 字段中使用 UTF-8。 8BITMIME
扩展名仅表示body中保留了8位内容(如UTF-8,而ASCII只是7位内容)。作为客户端,一旦服务器表明它支持8BITMIME
对您的EHLO
命令的响应,您就表明您发送带有MAIL FROM:<example@example.com> BODY=8BITMIME
的 8 位 body。- 如果所有涉及的服务器都支持
8BITMIME
,您应该使用 headersMIME-Version: 1.0
、[=17= 为接收邮件客户端标记 body ],以及Content-Type: text/plain; charset=utf-8
。如果不是每个人都支持8BITMIME
,你必须使用Content-Transfer-Encoding
。 - 由于
SMTPUTF8
未得到广泛支持,您必须使用 Encoded-Word encoding according to RFC 2047 对 non-ASCII 进行编码。例如,主题¡Buenos días!
可以编码为=?ISO-8859-1?Q?=A1Buenos_d=EDas!?=
. - RFC 5321 要求在
MAIL FROM
和RCPT TO
命令中将地址括在尖括号中。您的示例必须是MAIL FROM:<example@example.com>
和RCPT TO:<emailto@emailto.com>
. STARTTLS
之后,客户端和服务器将重置为初始状态。作为客户端,您应该发送另一个EHLO
命令,服务器可以使用与 TLS 握手之前不同的扩展列表响应该命令。- 并非所有服务器都支持
PIPELINING
and even if they do, you should wait for the initial greeting before sending any command and wait for the server's response to theEHLO
andDATA
commands before continuing. While what you do can work, not adhering to the RFC standard can be used to filter spam。 - 根据 RFC 5322,
Date
是必填字段 header。