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

В этой статье я хочу рассказать об отправке почты из 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 сервер, чтобы изменения вступили в силу.
Чтобы протестировать работу почты напишем простенький скрипт:
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
<html xmlns="http://www.w3.org/1999/xhtml">
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-
<title>Simple Mail</title>
-
</head>
-
<body>
-
<?php
-
$addr = $_POST['addr'];
-
$theme = $_POST['theme'];
-
$text = $_POST['text'];
-
&& $addr != "" && $theme != "" && $text != "") {
-
echo "<h3>Сообщение отправлено</h3>";
-
}
-
else {
-
echo "<h3>При отправке сообщения возникла ошибка</h3>";
-
}
-
}
-
?>
-
<form action="mailer.php" method="post">
-
<p>
-
<label for="addr">eMail:</label>
-
<input type="text" name="addr" id="addr" size="30" />
-
</p>
-
<p>
-
<label for="theme">Тема письма:</label>
-
<input type="text" name="theme" id="theme" size="30" />
-
</p>
-
<p>
-
<label for="text">Текст письма:</label>
-
<textarea rows="10" cols="20" name="text" id="text"></textarea>
-
</p>
-
<p>
-
<input type="submit" value="Отправить" />
-
</p>
-
</form>
-
</body>
-
</html>
Он создает форму с тремя полями для ввода адреса, темы и содержания письма. Нажатие на кнопку «Отправить» отправит запрос этому же скрипту (строка 23).
Если данные введены, то будет вызвана функция mail (строка 15), которая и отправит письмо. В случае успешной отправки функция возвращает true, в противном случае - false.
Как видите, ничего сложного в настойке почты нет.
Удачи!
Понравилась статья? Подпишитесь на продолжение
!
Опубликовано в PHP, Web разработка
Комментарии (38)
Вы можете отслеживать обсуждение записи с помощью RSS 2.0 ![]()
Вы также можете оставить комментарий, или трекбек с Вашего сайта.
Оставить комментарий







В состав Денвера входит заглушка для sendmail, которая складывает письма в виде отдельных файлов во временную папку
Денвер считаю вообще какимто выкидешем. Apache 1.3 и PHP 4.1.
А так большое спасибо за настройку. помогла.
Вы когда последний раз его смотрели? В 2005-ом?
Входит, но этот вариант позволяет действительно отправить почту (хотя для тестирования иногда нужна именно заглушка).
Це загальновідомий факт, але ж далеко не всі користуються даним пакетом
Николай Испанюк, В Denwer-3 Apache2, PHP5, MySQL5.
Денверовская заглушка — просто прелесть.
А если "все-таки нужно отправить почту" — то настраиваю smtp провайдера и отправляю. И все
не когда не получалось настроить и сейчас не вышло….. руки из каки растут наверное =(
Что именно не вышло? Если дадите описание ошибок, может быть смогу что-то конкретное посоветовать
Автору нобелевскую премию или суперприз!!!
Я пол года назад до этой статьи мля 2 дня убил, но так толком и не смог отправить почту и забросил на .. всё это дело, и только сегодня случайно наткнулся на данный шедевр- в итоге результат: 5 мин. настройки php.ini, sendmail.ini почта отправилась по php-функции mail()и дошла до адресата за 1 мин.
Громадное спасибо тебе добрый человек!!!
Я счастлив!!!!!!!!!!
Здоровья, счастья тебе!!!!!!!!!
Да, нобелевку хорошо бы
Автор -ты супер!!!
Так держать!!!
MEGA THANK YOU!!!
Спасибо за совет, очень помог.
Кстати, у меня к денверу тоже неприязнь
спасибо огромное за статью. долго морочил голову с отправкой писем. в результате так просто все решилось
Дружище, ну просто громаднейшая тебе благодарность, выручил!
XAMPP получше Денвера будет.
А чем он лучше?
ИМХО это больше вопрос привычек или предпочтений, а не функциональности. Я лично использую WAMPSERVER, в котором меня практически все устраивает.
А чтобы действительно комфортно себя чувствовать, нужно научиться настраивать конфиги.
У меня пример не работает, в 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 неочевидное
Вообще-то там решения нет. Они пишут, что проблема в dns сервере и советуют разбираться с провайдером.
Попробуйте соединиться с сервером с помощью curl, например. Нужно как-то локализовать проблему. Если действительно что-то с dns, то скрипт настраивать можно очень долго.
Появится еще информация, пишите. Я сам с такой проблемой не сталкивался.
А у меня так и не заработало..ошибка: 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?
в php.ini
параметр sendmail_path
выставили со ссылкой на sendmail.exe?
Да,
sendmail_path = "C:\wamp\sendmail\sendmail.exe -t"
2Alice
Добавьте в php.ini параметр
sendmail_path = “C:\wamp\sendmail\sendmail.exe -t”
(Нужно указать папку в которую вы распаковали sendmail). Файлы debug.log и error.log будут находится в этой же папке, но созданы они будут только при возникновении ошибок или записи отладочной информации.
Кстати, каждый параметр должен быть записан с новой строки (в вашем комментарии имя и пароль - в одной строке).
Попробуйте, не получится - пишите.
P.S. Не забудьте перезапустить сервер после изменения php.ini
У меня пишет что типа отправленно но письмо не пришодит ((
А что написано в debug.log?
Выполнил всё по данной рекомендации, написало, что сообщение отправлено, на получатель оно не доходит-debug.log
CAPA - это команда по которой сервер должен вернуть список поддерживаемых им функций.
В данном случае он возвращает ошибку (-ERR).
Насколько я знаю, поддержку этой команды можно отключить в настройках сервера.
Как заставить sendmail не отправлять эту команду я не знаю.
Поэтому проще всего изменить сервер. Я проверял с mail.ru.
Что-то не срабатывает, может ли это быть из-за особенности настройки прокси сервера?
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.
Что-то я не понял. Вы письмо сами себе отправили?
Поля To и From у вас одинаковые.
Попробуйте отправить письмо на какой-нибудь другой ящик.
Я пробовала на разные адреса, просто в вопросе заменила их на addres@mail.ru
Попробуйте использовать рекомендации от mail.ru
(последний комментарий к этому посту).
Судя по отчету, соединение с сервером происходит нормально, он возвращает количество писем в ящике (кстати, их действительно 32?). Но, после этого, с вашей стороны отправляется команда QUIT и сервер, естественно, отключается.
Писем действительно 32, рекомендациями из следующего поста пробовала воспользоваться - не помогло.
В прошлом комментарии я ошибся. 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.
Рекомендации от команды 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
защита от спама иногда почту принимает с n_ного раза, из очереди, таким образом происходит борьба с почтовыми прогами спамеров, которые шуруют в 5 потоков по 100шт в минуту(в среднем)
Вывод - нужен собственный SMTP сервер, особенно если почты много.
Обязательно нужен отличный(другой)вариант от sendmail,
только,где его взять для собственного хостинга,
на прова надеятся нет смысла,там свои проблемы.
Пробую пользовать бесплатный CourierMS 1.53…
скажем так себе, хотя версии современнее многообещающие,
триал, типа на 3 пользователя, даже с одним не работают
во внешке…а покупать, конечно можно и приобрести,
только для чего, ради отсылки писем, проще предоставить
пользователю регистрацию без проверки email, последнее
мне самому не очень нравится(мысли вслух)