2014-10-27 2 views
7

Я пытаюсь настроить страницу php для автоматической отправки электронного письма с подтверждением. Я хотел бы использовать серверы gmail smtp, и везде, где я смотрел, предлагается использовать PHPMailer. Я установил его и использовал следующий пример кода:PHPMailer загружает некоторое время, а затем дает 500 - Ошибка внутреннего сервера

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 - Internal server error.
There is a problem with the resource you are looking for, and it cannot be displayed.

Сервер является Windows Server 2008 R2 Стандарт работает IIS 7.5 и PHP Version 5.5.8. Я могу получить доступ ко всем другим страницам без проблем, но попытка вызвать $mail->Send() кажется, что это время или что-то в этом роде. Я знаю это, потому что я прокомментировал каждую строку и медленно добавил части назад, и $mail->Send() - это линия, которая вызывает поведение.

Мои возможности Google не позволяют мне здесь, так как я просто не могу понять, как это сделать. Любые идеи о том, что может быть неправильным?

Update

Я открыл журнал сервера затем попытался снова загрузить страницу, но новые ошибки не были добавлены в журнал. Тем не менее, я заметил следующие ошибки с сегодняшнего дня в 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 - 

UPDATE 2

Я уверен, что мои личные данные аккаунта Gmail, являются правильными и протестировали отправки из него с помощью Thunderbird на сервере. При попытке отправить без защищенных методов, как это было предложено в this comment я получаю эту ошибку:

MAIL FROM command failed,550,5.7.3 Requested action aborted; user not authenticated

Мой 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

Update 3

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

PHP Error : syntax error, unexpected BOOL_TRUE in C:\PHP\php.ini on line 101

Эта линия:

php_flag display_errors on

+0

Ошибка 500 не имеет смысла сама по себе. В журналах веб-сервера вы должны найти значимое сообщение об ошибке. Либо это, либо установите 'display_errors' значение true в вашем скрипте или php.ini, чтобы сделать его видимым. Это не относится к PHPMailer - это верно для любой фатальной ошибки PHP. – Synchro

+0

Я попытался добавить 'ini_set ('display_errors', 1);' в начало скрипта, но он не изменил вывод. Обновлен вопрос с некоторыми подробностями из файла журнала. –

+0

Если вы видите 500 ошибок в своем браузере, но ничего не регистрируется, что-то не так с вашей конфигурацией веб-сервера. Ошибки, которые вы указали, - это ошибки 400 (плохой запрос). Вы также должны попытаться включить отчет об ошибках: 'error_reporting (E_ALL);' – Synchro

ответ

0

Попробуйте использовать SSL-шифрование с портом 465:

$mail->SMTPSecure = "ssl"; 
$mail->Host = "smtp.gmail.com"; 
$mail->Port = 465; 
+0

Не удалось выполнить проверку 'if ($ mail-> Send())'. –

+0

Это извлечение из документации Gmail, как настроить внешние почтовые клиенты для SMTP: сервер исходящей почты (SMTP) - требуется TLS или SSL: \t smtp.gmail.com; Использовать аутентификацию: Да; Порт для TLS/STARTTLS: 587; Порт для SSL: 465 – user3806621

+0

Это здорово, но он по-прежнему не работает для меня. Есть ли ссылка, на которую вы можете указать, что может быть более детально? –

1

Эта проблема - косая черта (\)

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

require_once ("incl\\PHPMailer\\PHPMailerAutoload.php"); 
+0

Изменил код, используя \\ вместо \ и получив ту же проблему. –

1

Я попытался с вами кодом, и я только изменил эту строку:

require_once ("incl\PHPMailer\PHPMailerAutoload.php"); 

этим одним:

require_once ("incl\PHPMailer\class.phpmailer.php"); 

И он работал успешно.
Также вы должны обратить внимание на вашу версию PHPMailer и вашу версию PHP.
Вы пытались отправить электронное письмо с не защищенным методом?
Уверены, что ваши учетные данные google действительны?

ОБНОВЛЕНО
из командной строки вашего сервера, что вывод этой команды и сколько времени, что требуется, чтобы ответить

telnet smtp.gmail.com 587 
+0

Предлагая изменить результаты этой ошибки: 'Fatal error: Class 'SMTP' не найден в C: \ inetpub \ wwwroot \ incl \ PHPMailer \ class.phpmailer.php в строке 1195' Что касается ваших других вопросов, я обновлю мой вопрос с этими подробностями. –

+0

Ответ от команды telnet: '200 mx.google.com ESMTP i15sm10941378wjq.22 - gsmtp' –

1

Интересно, если вы работаете в то же самое вопрос, что this question столкнулся.Google активно хмурится тем, кто использует Gmail как свой собственный SMTP-сервер.

http://www.labnol.org/internet/email/gmail-daily-limit-sending-bulk-email/2191/

Google also limits the number of email messages that you can send through your Gmail account in a day. If you exceed the daily quota, Google may temporarily disable your Gmail account without any warnings and you may have to wait for up to 24 hours before you can regain access to your Gmail mailbox.

я мог видеть ошибку, как, что потенциально производящие 500 ошибок.

+0

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

1

Из комментариев к вопросу, кажется довольно ясно, что эта проблема OpenSSL.

Вы упомянули, что у вас уже есть extension=php_openssl.dll ракомментировано, но phpinfo() показывает, что он не загружен.

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

  • Вы перезапуске веб-сервер, после того, как раскомментирован модуль PHP OpenSSL в вашем php.ini?

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

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

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

    • Файл конфигурации (php.ini) Path
    • Loaded Configuration File
    • Scan этот каталог для дополнительных файлов .ini

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

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

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

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

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

+0

Я помню, как я запускал 'iisreset' много раз, но для того, чтобы убедиться, что линия была расколота и снова запущена. Без изменений. Что касается вашего второго момента: «Загруженный файл конфигурации: C: \ PHP \ php.ini» Это то же самое, что и тот, который я редактировал. 'Файл конфигурации (php.ini) Путь: C: \ Windows' (это может быть проблемой?)' Сканировать этот каталог для дополнительных файлов .ini: (none) ' –

+0

@DavidStarkey: Поскольку ваш загруженный файл конфигурации является который вы редактируете, это должно быть хорошо (хотя вы можете попробовать с копированием его на путь Windows и т. д., но он действительно должен (!) не иметь никакого отношения). 'IISReset' также верен, чтобы перезапустить ваши веб-службы. Я добавил третий маркер в журнале ошибок ... вы можете проверить это. – Levit

+0

'phpinfo()' для записи журнала 'error_log | нет значения | нет значения'. Что касается журнала ошибок IIS, похоже, у меня нет возможности ... Добавлены некоторые сведения о выходе Event Viewer на вопрос. –

2

Похоже, вы» переработав кучу проблем, и вот контрольный список: у вас возникли проблемы с 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 = "[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, если вы не используете правильный порт.

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

Я обсуждал это утро, если я должен PHPMailer, в конечном итоге, используя SwiftMailer, который работал сразу после того, как я установил его с PHPComposer.

Мой внутренний почтовый сервер очень разборчивый и имеет тонны настроек и правил брандмауэра на уровне аппаратного и программного обеспечения, и я был удивлен, что это не вызвало у меня никаких проблем; электронные письма были отправлены сразу, без каких-либо проблем на порту 587.

require_once 'vendor/swiftmailer/swiftmailer/lib/swift_required.php'; 
$transport = Swift_SmtpTransport::newInstance('mail.hellog***.com', 587) 
    ->setUsername('[email protected]***.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: \ пользователь> реж \ Local \ PHP \ вн \ php_openssl.dll

Справочник C: \ Local \ PHP \ внутр

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

+0

Я знаю, что мои учетные данные верны, поскольку я могу войти в учетную запись из другого места и отправить и получить электронную почту, это включает в себя клиент Mozilla Thunderbird на сервере с проблемами. У меня не было 'extension_dir =" ext "' uncommented, но после включения и запуска 'iisreset' вывод был таким же. При попытке установить Swiftmailer (http://swiftmailer.org/download) появляется ошибка, упомянутая в ** ОБНОВЛЕНИИ 3 **. PHPGMailer дает «Неустранимая ошибка: вызов неопределенного метода PHPGMailer :: From()». –

+0

Какова ваша версия php и как вы включаете эти файлы? у вас есть установка lib правильно в каталоге, где его доступно вашим php-скриптом? – unixmiah

+0

** PHP Version 5.5.8 ** и включая использование 'require_once ('incl \ phpGMailer \ class.phpgmailer.php');' где я помещаю эти 3 файла. PHPMailer такой же, как и в моем вопросе, который, как я полагаю, работает, потому что страница отлично до '$ mail-> Send();' –

1

Настройка и конфигурирование 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', '[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 error when trying to use the MAIL function

+0

Решение является частью этого ответа http://stackoverflow.com/questions/15231214/500-error-when-trying-to-use-the-mail-функция, поэтому, если это правильно возможно, это должно быть отмечено как повторяющийся вопрос. –

+0

Попытка этого, я продолжаю получать 'mail(): ответ сервера SMTP: 550 5.7.3 Запрошенное действие отменено; пользователь не аутентифицирован ' –

0

Warning: require_once(mailer/PHPMailerAutoload.php): failed to open stream: No such file or directory in....

Это способ, которым я был мой файл направляется

Перед: require_once "mailer/PHPMailerAutoload.php";

После: require_once "../mailer/PHPMailerAutoload.php";

... Тот же процесс, который вы обычно делаете, чтобы связать img в качестве фона с помощью css.

 Смежные вопросы

  • Нет связанных вопросов^_^