通过 openssl 和 s_client

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?