PHP mail под Windows
В этой статье я хочу рассказать об отправке почты из 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
Теперь не забудьте перезапустить web сервер, чтобы изменения вступили в силу.
Чтобы протестировать работу почты напишем простенький скрипт:
Он создает форму с тремя полями для ввода адреса, темы и содержания письма. Нажатие на кнопку «Отправить» отправит запрос этому же скрипту (строка 21).
Если данные введены, то будет вызвана функция mail (строка 13), которая и отправит письмо. В случае успешной отправки функция возвращает true, в противном случае — false.
Как видите, ничего сложного в настойке почты нет.
Источник
Отправка email в PHP: настройка OpenServer
В этом уроке мы научимся отправлять почту средствами PHP в рамках сервера OpenServer. О том, чем хорош этот сервер и о том, как его установить, я писал в статье «Установка и настройка OpenServer».
Начнем с того, что в PHP отправить email – очень просто. Для этого используется функция mail(). Чтобы отправить письмо нужно указать адрес получателя, тему письма и текст сообщения, а также специальный заголовок From, с указанием отправителя вот так:
Однако, вот незадача – если этот код выполнить на хостинге, то письмо будет отправлено и придёт получателю, а вот если мы используем OpenServer, то по умолчанию все наши письма будут просто записываться в специальный лог-файл. Убедиться в этом вы можете, заглянув во вкладку «Почта» настроек OpenServer.
И действительно, перейдя по этому пути, мы увидим наше письмо.
Но как же быть, если мы хотим на самом деле отправлять письма? Для этого нам нужен SMTP-сервер. Если кто не знает – электронная почта отправляется по специальному протоколу SMTP, а принимается по протоколу POP3. SMTP-сервер можно поднять самому, привязать к нему свой домен, и использовать свои адреса вроде x@myproject.ru. Мы же в рамках данного урока будем использовать SMTP-сервер Google.
Первым делом вам нужно создать новый аккаунт Google – просто перейдите в режиме инкогнито на https://gmail.com/ и создайте новую учетную запись. Я создал для примера kek777cheburek@gmail.com.
После этого переходим в настройки OpenServer и заполняем поля:
- способ отправки почты: отправлять почту через удаленный SMTP сервер
- SMTP сервер: smtp.gmail.com
- порт: 465
- email отправителя: почта, которую вы зарегали ранее
- имя пользователя: та же почта
- пароль: пароль от почты
- шифрование: авто
После этого жмем кнопку «Сохранить» и перезапускаем сервер.
Изменяем наш код:
После чего запускаем скрипт и проверяем свой ящик.
Мне письмо пришло мгновенно, так как в моём случае и отправитель и получатель были на gmail.com. Если у вас по-другому — возможно, придется подождать.
Стоит отметить, что данная инструкция является универсальной и данные настройки можно задать не только в OpenServer, но и в любом другом месте, где требуется конфигурация SMTP-сервера.
Если возникают проблемы с гуглопочтой и письмо почему-то не отправляется, почитайте комментарии. В частности может помочь вот это решение.
Источник
Php как настроить mail
setting return path:
Return-path header does not work because it is not part of smtp.
on *nix -f may be set on the mail command
alternatively
some MTAs accept mbox-style «From » header on the first header line
note: no colon after «From» , must be the first header line
or you may be able to re-configure you MTA to interpret return-path headers
-f is the most reliable method but it may mean that you can’t set any other command-line option due to shell escaping problems.
also note that email formatting requirements differ between windows and everything else. sendmail expects only \n line-endings
For linux you can over-ride the default «From» for the outgoing emails by including in php.ini this line:
sendmail_path = «/usr/sbin/sendmail -t -i -f fromMe@blah.com»
The path should work for most linux installations.
On Darwin OS such as OSX (current one: 10.8.3) you need to add a specific command and option to the sendmail_path constant if you have downloaded and installed a mamp with a stack.
Indeed you can see the required libraries for PHP, Apache, MySQL in «common/lib» folder. The problem is when you run an external command using these libraries, for example «sendmail». It could be a problem if it gets the stack libraries and not the system ones (different versions, etc).
The «env -i» command clean the Stack environment variables and run «sendmail» with the system libraries.
Источник
Php как настроить mail
Внимание: На серверах виртуального хостинга отправка почты с сайта возможна только при помощи функции PHP mail().
Для корректной работы почты необходимо чтобы email администратора, указываемый для домена в Панели управления хостингом, совпадал с email администратора, указываемом в настройках CMS или сайта.
Совпадение этих email — обязательное условие корректной отправки почты. При этом необходимо указывать email вида: любое_удобное_имя@домен_вашего_сайта (реальное существование указываемого ящика необязательно). Указание ящиков вида: @gmail.com, @yandex.ru и др. недопустимо!
Изменить Email администратора в Панели управления хостингом
1. Переходим в Панель управления хостингом из личного кабинета;
2. Далее в WWW-домены;
3. Затем, двойным кликом, открываем параметры нужного домена;
4. В поле E-Mail администратора указываем почтовый ящик от которого планируется отправлять сообщения.
5. Подтверждаем кнопкой Ок.
Настройка отправки почты в CMS Drupal 7
По умолчанию все сообщения с Drupal7 отправляются по средствам php mail(), email отправителя указывается при установке Drupal7. В дальнейшем email отправителя можно будет изменить в административной части Drupal, в разделе: Administration — Configuration — System.
Если отправка сообщений с сайта не работает, необходимо проверить, возможно включен модуль для работы почты посредством SMTP. Для проверки зайдите в раздел модулей, в административной части сайта Drupal: Administration — Modules.
Отключите модуль SMTP, убрав «галочку» возле модуля и сохранив настройку Save configuration.
Возможно, что отправка сообщений посредством SMTP реализована и другим способом. Для отправки сообщений через SMTP необходимо, чтобы на сайте присутствовал PHPMailer. Файлы PHPMailer по умолчанию находятся в директории ./sites/all/modules/smtp/phpmailer.
Существуют еще несколько способов реализации отправки сообщений сайта через php mail и SMTP. С ними вы можете ознакомиться в документации к CMS
Все сообщения с сайтов на Drupal отправляются посредством внутреней функции Druapl drupal_mail(). Через данную функцию реализовано большинство модулей для отправки. Настройки находятся в файле ./includes/mail.inc
В частности за отправку сообщений отвечают следующие строки:
drupal_mail($module, $key, $to, $language, $params = array(), $from = NULL, $send = TRUE)
Настройка отправки почты в CMS Joomla 3
По умолчанию все сообщения с Joomla отправляются с помощью PHP mail, email отправителя указывается при установке CMS. Изменить email можно в админ-панели Joomla.
1. Переходим в Общие настройки;
2. Далее выбираем вкладку Сервер;
3. В поле E-Mail сайта указываем почтовый ящик от которого планируется отправлять сообщения и сохраняем.
Примечание: В поле Метод отправки должно быть выбрано PHP Mail.
Альтернативно, настройки для отправки почты могут быть прописаны в конфигурационном файле configuration.php, который расположен в корневой директории сайта.
В Joomla много модулей, каждый из которых может использовать собственную систему отправки почты с сайта, не зависящую от глобальных настроек самой CMS Joomla. В связи с этим возможна ситуация, когда глобально настроена отправка через PHP mail, а в конкретном модуле, который, к примеру, отвечает за «Обратную связь», через SMTP.
Настройка отправки почты в CMS WordPress 5
По умолчанию все сообщения с WordPress отправляются с помощью PHP mail, email отправителя указывается при установке CMS. Изменить email можно в админ-панели WordPress.
1. Переходим в Настройки — Общие;
2. В поле Административный адрес E-Mail указываем почтовый ящик от которого планируется отправлять сообщения и сохраняем.
Внимание: Важно, чтобы в Административный адрес E-Mail был указан существующий адрес почты.
Также желательно проверить, есть ли плагины для отправки писем через SMTP, если они есть, то отключить. Это можно сделать в Плагины — Установленные. Часто в названии таких плагинов прямо указано «..SMTP..»
Иногда может возникнуть ошибка «Сообщение не удалось отправить. Возможная причина: сервер не поддерживает функцию mail(). »
Для ее решения нужно отредактировать файл на сайте ./wp-includes/pluggable.php найти в этом файле строчки:
Различные модули WordPress могут использовать для отправки писем как php mail(), так и SMTP вне зависимости от глобальных настроек. В связи с этим возможна ситуация, когда глобально настроена отправка через php mail, а в модуле который, к примеру, отвечает за «Обратную связь», через SMTP.
Обращаем ваше внимание, что за инфомацией по дополнительным настройкам указанных и других CMS необходимо обращаться к документации CMS.
Проверить отправку почты с сервера
Выполнив проверку, можно будет убедиться в корректности работы функции PHP mail.
Для проверки работы PHP mail() на сервере, в корневой папке вашего сайта необходимо создать файл testmail.php cо следующим содержимым (noreply@example.com это email на который будет отправлено сообщение):
Для проверки нужно запустить созданный файл, набрав в браузере вашдомен.by/testmail.php
Если сообщение «test php mail» пришло на указанный email, то функция php mail работает корректно.
Источник
Php как настроить mail
(PHP 4, PHP 5, PHP 7, PHP 8)
mail — Отправляет электронную почту
Описание
Отправляет электронную почту.
Список параметров
Получатель, или получатели письма.
Формат этого параметра должен соответствовать » RFC 2822. Несколько примеров:
- user@example.com
- user@example.com, anotheruser@example.com
- User
- User , Another User
Тема отправляемого письма.
Тема должна соответствовать » RFC 2047.
Каждая строка должна быть отделена символом CRLF (\r\n). Строки не должны быть длиннее 70 символов.
(Только для Windows) Если PHP передаёт данные напрямую SMTP-серверу и в начале строки стоит точка, то она будет удалена. Чтобы избежать этого замените все такие точки на две.
Строка или массив, которые будут вставлены в конец отправляемых заголовков письма.
Обычно используется для добавления дополнительных заголовков (From, Cc, and Bcc). Несколько дополнительных заголовков должны быть разделены CRLF (\r\n). Если для составления этого заголовка используются внешние данные, то они должны быть проверены для избежания инъекций нежелательных заголовков.
Если передан массив, то его ключи будут именами заголовка, а значения значениями.
До PHP 5.4.42 и 5.5.27, параметр additional_headers не имел защиты от инъекции. Так что пользователи должны удостовериться, что передаваемые заголовки безопасны и содержат только заголовки. т.е. не содержат несколько переводов строк подряд, что стартует тело сообщения.
При отправке письмо должно содержать заголовок From . Он может быть установлен с помощью параметра additional_headers , или значение по умолчанию может быть установлено в php.ini .
Если заголовок отсутствует, будет сгенерировано сообщение об ошибке вида Warning: mail(): «sendmail_from» not set in php.ini or custom «From:» header missing . Заголовок From также определяет заголовок Return-Path при отправке напрямую через SMTP (только Windows).
Если сообщения не отправляются, попробуйте использовать только LF (\n). Некоторые агенты пересылки сообщений Unix (особенно » qmail) автоматически заменяют LF на CRLF (что приводит к двойному CR, если использовалось CRLF). Используйте эту меру в крайнем случае, так как это нарушает » RFC 2822.
Параметр additional_params может быть использован для передачи дополнительных флагов в виде аргументов командной строки для программы сконфигурированной для отправки писем, указанной директивой sendmail_path . Например, можно установить отправителя письма при использовании sendmail с помощью опции -f .
Параметр автоматически экранируется функцией escapeshellcmd() , чтобы не допустить выполнение команд. Но escapeshellcmd() позволяет добавлять дополнительные параметры. В целях безопасности рекомендуется проверять и очищать этот параметр.
Так как escapeshellcmd() применяется автоматически, то нельзя использовать некоторые символы, допустимые к использованию в email-адресах некоторыми RFC. mail() не допускает такие символы, поэтому в программах, в которых они требуются, рекомендуется использовать альтернативы для их отправки (например фреймворки или библиотеки).
Пользователь, под которым работает веб-сервер должен быть добавлен в список доверенных в конфигурации sendmail для того чтобы избежать добавления заголовка ‘X-Warning’ при указании отправителя с помощью опции (-f). Для пользователей sendmail — это файл /etc/mail/trusted-users .
Возвращаемые значения
Возвращает true , если письмо было принято для передачи, иначе false .
Важно заметить, что то что письмо было принято для передачи вовсе НЕ означает что оно достигло получателя.
Список изменений
| Версия | Описание |
|---|---|
| 7.2.0 | Параметр additional_headers может принимать значения типа массив. |
Примеры
Пример #1 Отправка письма.
Использование функции mail() для отправки простого письма:
// Сообщение
$message = «Line 1\r\nLine 2\r\nLine 3» ;
// На случай если какая-то строка письма длиннее 70 символов мы используем wordwrap()
$message = wordwrap ( $message , 70 , «\r\n» );
// Отправляем
mail ( ‘caffeinated@example.com’ , ‘My Subject’ , $message );
?>
Пример #2 Отправка письма с дополнительными заголовками.
Добавление простых заголовков, сообщающих почтовому агенту адреса From и Reply-To:
= ‘nobody@example.com’ ;
$subject = ‘the subject’ ;
$message = ‘hello’ ;
$headers = ‘From: webmaster@example.com’ . «\r\n» .
‘Reply-To: webmaster@example.com’ . «\r\n» .
‘X-Mailer: PHP/’ . phpversion ();
mail ( $to , $subject , $message , $headers );
?>
Пример #3 Отправка письма с дополнительными заголовками, переданными массивом
В этом примере посылается то же письмо, что и в примере выше, но дополнительные заголовки задаются массивом (доступно с PHP 7.2.0).
= ‘nobody@example.com’ ;
$subject = ‘the subject’ ;
$message = ‘hello’ ;
$headers = array(
‘From’ => ‘webmaster@example.com’ ,
‘Reply-To’ => ‘webmaster@example.com’ ,
‘X-Mailer’ => ‘PHP/’ . phpversion ()
);
mail ( $to , $subject , $message , $headers );
?>
Пример #4 Отправка письма с дополнительными аргументами командной строки.
Параметр additional_params может быть использован для передачи дополнительных параметров программе, используемой для отправки писем с помощью директивы sendmail_path .
Пример #5 Отправка HTML-сообщения
С помощью функции mail() также можно отправить и HTML-письмо.
// несколько получателей
$to = ‘johny@example.com, sally@example.com’ ; // обратите внимание на запятую
// тема письма
$subject = ‘Birthday Reminders for August’ ;
// текст письма
$message = ‘
Birthday Reminders for August
Источник