Отправка почты через 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: <172562218.".date("YmjHis")."@mail.ru>\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 – процедура не выполнена. |
Комментариев пока нет.
Ваш отзыв
Классификатор
- JS (1)
- PHP (16)
- блогинг (4)
- Блогообзор (2)
- Веб-мастеру (11)
- интересное (19)
- Мой скрипт (10)
- Новости (12)
Теги
Поиск
Комментарии
- Александр Борисов к записи Постовой – плагин для WordPress
- sidash к записи Постовой – плагин для WordPress
- Alexander к записи Постовой – плагин для WordPress
- LaaCrus к записи Старт блогообзора
- ИстинА к записи Работа с почтой средствами PHP


