Моя проблема:
Используя PHPMailer, я не могу отправлять аутентифицированные электронные письма SMTP при использовании localhost
Хост. Я не понимаю, почему это так.
Я понимаю, что основная проблема здесь почти наверняка связана с настройками Exim, а не PHPMailer, но я не могу найти никакого рабочего решения для решения этой проблемы.
О моем сервере:
У меня есть собственный сервер с установленным Exim 4.87 и PHPMailer 5.2.16. На сервере около 100 учетных записей, многие со своими списками рассылки и т. Д.
Сервер запускает учетную запись DNS, SMTP и хостинг в одном месте, поэтому сценариям PHP, вызывающим почтовую программу Exim, не нужно покидать сервер, все они локальные.
Попытки исправить:
Симптомы, похожие на Эта проблема. После прочтения этого поста я ослабил настройки Exim, чтобы никто не отправлял электронные письма (PHP) и различные другие разрешения в Exim:
И да, я прочитал Документация PHPMailer относительно неотправленных / неудавшихся писем.
Моя установка PHPMailer (только важные соответствующие биты):
//$this->Host = "server-hostname.co.uk"; //THis WORKS
//$this->Host = "account-domain.co.uk"; // this WORKS
$this->Host = "localhost"; // this FAILS
$this->SMTPAuth = true; // Only works on non-localhost Host.
//$this->Port = 25; //default.
$this->Username = 'email_Address@accountdomain.co.uk';
$this->Password = '...!...';
Я могу проверить, что правильный порт для TLS - 487, а правильный порт для простого SMTP - 25. Имя пользователя и пароль верны. Подробности выше работают, когда хост НЕ Localhost
. Но localhost не принимает никакой аутентификации при отправке.
Моя проблема в том, что для целей проверки электронной почты (и хорошей практики) мне нужно аутентифицировать исходящие электронные письма, но я могу аутентифицировать их только в том случае, если хост является удаленным хостом, а не локальным.
Это для меня вызывает 2-секундная задержка которую я хотел бы удалить. Я понимаю, что задержка возникает как из-за аутентификации, так и из-за SMTPSecure
. Этот ответ дает мне указатели на использование localhost для смягчения этой задержки, и это имеет смысл для меня, но каким-то образом установка сервера не принимает это.
У меня стандартная установка PHPMailer с использованием Host->localhost
и он работает нормально, за исключением того, что он не использует аутентификацию SMTP или SMTPSecurity.
ОШИБКИ:
(SMTPDebug = 4)
Примечание: извините, доменные имена несовместимы (.com и .co.uk), но вы поняли ...
2016-11-24 14:40:52 Connection: opening to localhost:25, timeout=20, options=array (
)
2016-11-24 14:40:52 Connection: opened
2016-11-24 14:40:52 SMTP -> get_lines(): $data is ""
2016-11-24 14:40:52 SMTP -> get_lines(): $str is "220-serverdomain.com ESMTP Exim 4.87 #1 Thu, 24 Nov 2016 14:40:52 +0000
"
2016-11-24 14:40:52 SMTP -> get_lines(): $data is "220-serverdomain.com ESMTP Exim 4.87 #1 Thu, 24 Nov 2016 14:40:52 +0000
"
2016-11-24 14:40:52 SMTP -> get_lines(): $str is "220- We do not authorize the use of this system to transport unsolicited,
"
2016-11-24 14:40:52 SMTP -> get_lines(): $data is "220-serverdomain.com ESMTP Exim 4.87 #1 Thu, 24 Nov 2016 14:40:52 +0000
220- We do not authorize the use of this system to transport unsolicited,
"
2016-11-24 14:40:52 SMTP -> get_lines(): $str is "220 and/or bulk e-mail.
"
2016-11-24 14:40:52 SERVER -> CLIENT: 220-serverdomain.com ESMTP Exim 4.87 #1 Thu, 24 Nov 2016 14:40:52 +0000
220- We do not authorize the use of this system to transport unsolicited,
220 and/or bulk e-mail.
2016-11-24 14:40:52 CLIENT -> SERVER: EHLO www.accountdomain.co.uk
2016-11-24 14:40:52 SMTP -> get_lines(): $data is ""
2016-11-24 14:40:52 SMTP -> get_lines(): $str is "250-serverdomain.com Hello www.accountdomain.co.uk [::1]
"
2016-11-24 14:40:52 SMTP -> get_lines(): $data is "250-serverdomain.com Hello www.accountdomain.co.uk [::1]
"
2016-11-24 14:40:52 SMTP -> get_lines(): $str is "250-SIZE 52428800
"
2016-11-24 14:40:52 SMTP -> get_lines(): $data is "250-serverdomain.com Hello www.accountdomain.co.uk [::1]
250-SIZE 52428800
"
2016-11-24 14:40:52 SMTP -> get_lines(): $str is "250-8BITMIME
"
2016-11-24 14:40:52 SMTP -> get_lines(): $data is "250-serverdomain.com Hello www.accountdomain.co.uk [::1]
250-SIZE 52428800
250-8BITMIME
"
2016-11-24 14:40:52 SMTP -> get_lines(): $str is "250-PIPELINING
"
2016-11-24 14:40:52 SMTP -> get_lines(): $data is "250-serverdomain.com Hello www.accountdomain.co.uk [::1]
250-SIZE 52428800
250-8BITMIME
250-PIPELINING
"
2016-11-24 14:40:52 SMTP -> get_lines(): $str is "250-AUTH PLAIN LOGIN
"
2016-11-24 14:40:52 SMTP -> get_lines(): $data is "250-serverdomain.com Hello www.accountdomain.co.uk [::1]
250-SIZE 52428800
250-8BITMIME
250-PIPELINING
250-AUTH PLAIN LOGIN
"
2016-11-24 14:40:52 SMTP -> get_lines(): $str is "250-STARTTLS
"
2016-11-24 14:40:52 SMTP -> get_lines(): $data is "250-serverdomain.com Hello www.accountdomain.co.uk [::1]
250-SIZE 52428800
250-8BITMIME
250-PIPELINING
250-AUTH PLAIN LOGIN
250-STARTTLS
"
2016-11-24 14:40:52 SMTP -> get_lines(): $str is "250 HELP
"
2016-11-24 14:40:52 SERVER -> CLIENT: 250-serverdomain.com Hello www.accountdomain.co.uk [::1]
250-SIZE 52428800
250-8BITMIME
250-PIPELINING
250-AUTH PLAIN LOGIN
250-STARTTLS
250 HELP
2016-11-24 14:40:52 CLIENT -> SERVER: STARTTLS
2016-11-24 14:40:52 SMTP -> get_lines(): $data is ""
2016-11-24 14:40:52 SMTP -> get_lines(): $str is "220 TLS go ahead
"
2016-11-24 14:40:52 SERVER -> CLIENT: 220 TLS go ahead
2016-11-24 14:40:52 SMTP Error: Could not connect to SMTP host.
2016-11-24 14:40:52 CLIENT -> SERVER: QUIT
2016-11-24 14:40:52 SMTP -> get_lines(): $data is ""
2016-11-24 14:40:52 SMTP -> get_lines(): $str is "221 serverdomain.com closing connection
"
2016-11-24 14:40:52 SERVER -> CLIENT: 221 serverdomain.com closing connection
2016-11-24 14:40:52 Connection: closed
2016-11-24 14:40:52 SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
Что мне следует изменить в Exim (или в другом месте), чтобы SMTP-аутентификация могла работать на localhost ?
При необходимости я могу показать вам журнал отладки успешных отправок, когда Host->"serverdomain.co.uk";
или Host->"accountdomain.co.uk";
. Ура
РЕДАКТИРОВАТЬ:
OpenSSL включен на PHP.
РЕДАКТИРОВАТЬ 2
Аутентификация файла конфигурации exim (часть)
#BEGIN ACL_NOTQUIT_BLOCK
# BEGIN INSERT ratelimit
# ignore authenticated hosts
accept authenticated = *
accept hosts = : +recent_authed_mail_ips : +loopback
warn
#only rate limit port 25
condition = ${if eq {$received_port}{25}{yes}{no}}
condition = ${if match {$smtp_notquit_reason}{command}{yes}{no}}
log_message = "Connection Ratelimit - $sender_fullhost because of notquit: $smtp_notquit_reason ($sender_rate/$sender_rate_period max:$sender_rate_limit)"
ratelimit = 1.2 / 1h / strict / per_conn
# END INSERT ratelimit
#END ACL_NOTQUIT_BLOCK