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 !

]]>

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

]]>

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

]]>

Комментарии (38)

Вы можете отслеживать обсуждение записи с помощью RSS 2.0 rss link

Вы также можете оставить комментарий, или трекбек с Вашего сайта.

  1. В состав Денвера входит заглушка для sendmail, которая складывает письма в виде отдельных файлов во временную папку

    1. Денвер считаю вообще какимто выкидешем. Apache 1.3 и PHP 4.1.

      А так большое спасибо за настройку. помогла.

      1. Sam 02.06.2008 в 11:30 (Ответить)

        Вы когда последний раз его смотрели? В 2005-ом? :)

    2. Владимир 31.05.2008 в 19:03 (Ответить)

      Входит, но этот вариант позволяет действительно отправить почту (хотя для тестирования иногда нужна именно заглушка).

  2. JocK 31.05.2008 в 12:22 (Ответить)

    Це загальновідомий факт, але ж далеко не всі користуються даним пакетом

  3. Николай Испанюк, В Denwer-3 Apache2, PHP5, MySQL5.

  4. Scratch 02.06.2008 в 22:27 (Ответить)

    Денверовская заглушка — просто прелесть.
    А если "все-таки нужно отправить почту" — то настраиваю smtp провайдера и отправляю. И все :)

  5. Максим 03.06.2008 в 23:51 (Ответить)

    не когда не получалось настроить и сейчас не вышло….. руки из каки растут наверное =(

    1. Владимир 04.06.2008 в 20:49 (Ответить)

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

  6. Vladimir 04.06.2008 в 16:22 (Ответить)

    Автору нобелевскую премию или суперприз!!!
    Я пол года назад до этой статьи мля 2 дня убил, но так толком и не смог отправить почту и забросил на .. всё это дело, и только сегодня случайно наткнулся на данный шедевр- в итоге результат: 5 мин. настройки php.ini, sendmail.ini почта отправилась по php-функции mail()и дошла до адресата за 1 мин.
    Громадное спасибо тебе добрый человек!!!
    Я счастлив!!!!!!!!!!
    Здоровья, счастья тебе!!!!!!!!!

    1. Владимир 04.06.2008 в 21:13 (Ответить)

      Да, нобелевку хорошо бы :-)

  7. Vladimir 04.06.2008 в 16:24 (Ответить)

    Автор -ты супер!!!
    Так держать!!!
    MEGA THANK YOU!!!

  8. kossmoss 09.06.2008 в 03:12 (Ответить)

    Спасибо за совет, очень помог.
    Кстати, у меня к денверу тоже неприязнь

  9. Gorian 10.06.2008 в 00:59 (Ответить)

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

  10. AlexZ 10.06.2008 в 07:18 (Ответить)

    Дружище, ну просто громаднейшая тебе благодарность, выручил! :)

  11. Fascist 27.06.2008 в 17:40 (Ответить)

    XAMPP получше Денвера будет.

    1. А чем он лучше?

      1. Владимир 27.06.2008 в 19:58 (Ответить)

        ИМХО это больше вопрос привычек или предпочтений, а не функциональности. Я лично использую WAMPSERVER, в котором меня практически все устраивает.
        А чтобы действительно комфортно себя чувствовать, нужно научиться настраивать конфиги.

  12. root 09.07.2008 в 17:10 (Ответить)

    У меня пример не работает, в debug.log сообщение
    08.07.09 17:31:19 << +OK POP3 server at mail.ru signing off
    08.07.09 17:31:19 ** Disconnected.
    08.07.09 17:31:19 ** Disconnected.
    08.07.09 17:31:19 ** Disconnected.
    08.07.09 17:31:19 ** Connecting to smtp.mail.ru ; адрес SMTP сервера:25
    08.07.09 17:31:19 ** Disconnected.
    08.07.09 17:31:19 ** Disconnected.
    08.07.09 17:31:19 ** Socket Error # 11004

    Решение проблемы с ошибкой 11004 на http://www.glob.com.au/sendmail неочевидное

    1. Владимир 09.07.2008 в 21:29 (Ответить)

      Вообще-то там решения нет. Они пишут, что проблема в dns сервере и советуют разбираться с провайдером.

      Попробуйте соединиться с сервером с помощью curl, например. Нужно как-то локализовать проблему. Если действительно что-то с dns, то скрипт настраивать можно очень долго.

      Появится еще информация, пишите. Я сам с такой проблемой не сталкивался.

  13. Alice 16.07.2008 в 10:09 (Ответить)

    А у меня так и не заработало..ошибка: 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 …

    вот,как я изменила sendmail.ini

    smtp_server=smtp.yandex.ru
    smtp_port=25
    default_domain=yandex.ru
    error_logfile=error.log
    debug_logfile=debug.log
    auth_username=мой_логин@yandex.ru auth_password=пароль
    pop3_server=pop.yandex.ru
    pop3_username=мой_логин@yandex.ru
    pop3_password=пароль
    force_sender=мой_логин@yandex.ru
    hostname=yandex.ru

    в php.ini поудаляла все после "=":
    SMTP =
    smtp_port =
    sendmail_from =
    еще есть строчка smtp_port =
    я пробовала и ничего не писать, и оставить"=25"

    Подскажите,пожалуйста,что не так.И где искать файлы debug.log и error.log?

    1. Volder 26.07.2008 в 17:40 (Ответить)

      в php.ini

      параметр sendmail_path
      выставили со ссылкой на sendmail.exe?

      1. Владимир 28.07.2008 в 16:38 (Ответить)

        Да,
        sendmail_path = "C:\wamp\sendmail\sendmail.exe -t"

  14. Владимир 28.07.2008 в 16:59 (Ответить)

    2Alice

    Добавьте в php.ini параметр
    sendmail_path = “C:\wamp\sendmail\sendmail.exe -t”

    (Нужно указать папку в которую вы распаковали sendmail). Файлы debug.log и error.log будут находится в этой же папке, но созданы они будут только при возникновении ошибок или записи отладочной информации.

    Кстати, каждый параметр должен быть записан с новой строки (в вашем комментарии имя и пароль - в одной строке).

    Попробуйте, не получится - пишите.
    P.S. Не забудьте перезапустить сервер после изменения php.ini

  15. Genadi 31.07.2008 в 12:03 (Ответить)

    У меня пишет что типа отправленно но письмо не пришодит ((

    1. Владимир 31.07.2008 в 16:19 (Ответить)

      А что написано в debug.log?

  16. Виталий 16.08.2008 в 13:13 (Ответить)

    Выполнил всё по данной рекомендации, написало, что сообщение отправлено, на получатель оно не доходит-debug.log

    08.08.16 14:08:38 ** — MESSAGE BEGIN —
    08.08.16 14:08:38 ** To: vvtivv@mail.ru
    08.08.16 14:08:38 ** Subject: Test
    08.08.16 14:08:38 ** From: hi-tec-lab@yandex.ru
    08.08.16 14:08:38 **
    08.08.16 14:08:38 ** Test Проверка отсылки письма!
    08.08.16 14:08:38 ** 12345678910
    08.08.16 14:08:38 ** ===================
    08.08.16 14:08:38 ** — MESSAGE END —
    08.08.16 14:08:38 ** Authenticating with POP3 server
    08.08.16 14:08:41 ** Connected.
    08.08.16 14:08:41 << +OK POP Ya! v1.0na
    08.08.16 14:08:41 >> CAPA
    08.08.16 14:08:41 << -ERR What?//Это место Не понятно???
    08.08.16 14:08:41 >> USER hi-tec-lab@yandex.ru
    08.08.16 14:08:41 << +OK password, please.
    08.08.16 14:08:41 >> PASS (My PAss)
    08.08.16 14:08:41 << +OK 0 message(s) 0 bytes.
    08.08.16 14:08:41 >> QUIT
    08.08.16 14:08:41 << +OK shutting down.
    08.08.16 14:08:41 ** Disconnected.
    08.08.16 14:08:41 ** Disconnected.
    08.08.16 14:08:41 ** Disconnected.
    08.08.16 14:08:41 ** Connecting to smtp.yandex.ru:25
    08.08.16 14:08:51 ** Disconnected.
    08.08.16 14:09:02 ** Disconnected.
    08.08.16 14:09:02 ** Disconnected.
    08.08.16 14:09:02 ** Disconnected.
    08.08.16 14:09:02 ** Connect timed out.

    1. Владимир 16.08.2008 в 16:02 (Ответить)

      CAPA - это команда по которой сервер должен вернуть список поддерживаемых им функций.
      В данном случае он возвращает ошибку (-ERR).

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

      Как заставить sendmail не отправлять эту команду я не знаю.
      Поэтому проще всего изменить сервер. Я проверял с mail.ru.

  17. Анна 18.08.2008 в 14:10 (Ответить)

    Что-то не срабатывает, может ли это быть из-за особенности настройки прокси сервера?
    08.08.18 15:05:05 ** — MESSAGE BEGIN —
    08.08.18 15:05:05 ** To: addres@mail.ru
    08.08.18 15:05:05 ** Subject: =?koi8-r?B?98/T09TBzs/XzMXOycUg0MHSz8zRIMkgzM/Hyc7B?=
    08.08.18 15:05:05 ** Content-Type: text/plain;
    08.08.18 15:05:05 ** MIME-Version: 1.0
    08.08.18 15:05:05 ** From: addres@mail.ru
    08.08.18 15:05:05 **
    08.08.18 15:05:05 **
    08.08.18 15:05:05 ** чЩ ЪБТЕЗЙУФТЙТПЧБМЙУШ ОБ УБКФЕ дПОофх.
    08.08.18 15:05:05 ** чБЫ ОПНЕТ: b59c67bf196a4758191e42f76670ceba.
    08.08.18 15:05:05 ** чБЫ МПЗ¦О: 1
    08.08.18 15:05:05 ** чБЫ РБТПМШ: 'RNbI'
    08.08.18 15:05:05 ** — MESSAGE END —
    08.08.18 15:05:05 ** Authenticating with POP3 server
    08.08.18 15:05:05 ** Connected.
    08.08.18 15:05:06 << +OK
    08.08.18 15:05:06 >> CAPA
    08.08.18 15:05:06 << +OK Capability list follows
    08.08.18 15:05:06 << TOPUSERLOGIN-DELAY 120PIPELININGEXPIRE NEVERUIDLIMPLEMENTATION Mail.Ru.
    08.08.18 15:05:06 >> USER addres@mail.ru
    08.08.18 15:05:06 << +OK Password required for user addres@mail.ru
    08.08.18 15:05:06 >> PASS password
    08.08.18 15:05:06 << +OK addres@mail.ru maildrop has 32 messages (31007744 octets)
    08.08.18 15:05:06 >> QUIT
    08.08.18 15:05:07 << +OK POP3 server at mail.ru signing off
    08.08.18 15:05:07 ** Disconnected.
    08.08.18 15:05:07 ** Disconnected.
    08.08.18 15:05:07 ** Disconnected.
    08.08.18 15:05:07 ** Connecting to smtp.mail.ru:25
    08.08.18 15:05:17 ** Disconnected.
    08.08.18 15:05:17 ** Disconnected.
    08.08.18 15:05:17 ** Disconnected.
    08.08.18 15:05:17 ** Connect timed out.

    1. Владимир 18.08.2008 в 17:32 (Ответить)

      Что-то я не понял. Вы письмо сами себе отправили?
      Поля To и From у вас одинаковые.
      Попробуйте отправить письмо на какой-нибудь другой ящик.

      1. Анна 19.08.2008 в 12:42 (Ответить)

        Я пробовала на разные адреса, просто в вопросе заменила их на addres@mail.ru

        1. Владимир 19.08.2008 в 15:30 (Ответить)

          Попробуйте использовать рекомендации от mail.ru
          (последний комментарий к этому посту).
          Судя по отчету, соединение с сервером происходит нормально, он возвращает количество писем в ящике (кстати, их действительно 32?). Но, после этого, с вашей стороны отправляется команда QUIT и сервер, естественно, отключается.

          1. Анна 20.08.2008 в 11:59 (Ответить) (Достигнут максимальный уровень вложенности комментариев)

            Писем действительно 32, рекомендациями из следующего поста пробовала воспользоваться - не помогло.

          2. Владимир 20.08.2008 в 18:57 (Ответить)

            В прошлом комментарии я ошибся. POP3 серверу действительно должна быть отправлена команда QUIT. Ошибка возникает после подключения к SMTP.

            Вот мой лог, начиная с подключения к SMTP
            08.08.20 19:33:30 ** Connecting to smtp.mail.ru:25
            08.08.20 19:33:31 ** Connected.
            08.08.20 19:33:31 << 220 proline.net.ua, ESMTP EXIM 4.67<EOL>
            08.08.20 19:33:31 >> EHLO mail.ru<EOL>
            08.08.20 19:33:31 << 250-proline.net.ua Hello mail.ru [80.93.122.16]<EOL>250-SIZE 31457280<EOL>250-PIPELINING<EOL>250-STARTTLS<EOL>250 HELP<EOL>
            08.08.20 19:33:31 ** Authenticating as adres@mail.ru
            08.08.20 19:33:31 >> MAIL FROM: <adres@mail.ru><EOL>
            08.08.20 19:33:31 << 250 OK<EOL>
            08.08.20 19:33:31 >> RCPT TO: <adres@ukr.net><EOL>
            08.08.20 19:33:31 << 250 Accepted<EOL>
            08.08.20 19:33:31 >> DATA<EOL>
            08.08.20 19:33:31 << 354 Enter message, ending with "." on a line by itself<EOL>
            08.08.20 19:33:31 >> Date: Wed, 20 Aug 2008 19:33:31 +0300<EOL>
            08.08.20 19:33:31 >> To: adres@ukr.net<EOL>
            08.08.20 19:33:31 >> Subject: test<EOL>
            08.08.20 19:33:31 >> From: adres@mail.ru<EOL>
            08.08.20 19:33:31 >> <EOL>
            08.08.20 19:33:31 >> test test test<EOL>
            08.08.20 19:33:31 >> .<EOL>
            08.08.20 19:33:38 << 250 OK id=1KVqbL-000JIi-3R<EOL>
            08.08.20 19:33:38 >> QUIT<EOL>
            08.08.20 19:33:38 << 221 proline.net.ua closing connection<EOL>
            08.08.20 19:33:38 ** Disconnected.
            08.08.20 19:33:38 ** Disconnected.
            08.08.20 19:33:38 ** Disconnected.

            Честно говоря, не ясно в чем ошибка. Т.е. описание ошибки есть (Connect timed out. - Превышено время ожидания соединения), но из-за чего она возникает - не ясно.
            В большинстве случаев это означает либо проблемы со связью, либо проблемы с настройками. Но в данном случае первая причина отпадает сразу (вы бы не соединились с POP сервером), вторая, судя по логу, тоже (конечно, стоит проверить настройки еще раз).
            Может быть не отвечает сервер mail.ru, но сегодня я проверял - все работало.

            В общем, попробуйте использовать другой smtp.

  18. Виталий 19.08.2008 в 10:12 (Ответить)

    Рекомендации от команды mail.ru
    Иногда помогает указать IP-адреса: вместо pop.mail.ru - 194.67.23.102,
    smtp.mail.ru - 194.67.23.111

    pop.inbox.ru - 194.67.23.6, smtp.inbox.ru - 194.67.23.113
    pop.bk.ru - 194.67.23.8, smtp.bk.ru - 194.67.23.114
    pop.list.ru - 194.67.23.159, smtp.list.ru - 194.67.23.115

    Измените порт SMTP c 25 на порт 2525 или 587.

    Увеличте время таймаутов в вашей почтовой программе.

    Если все это не помогло, то попробуйте использовать для отправки SMTP
    сервер Вашего провайдера.
    ————————————————-
    У меня установлен сервер xammp, вот его настройки:
    php.ini
    ———–
    sendmail_path = "C:\xampp\sendmail\sendmail.exe -t"
    ————————————————-
    sendmail.ini
    ———–
    [sendmail]

    smtp_server=194.67.23.111

    smtp_port=2525

    default_domain=mail.ru

    error_logfile=error.log

    debug_logfile=debug.log

    auth_username=ВАШЕ ИМЯ@mail.ru
    auth_password=ВАШ ПАСС

    pop3_server=pop.mail.ru
    pop3_username=ВАШЕ ИМЯ@mail.ru
    pop3_password=ВАШ ПАСС

    force_sender=ВАШЕ ИМЯ@mail.ru

    hostname=mail.ru

  19. Сергей 20.08.2008 в 22:40 (Ответить)

    защита от спама иногда почту принимает с n_ного раза, из очереди, таким образом происходит борьба с почтовыми прогами спамеров, которые шуруют в 5 потоков по 100шт в минуту(в среднем)

    1. Владимир 21.08.2008 в 13:20 (Ответить)

      Вывод - нужен собственный SMTP сервер, особенно если почты много.

  20. Виталий 21.08.2008 в 22:49 (Ответить)

    Обязательно нужен отличный(другой)вариант от sendmail,
    только,где его взять для собственного хостинга,
    на прова надеятся нет смысла,там свои проблемы.
    Пробую пользовать бесплатный CourierMS 1.53…
    скажем так себе, хотя версии современнее многообещающие,
    триал, типа на 3 пользователя, даже с одним не работают
    во внешке…а покупать, конечно можно и приобрести,
    только для чего, ради отсылки писем, проще предоставить
    пользователю регистрацию без проверки email, последнее
    мне самому не очень нравится(мысли вслух)

Оставить комментарий

Введите ваш комментарий

* - обязательные для заполнения поля

Quicktags:

]]>