Я пытаюсь отправить электронное письмо при отправке формы. Я использую PHPMailer для отправки почты с использованием следующей конфигурации.
$mail = new PHPMailer; $mail->isSMTP(); $mail->Host = 'mail.example.in'; $mail->Port = 25; $mail->SMTPAuth = true; $mail->Username = 'user@example.in'; $mail->Password = 'password'; $mail->setFrom("user@example.in" , "User"); $mail->addAddress('receiver@example.in', 'Receiver'); $mail->addBCC('anotheruser@somedomain.com', 'Another user'); $mail->AddReplyTo('user@example.in', '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";
Это отлично работает в локальном хосте. Но когда я развертываю его на свой сервер (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: marketing@example.in 250 marketing@example.in... Sender OK RCPT to: john.hh@gmail.com 554 Relay rejected for policy reasons.
— РЕДАКТИРОВАТЬ —
Мне удалось настроить этот аккаунт в Outlook. Я действительно смущен тем, что происходит.
Ваша ошибка говорит:
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 для всех серверов, кроме их собственных. Эта проблема является предметом многих разочаровывающих вопросов о переполнении стека. Если вы обнаружите, что ваш скрипт работает на вашем локальном компьютере, но не при загрузке его в 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, а подделка вашего адреса – подделка.
Вам может быть проще переключиться на более просвещенного хостинг-провайдера.
Проблема, а не две несвязанные проблемы, которые вы испытываете, довольно проста:
ОШИБКА 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.
Ваш скрипт не может подключиться к 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 соответственно (см. Выше).
250 marketing@example.in … Отправитель OK RCPT: john.hh@gmail.com 554 Реле отклонено по политическим причинам
Кроме того, чтобы избежать злоупотреблений, SMTP-серверы не позволят всем подключаться и отправлять электронные письма, а только их собственным клиентам. Я вижу, что в конфигурации PHPMailer вы указали пользователя и пароль. В сеансе telnet вы этого не сделали. Поэтому вполне возможно, что PHPmailer может отправлять, но не подключаться, в то время как ваш telnet может подключаться, но не отправлять.
Как только вы решите проблему подключения, проблема аутентификации будет либо решена, либо исчезнет (потому что вы будете использовать другой сервер, предоставленный вам ИТ-ребятами, например localhost
).
Третий способ злоупотребления услугами – чрезмерное использование – отправка слишком большого количества сообщений электронной почты слишком многим людям. Проверьте с ИТ-ребятами, какие приемлемые политики предназначены для отправки писем.
Другие вещи, на которые нужно обратить внимание, – это достоверность источника (возможно, вы захотите отправить электронные письма от имени какого-либо домена, который не определил ваш SMTP-сервер в качестве разрешенного отправителя) и конфиденциальность данных (даже при подключении TLS / SSL , если вы получили localhost
в качестве SMTP-сервера, ваши ИТ-ребята будут иметь полный, неограниченный, незаметный доступ к любому отправляемому вами электронному адресу. Возможно, вы можете или, возможно, не согласитесь с этим).
1-я цитата (из сообщества ibm):
john.hh@gmail.com был членом группы (Reject), которая была указана в поле «Отклонить сообщения, предназначенные для следующих интернет-адресов» gmail.com (в Маршрутизаторе / SMTP-документе документа управления Domino Configuration, ограничениях и элементах управления, Вкладка «Входящие элементы управления SMTP» в разделе «Управление входящим назначенным получателем»).
Удаление иерархического имени Мэри (Mary Jones / ABC) из списка участников в документе Reject (group) позволяет Мэри получать сообщения из Интернета.
Вторая цитата:
Большинство почтовых серверов, чтобы предотвратить их использование в качестве анонимных спам-реле, настроены только для ретрансляции почты с определенных хостов.
Плохая идея использовать собственный SMTP. В зависимости от того, что у вас есть с этим, у вас есть большие шансы заблокировать ваши электронные письма каким-либо образом или помечены как СПАМ. И вам придется потратить несколько раз, чтобы поддерживать ваш сервер в актуальном состоянии.
Используйте онлайн-службы, которые перечислены в белом списке для каждого поставщика, и которые выставляют API для отправки транзакционных писем: https://www.mailjet.com/ http://mailchimp.com/ …
Они часто предлагают бесплатную учетную запись для небольшого объема (до 2000 писем в день). Использование API довольно тривиально и может быть установлено через несколько минут (например: https://dev.mailjet.com/ )
Попросите вашего хостинг-провайдера, если smtp включен не на том сервере. У меня была такая же проблема, как и для smtp и зависания обоих.
Что такое версия phpmailer?
Вы можете забыть добавить эту строку
$mail->IsSMTP(); // use SMTP
после того, как вы инициируете $ mail.
Попробуй.
Таким образом, у вас есть сервер GoDaddy, и вы хотите отправить электронную почту через недавно приобретенное реле SMTP. Ну, «вы не можете» , вероятно, то, что вы собираетесь найти, если вы будете копаться вокруг Google.
Официальное решение GoDaddy заключается в том, чтобы использовать внутреннее почтовое реле. Это не идеально, из-за произвольных барьеров, которые они установили, таких как:
Наши выделенные серверы имеют ограничение исходящей электронной почты 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's PHP Library // https://github.com/sendgrid/sendgrid-php require 'vendor/autoload.php'; $sendgrid = new SendGrid("SENDGRID_APIKEY"); $email = new SendGrid\Email(); $email->addTo("test@sendgrid.com") ->setFrom("you@youremail.com") ->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.
Я думаю, что в течение нескольких шагов мы можем заставить это работать правильно.
В вашей Godaddy / Hostgator Cpanel> Выберите записи MX> Выберите интересующий домен> Выберите «Remote Mail Exchanger »
Вы можете проверить доставку почты в это время, проблема может быть решена.
Я уверен, что он настроен правильно, но поверьте мне, когда дело доходит до хорошего opan Cpanel, PhpMailer и Godaddy / Hostgator. Это место, где здравый смысл не имеет смысла.
заменить:
$mail->Host = 'mail.example.in';
с:
$mail->Host = 'localhost';
Я считаю, что это должно разрешить любые проблемы, предполагая, что такие действия, как учетные данные, действительны.
Ошибка тайм-аута типична для сброшенных пакетов, поэтому могут возникать проблемы межсетевого экрана между веб-сервером и SMTP-сервером. Если у вас есть ssh-доступ к вашему серверу, вы можете попытаться подключиться к smtp, используя:
telnet <smtp server> 25
При ошибке таймаута даже с telnet вы совершенно уверены, что проблема связана с сетью / файерволом.
Вам нужно изменить некоторые настройки в 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
Японял твою точку зрения. Тот же вопрос случится со мной, я просто добавлю одну строку, и она работает на меня. пожалуйста, используйте ,
$mail->SMTPSecure = 'ssl';
и настройте настройки в соответствии с ssl. Также правильно проверьте настройку почты на своем конце обслуживания.