Подтвердить что ты не робот

Конфигурация 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

- EDIT -

Я попытался подключиться к 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.

- EDIT -

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

введите описание изображения здесь

4b9b3361

Ответ 1

В вашей ошибке говорится:

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/Troubleshooting:

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

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

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

GoDaddy

Популярный хостинг-провайдер в США GoDaddy очень строгий (по сути становится практически бесполезным) ограничения на отправку электронной почты. Они блокируют исходящий SMTP для портов 25, 465 и 587 для всех серверов, кроме их своя. Эта проблема является предметом многих разочаровывающих Переполнение стека. Если вы обнаружите, что ваш script работает на вашем локальном компьютере, но не когда вы загружаете его в 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 анти-подделку меры и подделка вашего адреса - это подделка.

Вам может быть проще переключиться на более просвещенный хостинг поставщик.

Ответ 2

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

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

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

Я попытался подключиться к 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.

Ваш script не может подключиться к 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] Отправитель OK RCPT: [email protected] 554 Реле отклонено по политическим причинам.

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

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

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

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

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

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

Ответ 3

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

[email protected] был членом группы (отклонение), которая была указана в gmail.com "Отклонить сообщения, предназначенные для следующего интернета адресов" (на целевом сервере Domino Configuration документ Router/SMTP, ограничения и элементы управления, входящий SMTP Вкладка "Управление" в разделе "Управление входящим назначением получателей" ).

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

Вторая цитата:

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

Ответ 4

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

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

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

Ответ 5

Попросите вашего хостинг-провайдера, если smtp включен не на этом сервере. У меня была такая же проблема, как и для smtp и зависания обоих. Контракт хостинг-провайдера.

Ответ 6

Что такое версия phpmailer?

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

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

после того, как вы инициируете $mail.

Попробуйте.

Ответ 7

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

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

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

Быстрое и эффективное решение: получите SMTP-ретрансляцию, поддерживающую отправку писем с использованием HTTP API.

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

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

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

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

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

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

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

Отправка почты с использованием PHP на sendgrid с использованием этой библиотеки, доступной на github, проста:

// using SendGrid 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.

Ответ 8

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

  • В вашем Godaddy/Hostgator Cpanel > Выберите записи MX > Выберите интересующий домен > Выберите "Remote Mail Exchanger"

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

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

заменить:

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

с

$mail->Host = 'localhost';

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

Ответ 9

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

telnet <smtp server> 25

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

Ответ 10

Вам нужно изменить некоторые настройки в 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 script и пусть ваш script свободный

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

Ответ 11

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

$mail->SMTPSecure = 'ssl';

и настройте настройки в соответствии с ssl. Также правильно проверьте настройку почты на своем конце обслуживания.