PHP mail под Windows

    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 сервер, чтобы изменения вступили в силу.

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

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


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

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

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

    Удачи!

    Источник: кросспостинг из моего блога – www.simplecoding.org.

    Средняя зарплата в IT

    113 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 5 091 анкеты, за 2-ое пол. 2020 года Узнать свою зарплату
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 52

      +9
      А ещё есть Test Mail Server Tool — бесплатный эмулятор SMTP-сервера для Windows. Висит в трее, всю пришедшую почту складывает в папку на рабочем столе (по умолчанию, настраивается). Делов-то — в php.ini прописать:
      [mail function]
      ; For Win32 only.
      SMTP = localhost
      smtp_port = 25

      и перезапустить web-сервер. И все вышеуказанные пляски не нужны.

      Источник: кросспост из моего мозга.

      PS: Вы сеошник или случайно болдами выделили ключевые слова?
        0
        Кроме того, из документации:
        Замечание: The Windows implementation of mail() differs in many ways from the Unix implementation. First, it doesn't use a local binary for composing messages but only operates on direct sockets which means a MTA is needed listening on a network socket (which can either on the localhost or a remote machine).
        Так что неясно, откуда вы взяли утверждение о необходимости sendmail.
          0
          Прошу прощения, неточно выразился. Необходимости конечно нет. Просто sendmail это один из вариантов решения проблемы.
          0
          Тоже вариант. Только он почту не отправляет. Хотя, я согласен, что для тестирования такая заглушка подходит больше (все-таки на отправку почты может уйти довольно много времени).

          По-поводу жирного шрифта. Наверное многие блоггеры в какой-то степени сеошники. Но в данном случае я старался выделять основные операции, а не ключевые слова. ИМХО текст без выделений читать значительно тяжелее.
            0
            Зачем нужен целый эмулятор сервера, висящий в трее?
            mail() вызывает указанную в php.ini программу и отправляет ей во входной поток текст письма с заголовками.
            Можно элементарно сделать свою программу. Даже просто php-скрипт, который скидывает в файл php://stdin и в php.ini прописать "php C:\...\mymail.php"
              0
              см. мое следующее сообщение :)
                0
                Можно, но когда только начинаешь заниматься программированием иногда сложно просто запустить готовый скрипт, а не то что написать программу.
                P.S. Из собственного опыта :-)
                  0
                  Я вам помогу :)
                  file_put_contents('mailfolder/'.date('dmYHis').'eml', file_get_contents('php://stdin'))
                  Как-то так :)
                  0
                  А вам постоянно нужна отправка писем? К тому же, Test Mail Server Tool занимает в памяти всего два мегабайта, а для тестирования отправки его вполне достаточно.
                  0
                  В Windows далеко не всегда нужна реальная отправка писем, часто достаточно просто детализированного лога.
                  Потому пару лет назад написал для себя тестовый sendmail который вместо отправки сообщений, пишет все в лог:
                  [25.11.2006 15:58:19] /progra~1/sendmail/sendmail -t -i
                  To: admin@drupal
                  Subject: Drupal user account details for admin<code>
                  исходник и готовый exe-шник можно взять <a href="http://fork.org.ua/share/sendmail-test-win32/">тут</a>
                  установка: распаковать, настройка: добавить в php.ini
                  <code>[mail function]
                  sendmail_path = "C:\....\sendmail\sendmail.exe -t"</code>
                    0
                    Немного не досмотрел с оформлением, повторюсь:
                    исходник и готовый exe-шник можно взять тут
                    установка: распаковать, настройка: добавить в php.ini
                    [mail function]
                    sendmail_path = "C:\....\sendmail\sendmail.exe -t"
                    0
                    кстати, есть хороший SMTP-сервер "Spectral Personal SMTP Server" (http://spsmtp.org/)
                    • НЛО прилетело и опубликовало эту надпись здесь
                      +1
                      >>С точки зрения php программиста отправка почты выполняется с помощью стандартной функции mail().
                      Прелестно конечно, но за всех говорить не надо (:

                      Давно под виндой, исключительно для тестирования, я брал заглушку sendmail с денвера, проблем меньше и письма складывает в нужную папочку.
                        0
                        Аналогично, просто и удобно.
                          +1
                          Прошу прощения если кого-то обидел, но я не имел в виду, что программисты не знают (или не должны знать) о том как реально отправляется почта.
                          Просто, на мой взгляд, установка sendmail, почтового и web серверов это вопросы администрирования, а не программирования.
                            0
                            Надо, надо... Рано или поздно возникнут траблы с почтой на хостинге, и чтобы заставить админов быстрее её починить, полезно будет знать, в каком месте всё стало плохо. Иногда, например, приходится ставить PEAR'овский пакет Mail и принудительно отправлять почту через SMTP.
                          +2
                          а зачем ставить sendmail?
                          у меня прописано так:
                          [mail function]
                          ; For Win32 only.
                          SMTP = сервер провайдера
                          smtp_port = 25
                          sendmail_from = мой почтовый ящик у провайдера

                          последнее не всегда обязательно
                            0
                            А авторизация? Или сервер локальный?
                              0
                              сервер моего интернет-провайдера
                                0
                                топикстартеру: У вас сендмейл не тормозит скрипт во время отправки? У меня всегда странички подвисали на мгновения.. вобщем, давно отказался от этого метода..

                                На сейчас для меня вот, имхо лучшее решение..

                                SMTP =
                                smtp_port =
                                auth_username=
                                auth_password=
                                sendmail_from =

                                Что писать думаю понятно! ;)
                                  0
                                  Отправка выполняется где-то за полсекунды.
                                  Если не нужно проверять как доходят письма, то, конечно, лучше использовать заглушку (работает быстрее).
                              –1
                              а можно как вариант, залить на сервер скрипт, который принимает в параметрах: кому_отправить, тему и само письмо и с локального хоста curl'ом отправить =)
                              Каждый по-своему извращается)
                                +2
                                я обычно пользуюсь функцией email() которая пытается отправить письмо через mail(), а в случае ошибки складывает это письмо в отдельную папку на диск
                                  0
                                  Вам большое человеческое спасибо за статью, давно не хватало этой опции на локольном сервере, особенно когда стоит wamp
                                    +2
                                    а стандартный виндовый smtp из состава IIS религия не позволяет запускать?
                                      0
                                      Почему не позволяет? Я вообще локальный SMTP сервер не ставил.
                                      Если нужно отправлять письма, то вам выбирать каким сервером пользоваться. Просто нужно правильно указать настройки в sendmail.
                                      А сервер mail.ru я привел только как пример. Никаких особых преимуществ у него нет.
                                      –1
                                      Статья для школьников.
                                        0
                                        Не для школьников, а для начинающих разработчиков. Я так и написал в начале статьи.
                                        –1
                                        мда.
                                        >>С точки зрения php программиста отправка почты выполняется с помощью стандартной функции mail().

                                        а потом хостинговые сервера не вылазят из спам-листов. использование mail() выдает уровень программиста, что называется, "с головой".

                                        SMTP-авторизация и удаленный почтовый серв. коннект на 25 порт, ehlo, auth plain..... а mail() у половины шаред-хостеров вообще выключен. "во избежание".
                                          +1
                                          прАстите а рнр для windows зачем?
                                          ...кроме тестирования поделок
                                            0
                                            Следует отметить, что скрипт, пусть и тестовый, но уязвим для Mail Injection.
                                              0
                                              Согласен. Этот вариант исключительно для личного пользования на локальном компьютере. Просто хотелось максимально сократить скрипт.
                                                0
                                                Лучше бы ты его сократил за счет кривого форматирования.
                                                Именно из-за таких "максимально сокращенных" пол-инета и сверкает дырами.
                                                Тем, кто понимает, что к чему, твоя статья не нужна.
                                                А те, кто ей будет пользоваться, сделают единственно доступное им действие - копипаст.

                                                Если бы хотел сократить - вообще надо было форму убрать. Для иллюстрации достаточно отправки инфы на мыло админу.
                                                  0
                                                  Да, наверное, вы правы. Учтем :-)
                                              0
                                              до недавнего времени использовал отличный пакет XAMPP (http://www.apachefriends.org/en/xampp.html):
                                              - Apache HTTPD 2.2.8 + Openssl 0.9.8g
                                              - MySQL 5.0.51a
                                              - PHP 5.2.5
                                              - PHP 4.4.8
                                              - phpMyAdmin 2.11.4
                                              - FileZilla FTP Server 0.9.25
                                              - Mercury Mail Transport System 4.52

                                              Все отлично работает и настраивается.
                                              Сейчас разработка пренесена на linux-платформу :)
                                                0
                                                ну и в денвере заглушка стоит на сендмэйл
                                                  0
                                                  Для ясности:
                                                  Вы сможете за 2 минуты настроить свой любимый почтовый клиент и спокойно получать всю почту, отправленную скриптами
                                                –1
                                                Лучший способ послать почту: использовать сокеты
                                                  –1
                                                  Плохой способ. А потом пользователи таких поделок удивляются, почему письма через грейлист не проходят.
                                                    0
                                                    Вы просто не умеете обращаться с SMTP-протоколом. За время пользования на куче хостингов и локально ни одного глюка, в отличие от mail(). Все прекрасно проходит, просто почитайте спецификацию.
                                                      –1
                                                      Читал и не раз. Вы таки предлагаете реализовать на PHP полноценный MTA с почтовой очередью?
                                                        0
                                                        Вы о чем? При чем тут очередь? Я не собираюсь писать почтовый север на PHP, боже упаси :)
                                                        Просто отправлять через сокет удобнее и более функционально, если, конечно, вы осилили SMTP-протокол.
                                                          0
                                                          Если вы всего лишь предлагаете вручную реализовать работу с локальным MTA из скрипта, то так и напишите. Большинство проходящих мимо вашего комментария прочитают и подумают, что вот так и надо отправлять письма прямым коннектом на smtp.gmail.com, порт 25.
                                                      0
                                                      А в чем разница? =)
                                                      mail отправляет не через сокет, а с голубями?
                                                      Или добавляет волшебный заголовок "Дяденьки, не бейте меня, я не спам!!!"?
                                                  0
                                                  Рекомендую замечательную статью на эту тему:

                                                  http://phpclub.ru/detail/article/mail

                                                  От себя отмечу что в пункте 5.2 я ставил себе не ArGoSoft Mail Server, с ним были проблемы и к тому же он кажется не бесплатный, а Courier Mail Server. С ним было всё просто и удобно.
                                                    0
                                                    А зачем имя аккаунта оформлять HTML-тегами: <а href='mailtо:accоunt_name@mail.ru'>account_name@mail.ru</а> и прочее?
                                                    Из-за этого была ошибка: To many arguments for user commandНаписал просто account_name@mail.ru, помогло
                                                      +1
                                                      Похоже это работа хабрапарсера. Во всяком случае в режиме редактирования эти теги исчезают.
                                                      Вы совершенно правильно сделали, что удалили их.
                                                        0
                                                        Понятно :)

                                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                    Самое читаемое