Отправка писем через SMTP с авторизацией посредством telnet

18 июля, 2008

В этой статье я расскажу, как отправлять почту через SMTP с авторизацией помощью PHP.
Рассматривать будем вариант отправки именно с авторизацией, так как SMTP без авторизации в данный момент почти не существует.
Для отправки письма через SMTP потребуется возможность работы php с сокетами.
На бесплатных хостингах использование сокетов может быть запрещено.

Для чего же может потребоваться отправка почты из php через smtp, ведь в php есть готовая функция отправки почты mail()?

1. Основная причина, это проблема фильтров антиспама.
Современные сервера настроены таким образом, что отправляя письмо через функцию mail(), в заголовки письма добавляется информация, по которой очевидно, что почта была отправлена с помощью mail().
Вот этого и не любят фильтры антиспама на стороне получателя. Не все конечно, но если фильтр настроен жестко, то скорее всего такое письмо будет удалено фильтром на стороне получателя.
Можно конечно избавиться от таких заголовков с помощью настройки сервера(если у вас есть доступ к настройке сервера), но это уже вариант сложный и не всем подходит.

2. Специфическая причина.
Можно полностью замаскировать письмо, как буд-то оно было отправленно почтовой программой.

Отправка почты вручную.
Сначала немного разберем протокол SMTP, и попробуем отправить почту с помощью командной строки винды, чтобы понять принцип общения с smtp сервером.
Тестировать вам придется на своем smtp сервере, надеюсь у каждого есть почта на бесплатных серверах, вот на них и можете потестировать.
Для примера буду использовать mail.ru
Запускаем командную строку(ПУСК/выполнить/cmd/[OK])
В открывшемся окне пишем

telnet smtp.mail.ru 25 <жмем inter>

Если соединение прошло нормально, сервер должен ответить примерно так

220 mail.ru ESMTP Sat, 11 Aug 2007 17:32:14 +0400

Теперь здороваемся с сервером

EHLO mail.ru

Если все ок, ответ будет

250-mx30.mail.ru Hello mail.ru [80.64.80.192]
250-SIZE 10485760
250-8BITMIME
250-AUTH PLAIN LOGIN
250 PIPELINING

После подобного ответа можно вводить логин и пароль для авторизации. Для этого вводим команду.

AUTH LOGIN

получаем ответ

334 VXNlcm5hbWU6

И вот сейчас надо вводить пароль логин, но они должны быть закодированы.
Самый простой способ закодировать логин и пароль, это при помощи функции php base64_encode()
Создайте следующий php код и запустите его на тестовом сервере.

<?
print base64_encode("логин");
print
'<br>';
print
base64_encode("пароль");
?>

Коды логина и пароля получены, теперь можно ввести их.
Копируйте и вставляйте их по очереди.
После ввода логина должно появиться сообщение с кодом 334.
После ввода правильного пароля должно появиться

235 Authentication succeeded

Авторизация пройдена. Сейчас указываем от кого будет написано письмо. Указываете свой ящик, от имени которого авторизовались.

MAIL FROM:login@mail.ru

Если сервер принял этот адрес, получите ответ

250 OK

Теперь указываем email получателя

RCPT TO:asd@qwe.ru

положительный ответ сервера

250 Accepted

Если нужно письмо отправить нескольким адресатам, повторяем команду RCPT TO: сколько нужно раз
А сейчас настало время самого письма. Вводим команду

DATA

Ответ будет примерно таким

354 Enter message, ending with "." on a line by itself

Сейчас можно вводить текст письма.
Само письмо состоит из заголовков и тела.
Заголовки конечно можно не писать, но лучше чтобы они были
Заголовки от тела отделяются пустой строкой

Subject: Это тема письма
To: asd@qwe.ru
X-Mailer: webi.ru mailer

Отделили заголовки пустой строкой, и теперь пишем текст письма…
А чтобы закончить ввод письма, нужно на отдельной строке ввести точку.

.

Когда введете точку, получите такой ответ

250 OK id=1IiR72-000ONs-00

Теперь завершаем работу с сервером.

QUIT

ответ

221 mx30.mail.ru closing connection

Вот такой принцип общения с SMTP сервером.
Здесь я показал только принцип.
Полное описание протокола smtp, все команды и коды ответов сервера читайте в документе PDF на русском языке протокол SMTP

сайт автора: http://webi.ru

Оставить комментарий

Вам надо войти чтобы оставить комментарий.