Pers.narod.ru. PHP. PHPMailer - скрипт для начинающего спамера или почта с любого адреса |
Технически ничего сложного в задаче программной отправки E-mail, в том числе и с любого адреса, нет. Достаточно написать небольшой скрипт на PHP (или Perl), вызывающий функцию mail
с нужными параметрами. Простейший кусочек кода приведён, например, в этой статье (пункт 1).
Представленный ниже скрипт, по сути дела, есть просто "накрутка" над подобным же вызовом функции
mail
. Для ввода и редактирования письма в формате HTML он использует прекрасную (правда, довольно объемную - около 1,5 Мб в разжатом состоянии) библиотеку TinyMCE, плюс содержит несколько дополнительных функций для проверки корректности вводимых данных, установки ограничений на время между повторными отправками и т.п. Получается вот такой сервис:
Как видно на рисунке, скрипт позволяет формировать тело письма в
WYSIWYG-редакторе, похожем на обычный Microsoft Word, а также отправлять письмо как простой текст (переключатель справа от кнопки "Сброс"). Время до повторной отправки, а также ограничения на максимальный размер письма и максимальную длину слова настраиваются в файле config.php
. После отправки письма скрипт оставляет письмо в форме и позволяет, спустя указанное Вами число секунд, повторить отправку. Думаю, нетрудно добавить в post.php
ещё несколько строчек кода, чтоб рассылать письмо по списку адресов, сохранённому, скажем, в текстовом файле. Подключения MySQL эта версия скрипта не требует.
Вложение файлов в письмо в этой версии скрипта недоступно, но можно вставлять ссылки на внешние ресурсы, в том числе, графические. Если хотите полноценную поддержку вложений - дополните библиотеку TinyMCE модулями MCFileManager и MCImageManager, настройте их и запаситесь местом на хостинге. На официальном сайте эти модули предлагается купить, но если немного постараться, можно найти и так.
Скрипту требуется PHP 5.1.0 или выше - из-за вызова функции htmlspecialchars_decode
, нужного, чтоб превратить "обратно в HTML" полученные от TinyMCE данные. Естественно, написав свой аналог этой функции, можно использовать скрипт и на младших версиях PHP.
Вывод функции mail не подавлен, так что при неудачной отправке перед текстом "Не удалось отправить сообщение..." должно вывалиться системное сообщение от сервера - его анализ поможет выяснить, в чём дело. А дело будет, скорее всего в том, о чём пойдёт речь дальше в статье.
На файл time должны быть права на запись.
Кроме того, как и для запуска любых других скриптов, работающих с сессиями или загрузкой файлов,
должны быть настроены права 777
на папку временных файлов (обычно PHP/tmp
). Если увидели такое:
позаботьтесь об этом (как ставить права под Windows было здесь, пп. 3-5).
Вот ссылка для скачивания скрипта вместе с установленной Tinymce:
скачать phpmailer.zip, ~540 Кб
Кстати, изменив функционал кнопки "Отправить" (или вовсе убрав её, потому что есть кнопка предварительного просмотра на панели инструментов), можно использовать скрипт и просто как визуальный редактор HTML-кода.
Прежде, чем порассуждать о том, почему инет до сих пор не наводнён такими скриптами и спам удаётся удерживать хоть в каких-то рамках, давайте поговорим об ещё одной распространённой проблеме, связанной с отправкой почты из языков сценариев. У большинства клиентов и начинающих программистов на PHP стоит та или иная версия Windows и часто возникает вопрос -
как отлаживать скрипты и эмулировать отправку почты (а лучше прямо отправлять её!) функцией mail
на локальном сервере Windows. Разрешением этого вопроса мы и займёмся дальше.
В идеале хорошо бы отправлять почту подобным скриптом не только от провайдера, но и с локалхоста.
Думаю, Вы понимаете, что для работы такого сервиса нужно установить и настроить у себя в Windows локальный сервер IIS (вот моя статья), а также добавить компоненту SMTP - встроенного в Windows "виртуального" почтового сервера. Здесь и дальше я ориентируюсь на Windows XP, для других близких версий Windows отличия минимальны.
Для этого идём Пуск, Панель управления, Установка и удаление программ, вкладка Установка компонентов Windows, в списке выбираем Internet Information Services, далее кнопка Состав, включить компоненту "служба SMTP". Возможно, понадобится и будет запрошен диск с Вашим дистрибутивом Windows.
В отличие от www-сервера на локальном компьютере Windows, успешно работающего "по умолчанию" на адресе http://127.0.0.1
, SMTP-сервер "сам по себе" ничего отправлять не будет, и при попытке программно отправить почту функцией mail из PHP или Perl Вы увидите примерно следующее:
SMTP server response: 550 5.7.1 Unable to relay адрес@почты
Решаем эту проблему так:
Идём Пуск, Панель управления, Администрирование, Internet Information Services, раскрываем список ИМЯ_СЕРВЕРА (локальный компьютер)
, щёлкаем правой кнопкой на компоненте "Виртуальный SMTP-сервер по умолчанию", далее пункт Свойства, вкладка Доступ, кнопка Ретрансляция...
Вверху выбираем "Только указанные в списке" (мы ведь собираемся работать с SMTP только со своего локалхоста?), жмём кнопочку "Добавить", в новом окне выбираем радиокнопку "Отдельный компьютер", в поле IP-адрес вписываем 127.0.0.1, жмем ОК и ещё раз ОК, чтобы закрыть окно "Ограничения ретрансляции". Перед этим, думаю, Вы не забыли снять галочку "Разрешить ретрансляцию любому не указанному в списке компьютеру".
На всякий случай в том же окне "Свойства: Виртуальный SMTP-сервер..." и на той же вкладке "Доступ" жмём кнопку "Подключение...", в новом окне выбираем "Только указанные в списке", кнопка "Добавить", выбор "Отдельный компьютер", ввод IP-адреса 127.0.0.1
- в общем, то же самое.
Применяем сделанные изменения - и локалхост начинает отправлять почту... только она не приходит!
Дело в том, что функция mail
сама по себе ничего не отправляет, она просто вызывает программу sendmail
, которая в дистрибутив Web-сервера IIS и интерпретатора PHP под Windows не входит. И никогда не входила, и никогда не будет входить.
Где же тогда взять sendmail
?
http://www.glob.com.au/sendmail/
Вот "волшебная ссылка", качаем, разворачиваем архив, кидаем, например, в папку внутри папки PHP.
У меня это c:\php
, так что путь получится c:\php\sendmail
.
Любым текстовым редактором открываем свой файл
php.ini
. Обычно это c:\WINDOWS\php.ini
, но бывает по-разному. Чтоб узнать точно, создайте в отдельном файле с именем phpinfo.php
код вида
<? phpinfo (); ?>
и выполните его на локалхосте из браузера:
http://127.0.0.1/phpinfo.php
Разумеется, файл надо положить в корень локалхоста, обычно это папка c:\Inetpub\wwwroot
. Ответ будет в первой из сгенерированных в браузере таблиц, настройка Configuration File (php.ini) Path.
В файле php.ini
правим приведённую ниже секцию (если секции вдруг нет - создайте... но должна быть).
[mail function] SMTP = smtp_port = 25 sendmail_from = sendmail_path = "c:\php\sendmail\sendmail.exe -t"
Открываем файл sendmail.ini
из папки sendmail
, там пишем нужные настройки, например,
[sendmail] default_domain=mail.ru smtp_ssl=auto hostname=mail.ru smtp_server=smtp.mail.ru smtp_port=25 auth_username=ЛОГИН@mail.ru auth_password=ПАРОЛЬ pop3_server=pop.mail.ru pop3_username=ЛОГИН@mail.ru pop3_password=ПАРОЛЬ force_sender=ЛОГИН@mail.ru force_recipient=ЛОГИН@mail.ru error_logfile=error.log debug_logfile=debug.log
- для сервера Mail.ru. Следует указать реально существующие ЛОГИН
и ПАРОЛЬ
. С исходного файла sendmail.ini
лучше предварительно сохранить резервную копию, там много комментариев на английском, раскрывающих назначение всех этих настроек.
Перезапускаем Web-сервер: для этого идём к IIS (надеюсь, путь уже запомнили), правая кнопка на локальном Web-узле, Остановить, затем Пуск.
Пробуем отправить почту и получаем, скорее всего, следующее:
Warning: mail() [function.mail]: Could not execute mail delivery program
'c:\php\sendmail\sendmail.exe -t' in ИмяФайла.php и номер строки с вызовом mail
Что ещё может мешать? Конечно, наши любимые права на файлы NTFS :)
Для корректной работы sendmail
под Windows-сервером нужно дать разрешение на чтение/исполнение пользователю
IUSR_*** для папки, в которой лежит sendmail.exe
, а также на файл командного процессора cmd.exe
.
Самое забавное, что уровень безопасности самого сервера IIS никак не влияет
на возможность запуска cmd.exe
. Если не знаете, как назначать файлам права - в той же статье, что уже была по ссылке выше, пункты 3-5.
Когда работа с почтой на локалхосте станет не нужна, не забудьте запретить пользователю IUSR_*** доступ к cmd.exe
, а также остановить SMTP-сервер - зачем Вам лишняя "дырка" в системе и лишний открытый порт?
С правами на папку справились, теперь командный процессор. Правая кнопка на "Мой компьютер", Свойства, вкладка Дополнительно, кнопка Переменные среды,
системная переменная Comspec содержит путь к командному процессору (обычно
c:\WINDOWS\system32\cmd.exe
). На этот файл для гостевой учётной записи Интернета тоже
ставим права на "разрешить чтение и выполнение".
Мы сделали всё и программная отправка почты из PHP на локальном сервере Windows пройдёт успешно - по крайней мере, так скажет функция mail
. К сожалению, в этом самом интересном месте вынужден Вас огорчить. Никакого "письма от Билла Гейтса" Ваш сосед, скорее всего, не получит. Об этом и поговорим в следующем разделе.
Полагаю, Вы догадываетесь, что случилось бы, будь всё так просто. В первую очередь аналогичные скрипты стали бы использовать спамеры для рассылок сотен тысяч никчемных писем, засоряющих наши ящики и гоняющих по Сети терабайты паразитного траффика. Простой шутник, желающий разово воспользоваться сервисом для отправки новогоднего поздравления, через них просто не пробился бы. Да и вообще - представьте, что каждый смог бы со своего компьютера полноценно рассылать неограниченное количество писем от любого имени...
Разумеется, меры уже приняты.
Самое главное, "нехорошие" админы большинства почтовых серверов запрещают подставлять в
поле From:
"левый" адрес, так что отправка, внешне проходящая успешно (функция mail
вернёт результат true
), на самом деле не будет означать доставки письма.
На сервере Mail.Ru, к примеру, давно так и сделано, так что не верьте многочисленным советам использовать его для "анонимной отправки писем". Вышеприведённые настройки Mail.Ru сработают, и функция mail
никаких проблем не увидит. Увидеть их можете разве что Вы сами - прочитав отчёт об ошибках
в файле crash.txt
, который будет создан в папке программы sendmail
.
Дело в том, что в системе разрешения доменных имён DNS существуют так называемые обратные зоны, и если для узла, с которого мы отправляем сообщение, нет соответствующей записи (или есть, но она попадает под ранее наложенные фильтры), то сообщения от такого узла не будут приниматься большинством почтовых серверов. Также есть ещё "чёрные" списки, "серые", "белые" и т.д. + всякие схемы проверки подлинности и легитимности, с соответствующими коэффициентами и весами.
Иными словами, для отправки письма нужно произвести авторизацию через POP3-сервер, то есть сначала забрать письма с сервера, затем отправить написанные письма.
При отправке писем через SMTP-сервер содержимое поля From:
в этом случае должно совпадать с именем почтового ящика, в котором была осуществлена SMTP-авторизация. Т.е., если в настройках почтовой программы указан почтовый ящик mailinboxbklist@mail.ru, то именно это имя почтового ящика должно указываться в поле From:
. Вы же, понятное дело, не знаете пароля от того ящика, "с которого" отправляете письма.
И что же, получается, всё так плохо и отправить спам никак не получится?
Да нет, возможно отправить. Откуда бы он тогда брался-то? :)
1. На платных и корпоративных хостингах отправка письма от чужого имени может быть и не запрещена, на моих точно не запрещена, так что реально(пока что, потому уберу) позволяет отправить письмо от другого адреса. Только я там поставил в config.php
приличные интервалы между отправкой, так что спамить скриптом не получится. Да и надо понимать, что, во-первых, "отправка с другого адреса" не запрещена только для диапазона адресов, непосредственно относящегося к хостеру, во-вторых, что если я или кто-то другой начнут с помощью такого скрипта спамить, то провайдер может отследить и принять меры. Не посмотрев на то, что пользователь платный.
2. Существуют так называемые "relay SMTP-серверы", позволяющие отправлять через себя письма без авторизации и указывать любые обратные адреса. Поищите по этому запросу в Google (Яндексе) и обрящете. А потом укажите такой сервер в настойках нашего выше установленного sendmail
. Увы, многие из этих серверов уже не существуют (много устаревших данных в перечнях таких серваков) или стабильно находятся в чёрных списках.
Но вот посмотрев детальные свойства свеженького письма от спамера, обошедшего все антиспамовые фильтры, порой нетрудно разжиться нужным SMTP.
3. Для программной отправки почты необязательно пользоваться услугами сервисов SMTP. Можно всё реализовать программно. Для этого изучайте спецификацию протокола SMTP/POP3 и пишите на сокетах (sockets), хоть в том же Delphi (простейший пример, правда, для POP-, а не SMTP-сервиса - в этой статье).
Кстати, проверить свой SMTP-сервер на "Open Relay" (т.е., не предоставляет ли он возможности делать несанкционированные рассылки - или наоборот "предоставляет ли", если Вас интересует это), можно по ссылке
http://www.abuse.net/relay.html. Никаких регистраций не нужно, просто введите адрес сервера (smtp.mail.ru
, к примеру) в поле Address to test: и нажмите "Test for relay". Всё показывает как на ладони.
гостевая; E-mail |