繁体   English   中英

PEAR 邮件在 php:apache Docker 容器中

[英]PEAR Mail in php:apache Docker container

我有两台服务器。 带有 Dovecot 的 Postfix 邮件服务器,否则,工作正常。 我可以使用 Gmail 客户端通过它发送邮件(所以,是的,那里安装了有效的证书)。 另一台服务器是我的应用服务器,它正在运行 php:7.4-apache 映像。 我已将 PEAR Mail 库安装到该容器/映像中,并且我正在尝试通过邮件服务器从应用程序发送邮件,但 PEAR Mail 客户端在发送 STARTTLS 后一直挂断。 问题:

我究竟做错了什么?

邮件服务器上的 Maillog 只说明了这一点:

Jun  1 17:36:46 Mimosa postfix/submission/smtpd[19141]: connect from unknown[10.0.0.14]
Jun  1 17:36:46 Mimosa postfix/submission/smtpd[19141]: lost connection after STARTTLS from unknown[10.0.0.14]
Jun  1 17:36:46 Mimosa postfix/submission/smtpd[19141]: disconnect from unknown[10.0.0.14]

从客户端调试 output 说:

[ehlo] Recv: 250-PIPELINING DEBUG: Recv: 250-SIZE 10240000 DEBUG: Recv: 250-VRFY DEBUG: 
Recv: 250-ETRN DEBUG: Recv: 250-STARTTLS DEBUG: Recv: 250-ENHANCEDSTATUSCODES DEBUG: 
Recv: 250-8BITMIME DEBUG: Recv: 250 DSN DEBUG: Send: STARTTLS DEBUG: 
Recv: 220 2.0.0 Ready to start TLS DEBUG: Send: RSET DEBUG: Send: QUIT

这是客户端上使用的代码:

<html><body>
<?php

var_dump(extension_loaded('openssl'));
//echo phpinfo();

include('/usr/local/lib/php/Mail.php');
$recipients = 'myemail@gmail.com'; //CHANGE
$headers['From']= 'noreply@mydomain.com'; //CHANGE
$headers['To']= 'myemail@gmail.com'; //CHANGE
$headers['Subject'] = 'Test message';
$body = 'Test message'; // Define SMTP Parameters
$params['host'] = '10.0.0.6';
$params['port'] = '587';
$params['auth'] = 'PLAIN';
$params['username'] = 'noreply'; //CHANGE
$params['password'] = 'password'; //CHANGE
$params['debug'] = 'true'; 

$mail_object =& Mail::factory('smtp', $params);

foreach ($params as $p){
 echo "$p<br />";
}

// Send the message
$mail_object->send($recipients, $headers, $body);

?>
</body></html>

我也试过下面的代码,基本上是一样的:

<?php

error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED ^ E_STRICT);

require_once "/usr/local/lib/php/Mail.php";

$host = "10.0.0.6";
$username = "noreply";
$password = "password";
$port = "587";
$to = "myemail@gmail.com";
$email_from = "noreply@mydomain.com";
$email_subject = "Testing Pear" ;
$email_body = "Sent using Pear install Mail" ;
$email_address = "noreply@domain.com";

$headers = array ('From' => $email_from, 'To' => $to, 'Subject' => $email_subject, 'Reply-To' => $email_address);
$smtp = Mail::factory('smtp', array ('host' => $host, 'port' => $port, 'auth' => true, 'username' => $username, 'password' => $password));
$mail = $smtp->send($to, $headers, $email_body);


if (PEAR::isError($mail)) {
echo("<p>" . $mail->getMessage() . "</p>");
var_dump($mail);
} else {
echo("<p>Message successfully sent!</p>");
}
?>

并收到以下错误:

" authentication failure [SMTP: STARTTLS failed (code: 220, response: 2.0.0 Ready to start TLS)]"

我已经尝试了端口 25 和 587,结果相同,但只有 587 应该可以工作。 我已经尝试将 auth 参数设置为 true、false 和 plain。 需要 STARTTLS 的邮件服务器拒绝注释掉 auth 参数。

在 Mail.php 中更改此行

function auth($uid, $pwd, $method = '', $tls = true, $authz = '')

当然,设置为 false 是行不通的,因为服务器需要 STARTTLS。 在两端禁用 TLS 可能会使其正常工作,但这并不能解决 TLS 的问题。

请不要告诉我只使用 PHPmailer。

谢谢你。

由于这里的问题是 TLS 不起作用,因此您应该编辑 Mail.php 的任何建议

WRONG    function auth($uid, $pwd, $method = '', $tls = ??, $authz = '') (Don't do this)

关闭 TLS 是荒谬的。

这里的问题是邮件服务器上的证书是针对特定名称的,而不是 LAN IP 地址。 我尝试使用 SAN 为 LAN IP 地址添加第二个证书,但这不起作用。 如果您使用的是反向代理,如我(HAproxy),那么它也无法使用 FQDN,而不是 LAN IP 地址,如果您的容器正在使用外部服务器(8.8.8.8)解析 DNS,虽然问题相反,可能有 NAT/PAT。

我找到的解决方案是在 LAN 上设置一个转发 DNS 服务器,具有与证书相同的域和主机的正向查找区域。 一种或另一种方式,$host 的值需要与邮件服务器证书上的名称匹配,并且您需要某种 DNS 来解析将您带到该服务器的地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM