PHPMailer загружает некоторое время, а затем дает 500 – ошибка внутреннего сервера

Я пытаюсь настроить php-страницу, чтобы автоматически отправлять электронное письмо с подтверждением. Я хотел бы использовать серверы gmail smtp, и везде, где я смотрел, предлагается использовать 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 = "myemail@gmail.com"; $mail->Password = "mypassword"; $mail->SetFrom('myemail@gmail.com','Me'); $mail->AddAddress("ToAddress@gmail.com"); $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 Standard, работающий под управлением 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 command failed, 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
  • Использование ssl для порта 465
    • SMTP connect() failed
  • Отправка с адресом hotmail через порт 25 с помощью $mail->SMTPAuth = false;
    • MAIL FROM command failed,550,5.7.3 Requested action aborted; user not authenticated

Обновление 3

После перезагрузки страницы проблемы я проверил окно просмотра событий и увидел новую запись в журналах Windows -> Система:

Ошибка PHP: ошибка синтаксиса, неожиданный BOOL_TRUE в C: \ PHP \ php.ini в строке 101

Эта строка:

php_flag display_errors on

    Похоже, вы имеете дело с кучей проблем, и вот контрольный список: у вас проблемы с ssl, фактическим почтовым программным обеспечением и учетными данными. Это стало проблемой 3 из одной основной проблемы, и я предполагаю, что у вас нет либо ваших учетных данных набрано правильно, либо ваш открытый ssl не настроен, и у вас также возникают проблемы с использованием почтового программного обеспечения.

    535 535 5.7.3 Аутентификация Неудачный означает, что auth не увенчался успехом, проверьте свое имя пользователя и пароль.

    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 = "yourusername@gmail.com"; // GMAIL username $mail->Password = "yourpassword"; // GMAIL password $mail->SetFrom('name@yourdomain.com', 'First Last'); $mail->AddReplyTo("name@yourdomain.com","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 = "whoto@otherdomain.com"; $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, если вы не используете правильный порт.

    Если у вас есть проблемы с программным обеспечением, вы должны попробовать что-то лучше.

    Я обсуждал это утро, если мне следовало бы 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. Следуйте этим параметрам и шагам, это может быть ваша проблема.

    Эта проблема – слэши (\)

    редактировать

     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() показывает, что он не загружен.

    Некоторые мысли:

    • Перезапустили ли вы веб-сервер после раскола php-модуля openssl в php.ini ?

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

    • Проверьте значение Loaded Configuration File в phpinfo()

      Если это не то же место, что и отредактированный php.ini , также становится понятно, почему он не был загружен. Также можно проверить следующие строки из phpinfo() .

      • Файл конфигурации (php.ini)
      • Загруженный файл конфигурации
      • Сканирование этого каталога для дополнительных файлов .ini

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

    Дальнейшие мысли:

    • Проверка журналов ошибок

      Для php путь можно (снова) найти в phpinfo() . Посмотрите на значение error_log и проверьте последние записи сразу после того, как вы попытались перезагрузить свою страницу.

      Также вы можете проверить файлы журнала IIS. Если вы не знаете путь в диспетчере IIS, выберите компьютер на левой панели, а в средней панели перейдите под «протоколирование» в области IIS. Обычно они указывают на нечто вроде C:\inetpub\logs\LogFiles или C:\Windows\System32\LogFiles с C:\Windows\System32\LogFiles такой как W3SVC[x] где [x] – это идентификатор веб-сайта. (Будет только 1 если у вас есть только одна страница, в противном случае проверьте папку веб-сайтов верхнего уровня в диспетчере IIS, просмотрите списки сайтов в правой панели, это идентификатор приложения)

    Настройка и настройка IIS

    Начните с сервера ServerManager на сервере. Чаще всего это сервер, на котором будет запущен ваш php-сайт. Перейдите к разделу Добавление функций в раздел «Обзор функций». Проверьте службы SMTP в мастере добавления компонентов и нажмите «Установить». Теперь подождите завершения установки. Откройте диспетчер IIS6 (или IIS7) в разделе «Администрирование» -> «Информационные службы Интернета» 6.0 в меню «Пуск», конфигурация SMTP использует консоль управления из IIS6. В разделе [SMTP Virtual Server] щелкните правой кнопкой мыши и выберите свойства из контекстного меню. Перейдите на вкладку «Доступ» и нажмите кнопку «Реле». Добавьте новую запись в список, нажав кнопку «Добавить» и введите 127.0.0.1 (или IP-адрес вашего веб-сервера) в поле ввода для одного компьютера. Дважды нажмите «Остановить», чтобы применить новые настройки.

    Настройка Php

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

     ini_set('SMTP','localhost' ); ini_set('sendmail_from', 'administrator@YourWebsite.com'); 

    Другой способ, чтобы глобальное использование этих параметров, добавить следующие строки в файл php.ini.

     [mail function] SMTP = localhost sendmail_from = me@example.com 

    Обязательно перезагрузите сервер после внесения этих изменений, чтобы убедиться, что они загружены.

    Это решение предоставляется здесь 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.