PHP mail под Windows / Habr

В этой статье я хочу рассказать об отправке почты из 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

[email protected]; имя вашего аккаунта
auth_password=account_password; ваш пароль

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

; параметр для команды MAIL FROM
[email protected]

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: [email protected]")) {
14 		echo "<h4>Сообщение отправлено</h4>";
15 	}
16 	else {
17 		echo "<h4>При отправке сообщения возникла ошибка</h4>";
18 	}
19 }
20 ?>
21 <form action="mailer.php" method="post">
22 <p>
23 	<label for="addr">eMail:</label>
24 	<input type="text" name="addr" size="30" />
25 </p>
26 <p>
27 	<label for="theme">Тема письма:</label>
28 	<input type="text" name="theme" size="30" />
29 </p>
30 <p>
31 	<label for="text">Текст письма:</label>
32 	<textarea rows="10" cols="20" name="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.

habr.com

Отправка писем через SMTP на PHP

<?php

$config[‘smtp_username’] = ‘[email protected]’;  //Смените на адрес своего почтового ящика.

$config[‘smtp_port’] = ‘465’; // Порт работы.

$config[‘smtp_host’] =  ‘ssl://smtp.yandex.ru’;  //сервер для отправки почты

$config[‘smtp_password’] = ‘пароль’;  //Измените пароль

$config[‘smtp_debug’] = true;  //Если Вы хотите видеть сообщения ошибок, укажите true вместо false

$config[‘smtp_charset’] = ‘utf-8’; //кодировка сообщений. (windows-1251 или utf-8, итд)

$config[‘smtp_from’] = ‘МегаСервис’; //Ваше имя — или имя Вашего сайта. Будет показывать при прочтении в поле «От кого»

function smtpmail($to=», $mail_to, $subject, $message, $headers=») {

global $config;

$SEND = «Date: «.date(«D, d M Y H:i:s») . » UT\r\n»;

$SEND .= ‘Subject: =?’.$config[‘smtp_charset’].’?B?’.base64_encode($subject).»=?=\r\n»;

if ($headers) $SEND .= $headers.»\r\n\r\n»;

else

{

$SEND .= «Reply-To: «.$config[‘smtp_username’].»\r\n»;

$SEND .= «To: \»=?».$config[‘smtp_charset’].»?B?».base64_encode($to).»=?=\» <$mail_to>\r\n»;

$SEND .= «MIME-Version: 1.0\r\n»;

$SEND .= «Content-Type: text/html; charset=\»».$config[‘smtp_charset’].»\»\r\n»;

$SEND .= «Content-Transfer-Encoding: 8bit\r\n»;

$SEND .= «From: \»=?».$config[‘smtp_charset’].»?B?».base64_encode($config[‘smtp_from’]).»=?=\» <«.$config[‘smtp_username’].»>\r\n»;

$SEND .= «X-Priority: 3\r\n\r\n»;

}

$SEND .=  $message.»\r\n»;

if( !$socket = fsockopen($config[‘smtp_host’], $config[‘smtp_port’], $errno, $errstr, 30) ) {

if ($config[‘smtp_debug’]) echo $errno.»<br>».$errstr;

return false;

}

if (!server_parse($socket, «220», __LINE__)) return false;

fputs($socket, «HELO » . $config[‘smtp_host’] . «\r\n»);

if (!server_parse($socket, «250», __LINE__)) {

if ($config[‘smtp_debug’]) echo ‘<p>Не могу отправить HELO!</p>’;

fclose($socket);

return false;

}

fputs($socket, «AUTH LOGIN\r\n»);

if (!server_parse($socket, «334», __LINE__)) {

if ($config[‘smtp_debug’]) echo ‘<p>Не могу найти ответ на запрос авторизаци.</p>’;

fclose($socket);

return false;

}

fputs($socket, base64_encode($config[‘smtp_username’]) . «\r\n»);

if (!server_parse($socket, «334», __LINE__)) {

if ($config[‘smtp_debug’]) echo ‘<p>Логин авторизации не был принят сервером!</p>’;

fclose($socket);

return false;

}

fputs($socket, base64_encode($config[‘smtp_password’]) . «\r\n»);

if (!server_parse($socket, «235», __LINE__)) {

if ($config[‘smtp_debug’]) echo ‘<p>Пароль не был принят сервером как верный! Ошибка авторизации!</p>’;

fclose($socket);

return false;

}

fputs($socket, «MAIL FROM: <«.$config[‘smtp_username’].»>\r\n»);

if (!server_parse($socket, «250», __LINE__)) {

if ($config[‘smtp_debug’]) echo ‘<p>Не могу отправить комманду MAIL FROM: </p>’;

fclose($socket);

return false;

}

fputs($socket, «RCPT TO: <» . $mail_to . «>\r\n»);

if (!server_parse($socket, «250», __LINE__)) {

if ($config[‘smtp_debug’]) echo ‘<p>Не могу отправить комманду RCPT TO: </p>’;

fclose($socket);

return false;

}

fputs($socket, «DATA\r\n»);

if (!server_parse($socket, «354», __LINE__)) {

if ($config[‘smtp_debug’]) echo ‘<p>Не могу отправить комманду DATA</p>’;

fclose($socket);

return false;

}

fputs($socket, $SEND.»\r\n.\r\n»);

if (!server_parse($socket, «250», __LINE__)) {

if ($config[‘smtp_debug’]) echo ‘<p>Не смог отправить тело письма. Письмо не было отправленно!</p>’;

fclose($socket);

return false;

}

fputs($socket, «QUIT\r\n»);

fclose($socket);

return TRUE;

}

 

function server_parse($socket, $response, $line = __LINE__) {

global $config;

while (@substr($server_response, 3, 1) != ‘ ‘) {

if (!($server_response = fgets($socket, 256))) {

if ($config[‘smtp_debug’]) echo «<p>Проблемы с отправкой почты!</p>$response<br>$line<br>»;

return false;

}

}

if (!(substr($server_response, 0, 3) == $response)) {

if ($config[‘smtp_debug’]) echo «<p>Проблемы с отправкой почты!</p>$response<br>$line<br>»;

return false;

}

return true;

}

?>

i-leon.ru

Отправка почты php через smtp c локального сервера

103

Отправка почты php через smtp популярных почтовых сервисов яндекса, гугла и mail ru, может осуществляться и с локального сервера, если программное обеспечение такого сервера позволяет это сделать.

Одним из таких серверов, является openserver и все что нужно для работы с почтой, у него есть. Использование возможностей таких серверов, позволяет создавать, тестировать и настраивать новые сайты, скрипты и приложения на компьютере, без подключения услуг хостинг-провайдеров.

 

В этом уроке рассмотрим вариант отправки почты php через smtp на движке joomla, с помощью локального сервера openserver. Чтобы было все наглядно и правильно, лучше конечно создать в яндексе, гугле и mail ru по одному почтовому ящику, а данные для авторизации лучше записать.

В каждом таком сервисе есть возможность отправки писем через smtp (широко используемый сетевой протокол). Именно они производят отправку сообщений, все остальные (сами скрипты, cms и пр.), лишь формирую эти сообщения.

Для настройки отправки почты php через smtp, нужно проделать некоторые шаги:

  1. Создать почтовый ящик, или несколько yandex, google, mail ru
  2. Установить и настроить openserver
  3. Установить joomla на openserver

Затем можно приступать к настройке openserver для отправки почты php через smtp, в данном случае показан шаблон для smtp яндекса. Вместо слова «test» необходимо подставить свои реальные значения.

При необходимости настроить несколько почтовых серверов, лучше всего настроить отправку почты php через smtp в openserver с помощью профилей. В этом случае не придется несколько раз переделывать настройки. Как работать с профилями показано в видеоуроке настройка php для разных cms-систем.

Отправка почты php через smtp яндекса в joomla

В общих настройках системы, в меню «сервер», выставляем следующие параметры:
Включаем режим отправки почты в положение «Да», указываем реальный адрес куда будет отправляться почта и устанавливаем способ отправки-PHP Mail

Как все будет готово, можно отправлять сообщение нажав на кнопку «Отправить тестовое сообщение». Если все правильно настроено, на почту указанную в настройках joomla, придет тестовое письмо.

Отправка почты php через smtp mail ru

В настройках mail ru все точно так же как и в яндексе. Вместо слова «test», подставляем свои данные. После сохранения настроек, опять отправляем тестовое сообщение.

Отправка почты php через smtp google в joomla

В гугле немного сложнее создавать аккаунты и система безопасности там лучше. По этой причине вместо письма придет уведомление безопасности и о дальнейших действиях по подключению приложений.

В любом случае, все будет работать.

В данном уроке были рассмотрены варианты отправки почты php через smtp трех почтовых сервисов. Отправка почты php через smtp Yahoo и Rambler будет происходить точно так же.

Непосредственно в почтовом ящике, в строке от кого, будут указаны smtp тех сервисов, через которые производились отправки. На скриншоте они показаны стрелками.

Если использовать для отправки почты скрипт, то почта будет приходить на почтовый адрес указанный в скрипте, а пересылаться будет через тот smtp, который указан в последних настройках openserver.

 

starting-constructor.ru