Я пытаюсь настроить страницу php для автоматической отправки подтверждающего электронного письма. Я хотел бы использовать SMTP-серверы Gmail, и везде, где я смотрел, предлагает использовать PHPMailer. Я установил его и использовал следующий пример кода:
ini_set('display_errors', 1);
error_reporting(E_ALL);
require_once ("incl\PHPMailer\PHPMailerAutoload.php");
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->SMTPSecure = "tls";
$mail->Host = "smtp.gmail.com";
$mail->Port = 587;
$mail->Username = "[email protected]";
$mail->Password = "mypassword";
$mail->SetFrom('[email protected]','Me');
$mail->AddAddress("[email protected]");
$mail->Subject = "Verify your email";
$mail->Body = "Thank you for signing up. Please verify your email using the link below:";
$mail->IsHTML (true);
if($mail->Send()){
echo "Success";
}else{
echo "Error";
}
При попытке получить доступ к странице через Firefox, страница будет загружаться в течение нескольких минут, а затем выдаст эту ошибку:
500 — внутренняя ошибка сервера.
Возникла проблема с ресурсом, который вы ищете, и он не может быть отображен.
Сервер Windows Server 2008 R2 Стандартный ход IIS 7.5 а также Версия PHP 5.5.8. Я могу получить доступ ко всем другим страницам без проблем, но пытаюсь позвонить $mail->Send()
кажется, время ожидания или что-то. Я знаю это, потому что я прокомментировал каждую строку и медленно добавил кусочки обратно и $mail->Send()
это линия, которая вызывает поведение.
Мои способности Google меня подводят, потому что я просто не могу понять, как заставить это работать. Есть идеи, что может быть не так?
Обновить
Я открыл журнал сервера, затем снова попытался загрузить страницу, но в журнал не было добавлено никаких новых ошибок. Тем не менее, я заметил следующие ошибки с сегодняшнего дня в System32\LogFiles\httperr1.log
2014-10-27 06:29:21 1.161.23.122 3148 212.83.145.123 80 HTTP/1.0 CONNECT mx2.mail2000.com.tw:25 400 - URL -
2014-10-27 10:10:12 95.183.244.244 33553 212.83.145.123 80 HTTP/1.1 GET / 400 - Hostname -
2014-10-27 11:25:25 207.38.185.197 51157 212.83.145.123 80 HTTP/1.1 GET /tmUnblock.cgi 400 - Hostname -
2014-10-27 12:46:21 1.168.221.158 7952 212.83.145.123 80 - - - - - Timer_ConnectionIdle -
ОБНОВЛЕНИЕ 2
Я уверен, что данные моей учетной записи gmail верны, и я проверил отправку с него с помощью Thunderbird на сервере. При попытке отправить без защищенных методов, как это предлагается в этот комментарий Я получаю эту ошибку:
Ошибка команды MAIL FROM, 550,5.7.3 Запрошенное действие прервано; пользователь не аутентифицирован
Моя версия PHP Mailer — 5.2.9, и я также попробовал следующее:
\\
в пути к файлам вместо \
class.phpmailer.php
вместо PHPMailerAutoload.php
Fatal error: Class 'SMTP' not found in C:\inetpub\wwwroot\incl\PHPMailer\class.phpmailer.php on line 1195
SMTP connect() failed
$mail->SMTPAuth = false;
MAIL FROM command failed,550,5.7.3 Requested action aborted; user not authenticated
Обновление 3
После перезагрузки страницы проблемы, я проверил через Event Viewer и увидел новую запись в журналах Windows -> Система:
Ошибка PHP: синтаксическая ошибка, неожиданный BOOL_TRUE в C: \ PHP \ php.ini в строке 101
Эта строка:
php_flag display_errors on
Похоже, вы имеете дело с кучей проблем, и вот контрольный список: у вас есть проблемы с ssl, реальным почтовым программным обеспечением и учетными данными. Это стало проблемой 3 из одной основной проблемы, и я предполагаю, что у вас либо неправильно введены ваши учетные данные, либо ваш open ssl не настроен, но у вас также возникают проблемы с использованием почтового программного обеспечения.
535 535 5.7.3 Аутентификация не удалась означает, что аутентификация не удалась, проверьте ваши учетные данные, имя пользователя и пароль.
Код ошибки 550 означает, что принимающая система не смогла доставить вашу электронную почту пользователю, которому она была адресована, поскольку почтовый ящик недоступен.
Есть много других решений для решения вашей проблемы. Почему бы вам не попробовать что-то более простое вместо использования автозагрузки PHPMailerAutoload.php. Создайте новый файл и поместите приведенный ниже код, создайте тело сообщения (test_message.html) и вызовите его из браузера, чтобы проверить gmail smtp с учетными данными gmail. Это фрагмент PHPMailer о том, как использовать его с gmail smtp, и он не должен ошибаться, если все правильно заполнено.
<?php
require_once('../class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded
$mail = new PHPMailer();
$body = file_get_contents('test_message.html');
$body = eregi_replace("[\]",'',$body);
$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host = "mail.yourdomain.com"; // SMTP server
$mail->SMTPDebug = 2; // enables SMTP debug information (for testing)
// 1 = errors and messages
// 2 = messages only
$mail->SMTPAuth = true; // enable SMTP authentication
$mail->SMTPSecure = "tls"; // sets the prefix to the servier
$mail->Host = "smtp.gmail.com"; // sets GMAIL as the SMTP server
$mail->Port = 587; // set the SMTP port for the GMAIL server
$mail->Username = "[email protected]"; // GMAIL username
$mail->Password = "yourpassword"; // GMAIL password
$mail->SetFrom('[email protected]', 'First Last');
$mail->AddReplyTo("[email protected]","First Last");
$mail->Subject = "PHPMailer Test Subject via smtp (Gmail), basic";
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
$mail->MsgHTML($body);
$address = "[email protected]";
$mail->AddAddress($address, "John Doe");
$mail->AddAttachment("images/phpmailer.gif"); // attachment
$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment
if(!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}
?>
Если вы получаете ошибку аутентификации пользователя, то ваши учетные данные не вводятся в
правильно. Если это не проблема, вы получите ошибку ssl, если вы не используете правильный порт.
Если есть проблемы с программным обеспечением include, попробуйте что-нибудь получше.
Я спорил сегодня утром, должен ли я PHPMailer, в конечном итоге с помощью Swiftmailer который работал сразу после того, как я установил его с PHPComposer.
Мой Внутренний почтовый сервер очень требователен и имеет множество настроек и правил брандмауэра на аппаратном и программном уровне, и я был удивлен, что это не доставило мне никаких проблем; электронные письма отправлялись сразу же без проблем через порт 587.
require_once 'vendor/swiftmailer/swiftmailer/lib/swift_required.php';
$transport = Swift_SmtpTransport::newInstance('mail.hellog***.com', 587)
->setUsername('apache@hellog***.com')
->setPassword('apa******')
;
Это то, что вам нужно для Gmail:
$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
->setUsername($this->username)
->setPassword($this->password);
$this->mailer = Swift_Mailer::newInstance($transporter);
Если ничего из того, что вам нравится, вы можете попробовать phpgmailer:
https://github.com/GregDracoulis/LectureBank/tree/master/phpgmailer
Вот пример того, как его использовать:
http://www.vulgarisoverip.com/2006/10/13/update-send-email-with-php-and-gmail-hosted-for-your-domain/
Этот класс предназначен для использования Gmail.
Если все ваши проблемы и проблемы связаны с openSSL, вам следует выполнить следующие шаги:
1. Убедитесь, что файл DLL модуля OpenSSL включен в установку PHP:
C: \ user> dir \ local \ php \ ext \ php_openssl.dll
Каталог C: \ local \ php \ ext
php_openssl.dll
2. Создайте файл конфигурации PHP, \local\php\php.ini
если его не существует:
C:\user>copy \local\php\php.ini-production \local\php\php.ini
1 file(s) copied.
3. Включите модуль OpenSSL, отредактировав файл конфигурации с помощью текстового редактора. Вам необходимо удалить средство создания комментариев (;) в двух строках конфигурации:
...
; Directory in which the loadable extensions (modules) reside.
; http://php.net/extension-dir
; extension_dir = "./"; On windows:
extension_dir = "ext"
...
extension=php_openssl.dll
...
Это оно. Вы должны быть полностью настроены, настраивая openSSL на вашем Windows IIS WebServer. Следуйте этим параметрам и шагам, это может быть вашей проблемой.
Эта проблема косая черта (\)
редактировать
require_once ("incl\\PHPMailer\\PHPMailerAutoload.php");
Я пробовал с вами код, и я только изменил эту строку:
require_once ("incl\PHPMailer\PHPMailerAutoload.php");
этим:
require_once ("incl\PHPMailer\class.phpmailer.php");
И это сработало успешно.
Также вам следует обратить внимание на вашу версию PHPMailer и версию PHP.
Вы пытались отправить электронное письмо ненадежным способом?
Вы уверены, что ваши учетные данные Google действительны?
ОБНОВЛЕНО
Из командной строки вашего сервера, что вывод этой команды и сколько времени требуется, чтобы ответить
telnet smtp.gmail.com 587
Интересно, если вы сталкиваетесь с той же проблемой, что этот вопрос столкнулся. Google активно осуждает людей, использующих Gmail в качестве своего личного SMTP-сервера.
http://www.labnol.org/internet/email/gmail-daily-limit-sending-bulk-email/2191/
Google также ограничивает количество сообщений электронной почты, которые вы можете отправлять через свою учетную запись Gmail в день. Если вы превысили дневную квоту, Google может временно отключить вашу учетную запись Gmail без каких-либо предупреждений, и вам, возможно, придется подождать до 24 часов, прежде чем вы сможете восстановить доступ к своему почтовому ящику Gmail.
Я мог видеть такую ошибку, которая потенциально выдает ошибку 500.
Из комментариев к вопросу, кажется довольно ясно, что эта проблема OpenSSL связанные с.
Вы упомянули, что у вас уже есть extension=php_openssl.dll
без комментариев, но phpinfo()
действительно показывает, что он не загружен.
Некоторые мысли:
Вы перезапустили веб-сервер, раскомментировав модуль openssl php в своем php.ini
?
Это действительно очевидный, но все же стоит упомянуть. php.ini
загружается при запуске, и перезапуск службы не является обычной ошибкой.
Проверьте значение Loaded Configuration File
в phpinfo()
Если это не то же самое место, чем php.ini
который вы редактировали, также становится понятно, почему он не был загружен. Также следующие строки из phpinfo()
может стоит проверить.
Есть и другие вещи, которые можно сделать, например, удалить и переустановить OpenSSL, но было бы неплохо сначала проверить эти более очевидные вещи.
Дальнейшие мысли:
Проверка журналов ошибок
Для php путь можно (опять же) найти в вашем phpinfo()
, Ищите ценность error_log
и проверьте последние записи сразу после попытки перезагрузить страницу.
Также вы можете проверить файлы журналов IIS. Если вы не знаете, как искать пути в диспетчере IIS, выберите компьютер на левой панели и на средней панели перейдите в раздел «Ведение журнала» в области IIS. Обычно они будут указывать на что-то вроде C:\inetpub\logs\LogFiles
или же C:\Windows\System32\LogFiles
с подпапкой, как W3SVC[x]
где [x]
это идентификатор сайта. (Будет просто 1
если у вас есть только одна страница, в противном случае проверьте папку сайтов верхнего уровня в IIS Manager, просмотрите списки сайтов в правой панели, это идентификатор приложения)
Настройка и настройка IIS
Начните с перехода к ServerManager на вашем сервере. Чаще всего это сервер, на котором вы будете запускать свой php-сайт. Перейдите к пункту «Добавить функции» в разделе «Сводка функций» Проверьте службы SMTP в мастере добавления компонентов и нажмите «Установить». Теперь дождитесь окончания установки. Откройте диспетчер IIS6 (или IIS7) в разделе «Администрирование» -> «Службы IIS 6.0» в меню «Пуск», в конфигурации SMTP используется консоль управления из IIS6. В разделе [SMTP Virtual Server] щелкните правой кнопкой мыши и выберите свойства в контекстном меню. Перейдите на вкладку «Доступ» и нажмите кнопку «Ретрансляция». Добавьте новую запись в список, нажав кнопку «Добавить», и введите 127.0.0.1 (или IP-адрес вашего веб-сервера) в поле ввода для одного компьютера. Нажмите Ok два раза, чтобы применить новые настройки.
Настройка Php
Чтобы заставить Php отправлять электронные письма, вам необходимо выполнить некоторые настройки. В основном есть два варианта.
Если вы собираетесь использовать SMTP-сервер только в одном проекте и не хотите, чтобы он мешал другим проектам, вы можете настроить конфигурацию из своего кода php, добавив следующие строки в любом месте перед отправкой электронного письма:
ini_set('SMTP','localhost' );
ini_set('sendmail_from', '[email protected]');
Другой способ — глобально использовать эти настройки, добавив следующие строки в файл php.ini.
[mail function]
SMTP = localhost
sendmail_from = [email protected]
Обязательно перезагрузите сервер после внесения этих изменений, чтобы убедиться, что они загружены.
Это решение предоставляется здесь http://geekswithblogs.net/tkokke/archive/2009/05/31/sending-email-from-php-on-windows-using-iis.aspx о том, как настроить IIS и PHP и был предоставлен в качестве ответа на этот вопрос Ошибка 500 при попытке использовать функцию MAIL
Попробуйте использовать шифрование SSL с портом 465:
$mail->SMTPSecure = "ssl";
$mail->Host = "smtp.gmail.com";
$mail->Port = 465;
Предупреждение: require_once (mailer / PHPMailerAutoload.php): не удалось открыть
Поток: нет такого файла или каталога в ….
Вот так я отправил свой файл
До:
require_once "mailer/PHPMailerAutoload.php";
После:
require_once "../mailer/PHPMailerAutoload.php";
…Тот же процесс, который вы обычно делаете, чтобы связать img в качестве фона, используя css.