首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP通过OpenSMTPD返回错误消息的邮件中继不符合RFC 2822

PHP通过OpenSMTPD返回错误消息的邮件中继不符合RFC 2822
EN

Stack Overflow用户
提问于 2022-04-01 11:20:30
回答 2查看 321关注 0票数 1

我的php.ini中有以下设置

代码语言:javascript
复制
[mail function]
sendmail_path = /usr/sbin/sendmail -t -i

二进制/usr/sbin/sendmail来自阿尔卑斯Linux上安装的ssmtp包。我想从专用网络将所有电子邮件转发到opensmtpd容器,所以我的/etc/ssmtp.conf如下所示:

代码语言:javascript
复制
mailhub=opensmtpd

我就是这样发邮件的:

代码语言:javascript
复制
$ php -r 'mail("valid@address.com", "Test subject", "This is our test message", "From: my@email.com");'

我得到了以下错误:

sendmail: 550 5.7.1未授权发送,消息拒绝:消息不符合RFC 2822

更新

将更详细的内容添加到sendmail命令中,并对/etc/ssmtp.conf进行了如下调整:

代码语言:javascript
复制
mailhub=opensmtpd:25
FromLineOverride=Yes
UseTLS=No

我就是这么叫它的

代码语言:javascript
复制
$ php -r '$headers = ["Date" => date("r", time()), "From" => "my@email.com", "Reply-To" => "my@email.com", "X-Mailer" => "PHP/" .
 phpversion()]; mail("valid@email.com", "Test subject", "This is our test masdlkfjaslkdfjaslkdfjaskldjfeproiqweessage\r\n", $headers);'

这是输出:

代码语言:javascript
复制
[<-] 220 opensmtpd-2298774033-mq2hl ESMTP OpenSMTPD
[->] HELO php-3107772150-7jj96
[<-] 250 opensmtpd-2298774033-mq2hl Hello php-3107772150-7jj96 [172.17.0.60], pleased to meet you
[->] MAIL FROM:<my@email.com>
[<-] 250 2.0.0: Ok
[->] RCPT TO:<opensmtpd:25@php-3107772150-7jj96>
[<-] 250 2.1.5 Destination address valid: Recipient ok
[->] DATA
[<-] 354 Enter mail, end with "." on a line by itself
[->] Received: by php-3107772150-7jj96 (sSMTP sendmail emulation); Fri, 01 Apr 2022 14:13:35 +0000
[->] To: valid@email.com
[->] Subject: Test subject
[->] Date: Fri, 01 Apr 2022 14:13:35 +0000
[->] From: my@email.com
[->] Reply-To: my@email.com
[->] X-Mailer: PHP/8.0.17
[->]
[->] This is our test masdlkfjaslkdfjaslkdfjaskldjfeproiqweessage
[->]
[->]
[->] .
[<-] 550 5.7.1 Delivery not authorized, message refused: Message is not RFC 2822 compliant

我还是不明白

更新2

从上面的输出可以看出,收件人是不正确的,这是因为ssmtp的阿尔卑斯包的sendmail不支持-t标志。当然,您可以将php配置中的sendmail_path更改为/usr/sbin/ssmtp -t -f,这将设置正确的接收者,但不幸的是,ssmtp不支持-v标志,这对我的调试至关重要。

实际上我让它起了很短的作用。我已经删除了ssmtp包,所以/usr/sbin/sendmail现在从busybox中使用。这就是我首先使用的,问题是它不能覆盖来自消息的电子邮件,所以您必须对发件人进行硬编码:

代码语言:javascript
复制
sendmail_path = /usr/sbin/sendmail -t -i -f my@email.com -v -S opensmtpd:25

一旦我这样做,并在我的身体信息与Body:,它开始工作,我实际上收到了电子邮件。然而,它也包括"Body:“在实际的电子邮件中,我觉得这很奇怪。我想这可能是OpenSMTPD中的一个bug,所以我将它从6.0.3更新到6.7.1。在那之后,它又停止工作了:

代码语言:javascript
复制
sendmail: recv:'220 opensmtpd-839025387-f4d7n ESMTP OpenSMTPD'
sendmail: send:'EHLO php-4163283461-9fd2b'
sendmail: recv:'250-opensmtpd-839025387-f4d7n Hello php-4163283461-9fd2b [172.17.0.50], pleased to meet you'
sendmail: recv:'250-8BITMIME'
sendmail: recv:'250-ENHANCEDSTATUSCODES'
sendmail: recv:'250-SIZE 36700160'
sendmail: recv:'250-DSN'
sendmail: recv:'250 HELP'
sendmail: send:'MAIL FROM:<my@email.com>'
sendmail: recv:'250 2.0.0 Ok'
sendmail: send:'RCPT TO:<valid@email.com>'
sendmail: recv:'250 2.1.5 Destination address valid: Recipient ok'
sendmail: send:'DATA'
sendmail: recv:'354 Enter mail, end with "." on a line by itself'
'endmail: send:'To: valid@email.com
'endmail: send:'Subject: Test subject
'endmail: send:'From: my@email.com
'endmail: send:'
'endmail: send:'Body: This is our test message
sendmail: send:''
sendmail: send:'.'
sendmail: recv:'550 5.7.1 Delivery not authorized, message refused: Message is not RFC 2822 compliant'
sendmail: . failed

这是opensmtpd配置:

代码语言:javascript
复制
listen on 0.0.0.0

table aliases file:/etc/smtpd/aliases

queue ttl 4d

bounce warn-interval 1h, 6h, 2d

smtp max-message-size 35M

table authinfo db:/etc/smtpd/authinfo.db
action act01 relay host "smtp+tls://user@host:587" auth <authinfo>
match from any for any action act01

直接从OpenSMTPD发送电子邮件就像一种魅力。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-02 15:13:05

正如@tripleee在评论中所指出的,这似乎是OpenSMTPD中的一个已知臭虫。我尝试在主体之前添加一个CR (\r):

代码语言:javascript
复制
$ php -r 'mail("<valid@email.com>", "Test subject", "\rThis is our test message", "From: my@email.com");'

但是只适用于OpenSMTPD 6.0,而不是6.7

代码语言:javascript
复制
sendmail: recv:'220 opensmtpd-401834694-0hz0r ESMTP OpenSMTPD'
sendmail: send:'EHLO php-4163283461-9fd2b'
sendmail: recv:'250-opensmtpd-401834694-0hz0r Hello php-4163283461-9fd2b [172.17.0.50], pleased to meet you'
sendmail: recv:'250-8BITMIME'
sendmail: recv:'250-ENHANCEDSTATUSCODES'
sendmail: recv:'250-SIZE 36700160'
sendmail: recv:'250-DSN'
sendmail: recv:'250 HELP'
sendmail: send:'MAIL FROM:<my@email.com>'
sendmail: recv:'250 2.0.0: Ok'
sendmail: send:'RCPT TO:<valid@email.com>'
sendmail: recv:'250 2.1.5 Destination address valid: Recipient ok'
sendmail: send:'DATA'
sendmail: recv:'354 Enter mail, end with "." on a line by itself'
'endmail: send:'To: <valid@email.com>
'endmail: send:'Subject: Test subject
'endmail: send:'From: my@email.com
'endmail: send:'
'his is our test message
sendmail: send:''
sendmail: send:'.'
sendmail: recv:'250 2.0.0: 9b837971 Message accepted for delivery'
sendmail: send:'QUIT'
sendmail: recv:'221 2.0.0: Bye'

更新

我在php存储库中找到了本期,讨论了与CRLF相同的问题,以及如何修复适用于所有OpenSMTPD版本的建议:

代码语言:javascript
复制
sendmail_path = '/usr/bin/dos2unix -u | /usr/sbin/sendmail -t -i -f my@email.com -v -S opensmtpd:25'

我仍然不确定是什么原因导致了问题,因为它不是遵循RFC,就是php、sendmail (busybox和ssmtp的)或OpenSMTPD。但就目前而言,我认为使用dos2unix作为解决问题的解决方案是可行的。

加法

这是问题所在在php存储库中报告的,它说,按照RFC的规定,头不是用CRLF分隔的。这就是修复它的承诺 (根据我从8.1.3和8.0.16中得到的信息)。因此,PHP现在使用了正确的分隔符\r\n,但是sendmail需要\n,所以看起来它毕竟是一个sendmail bug。

票数 1
EN

Stack Overflow用户

发布于 2022-04-01 13:00:52

RFC2822说日期:和从:标题是必需的(第3.6节)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71706100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档