PHP mail под Windows. Отправка почты из PHP скриптов

30 мая, 2008

PHP mail картинка с конвертом

В этой статье я хочу рассказать об отправке почты из php скриптов под Windows.

С точки зрения php программиста отправка почты выполняется с помощью стандартной функции mail().

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

Обычно эти ошибки имеют примерно такое описание:
Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in E:\www\simplemail\mailer.php on line ......

Дело в том, что функция mail сама по себе почту не отправляет, она просто вызывает программу sendmail, которая в дистрибутив web сервера и php интерпретатора не входит (и не должна).

Sendmail, в свою очередь, для отправки почты использует SMTP сервер.

Таким образом, чтобы php скрипт мог отправлять почту нужно установить и настроить sendmail и SMTP сервер.

Версию sendmail для Windows можно скачать здесь.

Установка и настройка выполняется в три этапа.

1) Распаковываем архив на тот же диск, где установлен php. Например, я создал папку C:\wamp\sendmail.

2) Вносим изменения в файл php.ini:

[mail function]
SMTP =
sendmail_from =
sendmail_path = "C:\wamp\sendmail\sendmail.exe -t"

Как видите, нужно только указать путь к sendmail чтобы php мог ее найти.

3) Настраиваем sendmail. Все настройки находятся в файле sendmail.ini (расположен в папке с sendmail).

Но перед тем как приступать к настройке пару слов об SMTP сервере. Вам совсем не обязательно устанавливать сервер на вашем компьютере. Многие почтовые сервисы предоставляют бесплатный доступ к своим серверам.

Ниже я покажу пример настройки sendmail для работы с SMTP сервером mail.ru, но, естественно, вы выбрать любой другой.

Итак, открываем sendmail.ini и устанавливаем следующие параметры:

smtp_server=smtp.mail.ru ; адрес SMTP сервера
smtp_port=25 ; порт SMTP сервера

default_domain=mail.ru ; домен по-умолчанию

error_logfile=error.log ; файл в который будет записываться лог ошибок

debug_logfile=debug.log ; очень полезная на этапе отладки опция. Протоколируются все операции, которые выполняет sendmail

auth_username=account_name@mail.ru ; имя вашего аккаунта
auth_password=account_password ; ваш пароль

; следующие три опции используются если перед авторизацией на SMTP сервере требуется авторизация на POP3 сервере
pop3_server=pop.mail.ru
pop3_username=account_name@mail.ru
pop3_password=account_password

; параметр для команды MAIL FROM
force_sender=account_name@mail.ru

hostname=mail.ru

Теперь не забудьте перезапустить web сервер, чтобы изменения вступили в силу.

Чтобы протестировать работу почты напишем простенький скрипт:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>Simple Mail</title>
  7. </head>
  8. <body>
  9. <?php
  10. $addr = $_POST['addr'];
  11. $theme = $_POST['theme'];
  12. $text = $_POST['text'];
  13. if (isset($addr) &amp;&amp; isset($theme) &amp;&amp; isset($text)
  14.         &amp;&amp; $addr != "" &amp;&amp; $theme != "" &amp;&amp; $text != "") {
  15.     if (mail($addr, $theme, $text, "From: vova_33@mail.ru")) {
  16.         echo "<h3>Сообщение отправлено</h3>";
  17.     }
  18.     else {
  19.         echo "<h3>При отправке сообщения возникла ошибка</h3>";
  20.     }
  21. }
  22. ?>
  23. <form action="mailer.php" method="post">
  24. <p>
  25.     <label for="addr">eMail:</label>
  26.     <input type="text" name="addr" id="addr" size="30" />
  27. </p>
  28. <p>
  29.     <label for="theme">Тема письма:</label>
  30.     <input type="text" name="theme" id="theme" size="30" />
  31. </p>
  32. <p>
  33.     <label for="text">Текст письма:</label>
  34.     <textarea rows="10" cols="20" name="text" id="text"></textarea>
  35. </p>
  36. <p>
  37.     <input type="submit" value="Отправить" />
  38. </p>
  39. </form>
  40. </body>
  41. </html>

Он создает форму с тремя полями для ввода адреса, темы и содержания письма. Нажатие на кнопку «Отправить» отправит запрос этому же скрипту (строка 23).

Если данные введены, то будет вызвана функция mail (строка 15), которая и отправит письмо. В случае успешной отправки функция возвращает true, в противном случае – false.

Как видите, ничего сложного в настойке почты нет.

Удачи!

Понравилась статья? Подписывайтесь на продолжение rss link !

Или на мой твиттер twitter link

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в PHP, Web разработка View Comments

]]>
  • Lelikmss
    Огромное спасибо! Сэкономили многим (в т.ч. и мне) кучу времени
  • Arman
    Вот что у меня получилось
    Fatal error: Maximum execution time of 30 seconds exceeded in T:\home\localhost\send.php on line 14
  • Значит почтовый сервер не ответил в течении 30 сек. Вариантов два: либо ошибка в настройках, либо сервер перегружен.
    Попробуйте подключиться к другому smtp серверу.
  • Виталий!
    У нас на сайте после трансфера домена перестал работать почтовый скрипт (версия PHP SendMail v.2.0 ) на странице:
    http://evpatoria-kurort.com.ua/contacts.html ;
    а именно: после заполнения почтовой формы и нажатии кнопки "отправить" просто сбрасывается вся заполненная информация, и письмо не куда не приходит.
    при переходе по этой тестирующей ссылке созданной разработчиком для проверки скрипта
    http://evpatoria-kurort.com.ua/send/test.php ;сообщения сейчас приходят нормально.

    Не пойму в чем дело, ведь на старом хосте скрипт отлично работал, все настройки при переводе сохранены .
    Вы не подскажите в чем может быть проблема?
  • Владимир!
    А где находится этот лог sendmail'а в папке скрипта его нет, могу этот скрипт целиком скинуть на ваш е-мейл, может он здесь имеет какое то другое название.
    И еще на почту пришло уведомление о вашем ответе, но почему то на английском языке.Может сбиты настройки?
  • Лог обычно находится в папке с sendmail'ом, файл называется debug.log, там еще может быть error.log.
    Имена файлов могут быть другими, они устанавливаются опциями
    error_logfile=error.log
    и
    debug_logfile=debug.log
    в конфиге sendmail.

    Уведомления рассылает система disqus, в настройках я указал русский язык, но перевод, к сожалению, не полный.

  • Владимир!
    По этому вашему Е-мейлу скинул целиком весь скрипт
    notifications-unregistered@disqus.net
    В скрипте файлы имеют другие названия, поэтому не могу найти тот файл, который нужно.Есть с немного похожим названием error.inc
  • Если не сложно, скиньте на этот адрес
    vova_33@gala.net
  • Владимир, скрипт скинул.
  • Без лога sendmail'а сложно угадать в чем причина.
  • Cubatao
    Всё работает!!! Автору СПАСИБО!!!!!
  • Andriy
    здраствуйте. я сделал всьо как написано в "инструкции". подскажыте пожалуйста что ето и как оно лечитса:
    Failed to connect to mailserver at "" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in??
  • Судя по описанию ошибки, вы не указали адрес smtp сервера (или допустили в нем ошибку).
  • Сергуня
    Создание заглушки и сохранение писем в папку:
    в файле php.ini в разделе [mail function]
    SMTP =
    sendmail_from =
    sendmail_path = "C:/wamp/bin/php/php5.3.0/php.exe C:/wamp/bin/sendmail/sendmail.php"

    где создаём sendmail.php со следующим кодом:




    если письмо сохраняется есть отправитель получатель и тема, но нет текста в письме то
    fwrite($fp,iconv("UTF-8","CP1251",$stream));
    Замените на
    fwrite($fp,$stream)); или поставте вам нужные кодировки!
  • Сергуня
    код удалился сервисом :(



    //папка в которую будем складывать почту
    define('DIR','c:/wamp/email/');

    //получаем из потока тело письма
    $stream = '';
    $fp = fopen('php://stdin','r');
    while($t=fread($fp,2048))
    {
    if( $t===chr(0) )
    break;
    $stream .= $t;
    }
    fclose($fp);

    //Сохраняем в файл
    $fp = fopen(mkname(),'w');
    fwrite($fp,$stream));
    fclose($fp);

    //Функция присвоения имени файлу
    function mkname($i=0)
    {
    $fn = DIR.date('Y-m-d_H-i').'.eml';
    if ( file_exists($fn) )
    return mkname(++$i);
    else return $fn;
    }

  • Большое спасибо за то, что привели решение! Вполне возможно, оно кому-нибудь пригодится.
  • Сергуня
    Странно у меня почему-то письма приходят не по адресату а в почту отправителя мне же на маил это как понимать можно?
  • Без лога отправки письма ничего конкретного сказать не могу. Вообще вариантов два. Либо ошибка в настройках, либо глюки mail.ru. Второе маловероятно :)
  • Виктор
    Большое спасибо автору статьи!
    Основная проблема была, как и у многих, в номере порта в sendmail.ini.
    Меняем с 25 на 2525 и вуаля!
    Ещё раз спасибо)
  • Patriarh
    Помогите
    Warning: mail() [function.mail]: SMTP server response: 550 5.1.0 : Sender address rejected: User unknown in virtual mailbox table in D:\xampp\htdocs\cheat\forum\install\install.php on line 230

    все ввел
  • Ошибка означает, что серверу не нравится адрес отправителя. Какой адрес вы указали в поле From?
  • Patriarh
    у меня стало выдавать вот такое действие когда я настроил как написано в чем я ошибаюсь?
    Warning: mail() [function.mail]: SMTP server response: 550 5.1.0 : Sender address rejected: User unknown in virtual mailbox table in D:\xampp\htdocs\cheat\forum\install\install.php on line 230
  • Bratishka
    Автору статьи огромный респект. Из всех постов в интернете по настройке zendmail - этот пост единственный толковый и легкий в понимании. Большое спасибо!!!
  • Евгений
    Добрый день!

    Подскажите, пожалуйста, смысл следующей ошибки:

    Socket Error # 10053Software caused connection abort.

    И как с нею бороться?

    Спасибо
  • 10053 ошибка означает, что соединение было разорвано какой-то программой. Это может быть как операционная система (например, если socket был открыт и долго не использовался), так и какая-нибудь другая программа. Попробуйте временно отключить антивирус и файервол.
  • В качестве заглушки есть отличное решение Test Mail Server Tool рекомендую. Висит себе в трее и ловит письма на 25й порт (настраивается), и сохраняет файлы писем в папке указанной в настройках
  • Макс Ф.
    Спасибо огромное! Замучился искать нормальное описание по настройке sendmail, хорошо что тут не так как везде !!
  • D@RK_DIE$EL
    помогите кто-нибудь настроить http://www.spsmtp.org/downloads.php вот этот смтп сервер, я так понял сенд мали для него не нужна, я пробовал настраивать, но не получилось, из пхп ини что нужно убрать или добавить,чтоб он заработал? пишите diesel-88@mail.ru
  • Вы правильно поняли, sendmail для него не нужен. Я с ним не работал, но пример настройки php.ini показать могу

    [mail function]
    SMTP = YOUR_PROVIDER ;адрес smtp сервера
    smtp_port = 25 ;порт на котором работает smtp сервер
    username = USERNAME ;логин для входа на сервер
    password = YOUR_PASSWORD ;пароль
  • Ваня
    подскажите,пожалуйста.У меня в error.log такая ошибка

    Socket Error # 10061Connection refused.

    Что ето значит??
  • Это значит, что сервер не хочет с вами соединяться. Причины могут быть разные, поэтому попробуйте просто подключится к другому серверу. И еще раз проверьте все параметры.
  • Валерий
    Все мой скрипт заработал) я как абсолютно незнающий php не знал что ; - это закоментированно, осталось лишь раскоментировать sendmail_path = "C:\wamp\sendMail\sendmail.exe -t"
    Статья супер, спасибо!
  • Поздравляю!
    Только уточню. В PHP комментарий обозначается так // или так
    /* */
    ; - это комментарий в конфигах apache ;)
  • Валерий
    $mailto = 'моя_почта';
    mail($mailto, 'Test', 'Hello') or die('Error');
    echo 'CheckMessege';
  • Валерий
    Обещанный скрипт))
  • Валерий
    Боюсь кавычки не помогут.. У меня еще более простой скрипт который вызываю из Flex приложения, пишет немного другую ошибку:

    Warning: mail() [function.mail]: "sendmail_from" not set in php.ini or custom "From:" header missing in C:\wamp\www\send.php on line 3
    Error
    Вот сам скрипт:

    Все же попробовал пометь кавычки непомогло(
    Целый день уже бьюсь, ни в какую..(
  • Валерий
    Доброго времени суток! Владимир, спасибо огромное за статью! У меня возникла следующая проблема: настроил все как показано выше, php скрипт вынес в отдельный файл, при запуске пишет ошибку
    Parse error: syntax error, unexpected ';' in C:\wamp\www\mailer.php on line 5
    в чем может быть проблема? заранее спасибо.
  • Вы копировали скрипт из статьи?
    Если да, нужно исправить кавычки на обычные - прямые. Их WordPress изменяет при публикации.

    Будут проблемы, пишите, я вышлю скрипт.
  • MidaF
    Большое всем спасибо за помощь, особенно автору! Я долго мучался, ничего не получалось и когда совсем отчаялся меня спасла вот эта конфигурация (для mail.ru)
    ---------------
    В php.ini
    ---------------

    [mail function]
    ; For Win32 only.
    ; http://php.net/smtp
    SMTP =
    ; http://php.net/smtp-port
    smtp_port = 25

    ; For Win32 only.
    ; http://php.net/sendmail-from
    sendmail_from =
    sendmail_path = "C:\wamp\sendmail\sendmail.exe -t"

    /*ниже без изменений*/

    ; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
    ; http://php.net/sendmail-path
    ;sendmail_path =

    ----------------
    В sendmail.ini
    "auth_username & pop3_username" -имена ящиков С КОТОРЫХ отправляется почта, адрес НА КОТОРЫЙ отправляете письмо Вы указываете в РНР-скрипте в Вашем файле!
    ----------------

    smtp_server=smtp.mail.ru

    smtp_port=587

    smtp_ssl=auto

    default_domain=mail.ru

    error_logfile=error.log

    auth_username=name /*имя Вашего ящика без @mail*/
    auth_password=pass /*Пароль вашего ящика*/

    pop3_server=pop.mail.ru
    pop3_username=name /*имя Вашего ящика без @mail*/
    pop3_password=pass /*Пароль вашего ящика*/

    force_sender=name@mail.ru

    force_recipient=

    hostname=mail.ru
    -----------------

    У меня это работает, письма моментально приходят на яндекс!
    Всем удачи!!!
  • Oleg
    Все заработало после удаления коментариев
    Автору +5
  • tashkent34
    Владимир, помогите, пожалуйста, разобраться.
    В "debug.log" записывается следующее:
    10.01.16 08:32:47 ** --- MESSAGE BEGIN ---
    10.01.16 08:32:47 ** To: peli21can@gmail.com
    10.01.16 08:32:47 ** Subject: the subject
    10.01.16 08:32:47 ** From:tashkent34@mail.ru
    10.01.16 08:32:47 **
    10.01.16 08:32:47 **
    10.01.16 08:32:47 ** xxxxxx
    10.01.16 08:32:47 ** --- MESSAGE END ---
    10.01.16 08:32:47 ** Authenticating with POP3 server
    10.01.16 08:32:47 ** Connected.
    10.01.16 08:33:08 ** Disconnected.
    10.01.16 08:33:08 ** Disconnected.
    10.01.16 08:33:08 ** Disconnected.
    10.01.16 08:33:08 ** Connection Closed Gracefully.
    Спасибо.
  • К POP3 серверу вы подключились, а затем сразуже отключились (или он вас отключил). Убедитесь что переписали правильно все настройки.
  • Спасибо автору, все работает.
    У кого не работает - у тех реально руки из **** растут :-)

    Совет тем у кого не работает: просто делайте как написано + читайте там где майл-отправитель регите какие настройки надо прописать.

    Например на рамблере:
    ; configuration for fake sendmail

    ; if this file doesn't exist, sendmail.exe will look for the settings in
    ; the registry, under HKLM\Software\Sendmail

    [sendmail]

    ; you must change mail.mydomain.com to your smtp server,
    ; or to IIS's "pickup" directory. (generally C:\Inetpub\mailroot\Pickup)
    ; emails delivered via IIS's pickup directory cause sendmail to
    ; run quicker, but you won't get error messages back to the calling
    ; application.

    smtp_server=mail.rambler.ru

    ; smtp port (normally 25)

    smtp_port=587

    ; SMTPS (SSL) support
    ; auto = use SSL for port 465, otherwise try to use TLS
    ; ssl = alway use SSL
    ; tls = always use TLS
    ; none = never try to use SSL

    smtp_ssl=auto

    ; the default domain for this server will be read from the registry
    ; this will be appended to email addresses when one isn't provided
    ; if you want to override the value in the registry, uncomment and modify

    default_domain=rambler.ru

    ; log smtp errors to error.log (defaults to same directory as sendmail.exe)
    ; uncomment to enable logging

    error_logfile=error.log

    ; create debug log as debug.log (defaults to same directory as sendmail.exe)
    ; uncomment to enable debugging

    debug_logfile=debug.log

    ; if your smtp server requires authentication, modify the following two lines

    auth_username=aoci
    auth_password=XtvDfeS1

    ; if your smtp server uses pop3 before smtp authentication, modify the
    ; following three lines. do not enable unless it is required.

    pop3_server=mail.rambler.ru
    pop3_username=aoci
    pop3_password=XtvDfeS1 ;даже не пробуйте я выдумал

    ; force the sender to always be the following email address
    ; this will only affect the "MAIL FROM" command, it won't modify
    ; the "From: " header of the message content

    force_sender=aoci@rambler.ru

    ; force the sender to always be the following email address
    ; this will only affect the "RCTP TO" command, it won't modify
    ; the "To: " header of the message content

    force_recipient=

    ; sendmail will use your hostname and your default_domain in the ehlo/helo
    ; smtp greeting. you can manually set the ehlo/helo name if required

    hostname=rambler.ru
  • Не нужно никого обежать. Часто проблемы не связаны непосредственно с настройкой sendmail и, не имея опыта их поиска, можно потратить очень много времени.
  • Зуззук
    Вот такая вот фигня у меня на локальном сервере!
    Настройки у почты через корпоративный почтовик
    Подскажите где собака зарыта ??

    10.01.13 22:39:58 ** --- MESSAGE BEGIN ---
    10.01.13 22:39:58 ** To: jv964@ukr.net
    10.01.13 22:39:58 ** Subject: тема
    10.01.13 22:39:58 ** X-PHP-Originating-Script: 0:test_mail.php
    10.01.13 22:39:58 ** From: y.sharov@sint.ua
    10.01.13 22:39:58 **
    10.01.13 22:39:58 ** Тело письма
    10.01.13 22:39:58 ** --- MESSAGE END ---
    10.01.13 22:39:58 ** Authenticating with POP3 server
    10.01.13 22:39:58 ** Connected.
    10.01.13 22:39:59 ** Disconnected.
    10.01.13 22:39:59 ** Disconnected.
    10.01.13 22:39:59 ** Socket Error # 10054Connection reset by peer.
  • Эта ошибка может возникать по разным причинам. Означает, что сервер сбросил соединение. Подробнее почитать можно здесь.
  • серж
    скажите в чем может быть проблема. все настройки верны. стоит xampp.

    10.01.10 06:09:32 ** --- MESSAGE BEGIN ---
    10.01.10 06:09:32 ** To: serhio.666@gmail.com
    10.01.10 06:09:32 ** Subject: asd
    10.01.10 06:09:32 ** From: serhio-s@mail.ru
    10.01.10 06:09:32 **
    10.01.10 06:09:32 ** asd
    10.01.10 06:09:32 ** --- MESSAGE END ---
    10.01.10 06:09:32 ** Authenticating with POP3 server
    10.01.10 06:09:32 ** Connected.
    10.01.10 06:09:32 << +OK
    10.01.10 06:09:32 >> CAPA
    10.01.10 06:09:32 << +OK Capability list follows
    10.01.10 06:09:32 << TOPUSERLOGIN-DELAY 120PIPELININGEXPIRE NEVERUIDLIMPLEMENTATION Mail.Ru.
    10.01.10 06:09:32 >> USER serhio-s@mail.ru
    10.01.10 06:09:32 << +OK Password required for user serhio-s@mail.ru
    10.01.10 06:09:32 >> PASS mypass
    10.01.10 06:09:33 << +OK serhio-s@mail.ru maildrop has 1749 messages (225385472 octets)
    10.01.10 06:09:33 >> QUIT
    10.01.10 06:09:33 << +OK POP3 server at mail.ru signing off
    10.01.10 06:09:33 ** Disconnected.
    10.01.10 06:09:33 ** Disconnected.
    10.01.10 06:09:33 ** Disconnected.
    10.01.10 06:09:33 ** Connecting to smtp.mail.ru:25
    10.01.10 06:09:43 ** Disconnected.
    10.01.10 06:09:43 ** Disconnected.
    10.01.10 06:09:43 ** Disconnected.
    10.01.10 06:09:43 ** Disconnected.
    10.01.10 06:09:43 ** Connect timed out.
  • О похожей проблеме уже писали, правда я не знаю, удалось ли её решить.
    Судя по логу, вы нормально соединились с POP3 сервером, но не смогли соединиться с SMTP.
    Это может быть из-за проблем у mail.ru. Можно попробовать подключиться к другому серверу.
  • Artash
    Владимир а ты случайно не знаеш в каком файле нужно настроить адрес и порт прокси
  • По-идее в конфиге sendmail. Но я не вижу подходящих настроек в документации. А инструкции в инете в основном для *nix.
    Можно попробовать использовать ProxyCap.
blog comments powered by Disqus ]]>