it-roy-ru.com

Конфигурация SMTP не работает в производстве

Я пытаюсь отправить электронное письмо при отправке формы. Я использую PHPMailer для отправки почты с использованием приведенной ниже конфигурации.

$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = 'mail.example.in'; 
$mail->Port = 25; 
$mail->SMTPAuth = true;
$mail->Username = '[email protected]'; 
$mail->Password = 'password'; 

$mail->setFrom("[email protected]" , "User");
$mail->addAddress('[email protected]', 'Receiver');
$mail->addBCC('[email protected]', 'Another user');
$mail->AddReplyTo('[email protected]', 'User');

$mail->isHTML(true);

$mail->Subject = $subject;
$mail->Body    = $message;
if($mail->send())
    echo "Your request has been received. We will soon contact you.";
else echo "Unable to send your request. Please try again";

Это прекрасно работает в localhost. Но когда я развертываю его на своем сервере (example.in), я получаю следующее исключение.

SMTP ERROR: Failed to connect to server: Connection timed out (110)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

--Правка--

Я попытался подключиться к SMTP-серверу с помощью команды telnet, но не могу добавить получателя. Я получаю ошибку ниже?

Last login: Fri Sep 16 11:08:06 on ttys000
admin:~ admin$ telnet mail.example.in 25
Trying 111.91.153.112...
Connected to mail.example.in.
Escape character is '^]'.
220 fbs-ho-mailserver.example.in ESMTP Service (Lotus Domino Release 8.5.3FP3) ready at Fri, 16 Sep 2016 11:36:01 +0530
HELO example.in
250 fbs-ho-mailserver.example.in Hello example.in ([111.91.127.222]), pleased to meet you
MAIL from: [email protected]
250 [email protected] Sender OK
RCPT to: [email protected]
554 Relay rejected for policy reasons.

-- Правка --

Мне удалось настроить эту учетную запись в Outlook. Я действительно смущен тем, что происходит.

enter image description here

21
Aakash

Ваша ошибка говорит:

SMTP ERROR: Failed to connect to server: Connection timed out (110)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

Итак, давайте посмотрим на https://github.com/PHPMailer/PHPMailer/wiki/Trou Troubleshooting :

"Ошибка SMTP: не удалось подключиться к узлу SMTP".

Это также может отображаться как сбой подключения SMTP () или Called Mail () без подключения в выходных данных отладки. Об этом часто говорят как о проблеме PHPMailer, но почти всегда это связано с локальным отказом DNS, блокировкой брандмауэра (например, как это делает GoDaddy) или другой проблемой в вашей локальной сети. Это означает, что PHPMailer не может связаться с SMTP-сервером, который вы указали в свойстве Host, но точно не говорит, почему. Это также может быть вызвано отсутствием загруженного расширения openssl (см. Примечания по шифрованию ниже).

Некоторые методы диагностики источника этой ошибки обсуждаются ниже.

GoDaddy

Популярный американский хостинг-провайдер GoDaddy налагает очень строгие (почти бесполезные) ограничения на отправку электронной почты. Они блокируют исходящий SMTP на порты 25, 465 и 587 для всех серверов, кроме своих собственных. Эта проблема является предметом многих неприятных вопросов о переполнении стека. Если вы обнаружите, что ваш скрипт работает на вашем локальном компьютере, но не когда вы загружаете его в GoDaddy, это будет происходить с вами. Решение очень плохо документировано GoDaddy: вы должны отправлять через их серверы, а также отключать все функции безопасности, имя пользователя и пароль (отлично, да ?!), предоставляя вам эту конфигурацию для PHPMailer:

$mail->isSMTP();
$mail->Host = 'relay-hosting.secureserver.net';
$mail->Port = 25;
$mail->SMTPAuth = false;
$mail->SMTPSecure = false;

GoDaddy также отказывается отправлять сообщения с адреса From, принадлежащего любому домену aol, gmail, yahoo, hotmail, live, aim или msn (см. Их документы). Это связано с тем, что на всех этих доменах применяются меры защиты от подделки SPF и DKIM, а подделка вашего адреса - подделка.

Вам может быть проще перейти на более просвещенного хостинг-провайдера.

3
LSerni

Проблема - скорее две не связанные проблемы - которые вы испытываете, довольно просты:

ОШИБКА SMTP: не удалось подключиться к серверу: истекло время ожидания соединения (110) Ошибка подключения SMTP ().

и вы убедились, что сервер действительно принимает подключения:

Я попытался подключиться к SMTP-серверу с помощью команды telnet

Last login: Fri Sep 16 11:08:06 on ttys000
admin:~ admin$ telnet mail.example.in 25
Trying 111.91.153.112...
Connected to mail.example.in.

Ваш сценарий не может подключиться к SMTP-серверу при запуске с его рабочего сервера .

Вероятная причина заключается в том, что на производственном сервере установлен межсетевой экран, который во избежание злоупотреблений предотвращает любое подключение к внешней стороне . Сервер может обслуживать веб-запросы, но не более.

Если ваш тест подтвердил, что порт 25 не отвечает , то (после проверки правильности адреса хоста) вы могли попробовать вместо этого telnet mail.example.in 587 . Если это сработало, это могло означать, что сервер не принимает небезопасные соединения (порт 25), но принимает безопасные соединения. С PHPMailer вы могли бы попытаться активировать безопасное соединение :

$mail->SMTPSecure = 'tls';

или же

$mail->SMTPSecure = 'ssl';

Если это не сработает, у вас все еще может быть проблема с брандмауэром; или вам может понадобиться просмотреть phpinfo() и убедиться, что у вас есть поддержка OpenSSL в PHP.

Что тебе необходимо сделать

  • попросите ИТ-специалистов, обслуживающих производственный сервер, открыть брандмауэр;
  • более многообещающе, спросите их , как отправлять электронные письма с этого сервера. Скорее всего, вам нужно использовать функцию mail() или использовать localhost или 127.0.0.1 в качестве SMTP-сервера. Тогда письма будут отправляться через сервисную сеть вашего производственного сервера.

Они могут сказать вам, что порт 25 не разрешен, но порт (скажем) 465 или 567 будет разрешен. Вам придется обновить свою конфигурацию и/или соответственно добавить TLS/SSL (см. Выше).

  • или вам может быть разрешено подключиться к стороннему SMTP-серверу, для которого вам нужно будет указать IP-адрес, чтобы ИТ-специалисты могли открыть подходящее окно брандмауэра. Тогда письма будут отправляться через сторонний сервер.

Вторая проблема (возможно, НЕ проблема)

250 [email protected] ... Отправитель ОК RCPT: [email protected] 554 Ретрансляция отклонена по политическим причинам

Кроме того, во избежание злоупотреблений SMTP-серверы позволяют не всем подключаться и отправлять электронные письма, но только своим клиентам. Я вижу, что в конфигурации PHPMailer вы указали пользователя и пароль. В сеансе telnet вы этого не сделали. Поэтому вполне может быть, что PHPmailer может отправлять, но не подключаться, тогда как ваш telnet может подключаться, но не отправлять.

Как только вы решите проблему с подключением, ваша проблема с аутентификацией будет либо решена, либо исчезнет (поскольку вы будете использовать другой сервер, предоставленный вам ИТ-специалистами, например, localhost).

Третья проблема (может никогда не возникнуть)

Третий способ злоупотребления службами - это чрезмерное использование - отправка слишком большого количества электронных писем слишком большому количеству людей. Уточните у ИТ-специалистов приемлемые правила отправки электронных писем.

Проблемы, проблемы

Другие вещи, на которые стоит обратить внимание: достоверность источника (вы можете отправлять электронные письма от имени какого-либо домена, который не назначил ваш SMTP-сервер в качестве разрешенного отправителя), и конфиденциальность данных (даже при подключениях TLS/SSL, если вам назначено localhost в качестве SMTP-сервера, ваши ИТ-специалисты получат полный, беспрепятственный, необнаружимый доступ к любой электронной почте, которую вы отправить. Вы можете или не можете быть в порядке с этим).

2
LSerni

Это плохая идея использовать свой собственный SMTP. В зависимости от того, что вам нужно с этим делать, у вас есть большие шансы заблокировать ваши электронные письма тем или иным способом или спамом. И вам придется потратить несколько раз, чтобы поддерживать ваш сервер в актуальном состоянии.

Используйте онлайн-сервисы, которые занесены в белый список для каждого провайдера и которые предоставляют API для отправки ваших транзакционных писем: https://www.mailjet.com/http://mailchimp.com/ ...

Они часто предлагают бесплатную учетную запись для небольшого объема (до 2000 писем в день). Использование API довольно тривиально и может быть реализовано за несколько минут (например: https://dev.mailjet.com/ )

1
ArGh

Я думаю, что за несколько шагов мы сможем заставить это работать правильно.

  1. В вашей панели Godaddy/Hostgator > Выберите записи MX> Выберите нужный домен> Выберите "Удаленный почтовый обменник "

    В это время вы можете проверить доставку почты, проблема может быть решена.

  2. Я уверен, что он настроен правильно, но поверьте мне, когда дело доходит до хороших оле Cpanel, PhpMailer и Godaddy/Hostgator. Это место, где здравый смысл не имеет смысла.

заменить:

$mail->Host = 'mail.example.in';

с:

$mail->Host = 'localhost';

Я считаю, что это должно решить любые проблемы, если предположить, что такие данные, как учетные данные, являются действительными.

1
norcal johnny

Спросите у вашего хостинг-провайдера, включен ли smtp не на этом сервере. У меня была одна и та же проблема для smtp и curl обоих. Обратитесь к провайдеру хостинга.

1
Akash Ganatra

1-я цитата (из сообщества IBM):

[email protected] был членом группы (Отклонить), которая была указана в поле gmail.com "Запретить сообщения, предназначенные для следующих адресов Интернета" (в поле "Конфигурация Domino" на целевом сервере "Маршрутизатор/SMTP, Ограничения и элементы управления", Вкладка "Элементы управления входящим целевым получателем" на вкладке SMTP.

Удаление иерархического имени Мэри (Мэри Джонс/ABC) из списка участников в документе "Отклонить (группа)" позволяет Марии получать сообщения из Интернета.

2-я цитата:

Большинство почтовых серверов, чтобы предотвратить их использование в качестве анонимных спам-ретрансляторов, настроены только на ретрансляцию почты с определенных хостов.

1
T.Todua

Какая версия phpmailer?

Вы можете забыть добавить эту строку

  $mail->IsSMTP(); //  use SMTP

после запуска $ mail.

Попробуй.

1
HongZhen Liu

Итак, у вас есть сервер GoDaddy, и вы хотите отправлять электронную почту через недавно приобретенный SMTP Relay. Ну "Вы не можете" - это, вероятно, то, что вы найдете, если немного покопаться в Google.

Если вы еще немного поковыряетесь, вы, вероятно, обнаружите, что официальное решение GoDaddy - это использовать их внутреннюю почту. Это не идеально, потому что они установили произвольные барьеры, такие как этот:

Наши выделенные серверы имеют лимит исходящей электронной почты 1000 в день. Если вам нужно отправлять более 1000 писем в день, позвоните в службу поддержки или откройте заявку в службу поддержки, чтобы запросить более высокий лимит.

Быстрое и рабочее решение: получите SMTP Relay, который поддерживает отправку электронных писем с использованием HTTP API.

Мое предложение: (Простое и эффективное рабочее решение, которое я использую лично)

Зарегистрироваться для учетной записи в Sendgrid . Sendgrid предоставляет бесплатные 12 тыс. Электронных писем в месяц, и я думаю, что этого должно хватить для любых основных потребностей.

Первый шаг: Sendgrid попросит вас добавить несколько записей DNS для проверки подлинности при отправке электронных писем от имени этого хоста. Так сделай это.

Второй шаг: Настроить белые этикетки https://sendgrid.com/docs/User_Guide/Settings/Whitelabel/index.html = (Это не важно, но это придаст профессиональный вид отправляемым сообщениям)

Третий шаг: Создать ключи API

Вы можете управлять своими ключами API на портале клиентов SendGrid. Кроме того, вы можете управлять своими ключами API через сам API .

Четвертый шаг: Продолжайте писать наши коды.

Отправка писем с помощью PHP на sendgrid с использованием этого library , доступного на github, очень проста:

// using SendGrid's PHP Library
// https://github.com/sendgrid/sendgrid-php
require 'vendor/autoload.php';
$sendgrid = new SendGrid("SENDGRID_APIKEY");
$email    = new SendGrid\Email();

$email->addTo("[email protected]")
      ->setFrom("[email protected]")
      ->setSubject("Sending with SendGrid is Fun")
      ->setHtml("and easy to do anywhere, even with PHP");

$sendgrid->send($email);

Как это работает

GoDaddy блокирует порты 25, 2525, 587 и 485, которые являются идеальными портами для SMTP. Поэтому мы используем порт 80/443 и запрашиваем API-интерфейс sengrid для отправки электронного письма от нашего имени, используя порт 80, и да, мы обманули GoDaddy.

1
Sibidharan

Вам нужно изменить некоторые настройки в вашем php.ini:

upload_max_filesize = 2M 
;or whatever size you want

max_execution_time = 60
; also, higher if you must - sets the maximum time in seconds.

Если ваш PHP.ini зависит от вашей среды, больше информации: ссылка

ИЛИ

Поместите это в верхнюю часть вашего сценария PHP и ​​дайте сценарию расслабиться

ini_set('max_execution_time', 600); //600 seconds = 10 minutes or set your time
0
Dave

Японял твою точку зрения. Та же самая проблема случилась со мной, я только добавил одну строку, и она работает для меня. пожалуйста, используйте ,

$mail->SMTPSecure = 'ssl';

и настройте ваши настройки в соответствии с SSL. Также проверьте правильность настройки почты в конце вашего сообщения.

0
Vijju Pundir

Ошибка тайм-аута типична для отброшенных пакетов, поэтому могут быть проблемы с межсетевым экраном между веб-сервером и SMTP-сервером. Если вы получили SSH-доступ к вашему серверу, вы можете попробовать подключиться к SMTP, используя:

telnet <smtp server> 25

При ошибке тайм-аута даже при использовании telnet вы совершенно уверены, что проблема связана со стороной сети/брандмауэра.

0
Edo