Отправка писем через 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