Отправка почты через SMTP сервер

Отправка почты через SMTP сервер

Отправка почты через SMTP сервер

И так, я снова с вами)

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


На каждый наш запрос сервер будет отвечать строкой, в начале которой стоит код. Именно он нас и будет интересовать. Для его получения достаточно пропустить ответ через эту функцию:

1
2
3
4
5
6
7
8
function get_data($smtp){
$data="";
while($str = fgets($smtp,515)){
$data.=$str;
if(substr($str,3,1) == " ") break;
}
return $data;
}

Полный список кодов и их значений внизу статьи, там же и спецификация протокола smtp

Для начала открываем соединение с сервером:

1
2
3
4
$server="smtp.mail.ru"; //адрес сервера
$port = 25; //порт обращения
$time_ping = 60;//время ожидания ответа
$smtp = fsockopen($server,$port,$errno,$errstr,$time_ping);

Теперь пора поприветствовать сервер)

1
fputs($smtp,"EHLO mail.ru\r\n");//если все хорошо, то получаем код 250

Теперь можно переходить к авторизации:

1
fputs($smtp,"AUTH LOGIN\r\n");//ответ должен быть 334

Пара передавать логин и пароль, не забудьте их зашифровать base64_encode()

1
2
fputs($smtp,base64_encode($login)."\r\n");//если все хорошо, то код 334
fputs($smtp,base64_encode($password)."\r\n");//если пароль был верен, то код 235

Теперь сообщаем автора письма, т.е. наш ящик
Важно: не забываем все e-mail адреса брать в скобки < >

1
2
fputs($smtp,"MAIL FROM: <mail@mail.ru>\r\n");//если ок, то код 250.
//Если ошибка проверьте правильность адреса и наличие скобок!

Пора сообщить кому мы хотим отправить письмо:

1
fputs($smtp,"RCPT TO:<to_mail@mail.ru>\r\n");//код 250

если получателей несколько, то передайте серверу все адреса по очереди:

1
2
3
fputs($smtp,"RCPT TO:<to_mail_1@mail.ru>\r\n");//код 250
fputs($smtp,"RCPT TO:<to_mail_2@mail.ru>\r\n");//код 250
...

Мы готовы отправить само письмо:

1
fputs($smtp,"DATA\r\n");//ответ 354

Теперь само письмо:
Важно: ввод письма должен быть завершен точкой, на отдельной строке!

1
fputs($smtp,$header."\r\n".$text."\r\n.\r\n");//ответ 250

Ниже пример заголовка отправляемого The Bat`ом:

1
2
3
4
5
6
7
8
9
10
11
$header="Date: ".date("D, j M Y G:i:s")." +0700\r\n";
$header.="From: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('Вадим')))."?= \r\n";
$header.="X-Mailer: The Bat! (v3.99.3) Professional\r\n";
$header.="Reply-To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('Вадим')))."?= \r\n";
$header.="X-Priority: 3 (Normal)\r\n";
$header.="Message-ID: &lt;172562218.".date("YmjHis")."@mail.ru&gt;\r\n";
$header.="To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('Сергей')))."?= \r\n";
$header.="Subject: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('проверка')))."?=\r\n";
$header.="MIME-Version: 1.0\r\n";
$header.="Content-Type: text/plain; charset=windows-1251\r\n";
$header.="Content-Transfer-Encoding: 8bit\r\n";

Ну и наконец прощаемся с сервером

1
fputs($smtp,"QUIT\r\n");//ответ 221

В дальнейшем мы рассмотрим отправку писем с вложением и в итоге я выложу свой класс для работы с почтой)

Список кодов, возвращаемых smtp сервером

Код Назначение
211 Сообщение о состоянии системы или справочный отклик (help).
214 Help message – сообщение для сведения. [Информация о том, как использовать приемник или значение конкретной нестандартной команды; этот отклик полезен только для пользователей-людей].
220 <domain> Service ready – сервер готов к обслуживанию.
221 <domain> Service closing transmission channel – сервер закрывает канал;
250 Requested mail action okay, completed – процедура успешно завершена;
251 User not local; will forward to <forward-path> – адресат не местный, сообщение ему будет переадресовано.
354 Start mail input; end with <CRLF>.<CRLF> – начало ввода сообщения, завершение символьной последовательностью <CRLF>.<CRLF>.
421 <domain> Service not available, closing transmission channel – сервер не доступен, процедура прерывается. [Это может быть ответом на любую команду, если сервер знает, что он должен прервать обслуживание]
450 Requested mail action not taken: mailbox unavailable – запрошенная процедура не выполнена [Напр., из-за отсутствия доступа к почтовому ящику].
451 Requested action aborted: error in processing – выполнение процедуры прервано из-за ошибки.
452 Requested action not taken: insufficient system storage – операция не выполнена из-за недостатка системной памяти.
500 Syntax error, команда не узнана. [Среди прочего, это может указывать на то, что командная строка имеет слишком большую длину].
501 Syntax error in parameters or arguments – синтаксическая ошибка в параметрах или аргументах.
502 Command not implemented – нелегальная команда.
503 Bad sequence of commands – неудачная последовательность команд.
504 Command parameter not implemented – ошибка в параметрах команды.
550 Requested action not taken: mailbox unavailable – Запрошенная операция не выполнена [Напр., почтовый ящик не найден или доступ к нему невозможен].
551 User not local; please try <forward-path> – адресат не местный, рекомендуется переадресовать сообщение по адресу <forward-path>.
552 Requested mail action aborted: exceeded storage allocation – операция прервана из-за превышения лимитов памяти (слишком много адресатов или слишком длинное сообщение).
553 Requested action not taken: mailbox name not allowed – операция не выполнена [Например, ошибка в записи адреса почтового ящика].
554 Transaction failed – процедура не выполнена.
Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru TEXT LINK Mister Wong

Читай с RSS. Не пропусти интересное)

Теги: ,

Среда, 11 мая 2011 PHP

Комментариев пока нет.

Ваш отзыв

Читать в Яндекс.Ленте
регистрация доменов
Зарегистрируй себе домен!
.RU - 99 рублей в год
www.
Блогун - реклама в блогах. Хостинг для блогов

Поиск

 

Комментарии