我的php.ini中有以下设置
[mail function]
sendmail_path = /usr/sbin/sendmail -t -i二进制/usr/sbin/sendmail来自阿尔卑斯Linux上安装的ssmtp包。我想从专用网络将所有电子邮件转发到opensmtpd容器,所以我的/etc/ssmtp.conf如下所示:
mailhub=opensmtpd我就是这样发邮件的:
$ 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进行了如下调整:
mailhub=opensmtpd:25
FromLineOverride=Yes
UseTLS=No我就是这么叫它的
$ 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);'这是输出:
[<-] 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中使用。这就是我首先使用的,问题是它不能覆盖来自消息的电子邮件,所以您必须对发件人进行硬编码:
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。在那之后,它又停止工作了:
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配置:
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发送电子邮件就像一种魅力。
发布于 2022-04-02 15:13:05
正如@tripleee在评论中所指出的,这似乎是OpenSMTPD中的一个已知臭虫。我尝试在主体之前添加一个CR (\r):
$ php -r 'mail("<valid@email.com>", "Test subject", "\rThis is our test message", "From: my@email.com");'但是只适用于OpenSMTPD 6.0,而不是6.7
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版本的建议:
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。
发布于 2022-04-01 13:00:52
RFC2822说日期:和从:标题是必需的(第3.6节)
https://stackoverflow.com/questions/71706100
复制相似问题