Отправка почты на PHP, скрипт рассылки


Создание скрипта для рассылки писем

При желании в сети интернет можно найти достаточно большое количество сервисов для рассылки писем.

Скрипт рассылки на PHPНо, у всего бесплатного, как всем известно, имеются свои ньюансы! 😉В общем на днях передо мной нарисовалась задача уведомить деловых партнеров о поступлении новинок нового товара на склад по электронной почте.

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

Поэтому не очень долго размышляя, я решил этот процесс немного автоматизировать, вспомнив слова одного мультяшного персонажа:

Лучше день потерять,  за то потом за пять минут долететь!

 

В данном случае получилось немного с утрировано, на создание скрипта для рассылки писем у меня ушло порядка 20 минут, но сути дела это не меняет.

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

Функция mail в PHP

Для отправки электронной почты в PHP существует функция mail(); которая имеет следующий вид:

boolean mail ( string $to , string $subject , string $body [extra]);

 

Первые три параметра являются обязательными.

$to — адрес электронной почты получателя письма

$subject —  тема письма

$body — текст сообщения

Дополнительные свойства указываются в четвертом параметре.

Опасный параметр функции mail();

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

В четвертом параметре передаются дополнительные заголовки письма (From, Cc, and Bcc). Дополнительные свойства в последнем параметре разделяются символами конца строки и перевода коретки \r\n (CR и LF).

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

Отправка фэйка вконтакте

В статье о безопасности аккаунта ВК, я писал о том, что одним из вероятных способов взлома страницы вконтакте, является переадресация  пользователя аккаунта на фейковую страницу.

Одним из примеров убедительной переадресации, может служить письмо отправленное администрацией контакта о смене пароля или других настроек аккаунта.

Для того, чтобы добавить ссылку в тело письма, достаточно изменить параметр Content-type:text/plain на Content-type:text/html

После этого в тексте сообщения можно передавать html код.

Подделка письма вконтакте

А т. к. многие почтовые сервисы не могут идентифицировать отправителя письма, то вся получаемая ими почта воспринимается за чистую монету. Это всего лишь банальный пример некорректного использования функции mail() в PHP, но на самом деле поле для маневра достаточно широкое и его границы, упираются только в фантазию разработчика. 🙂

Особенности отправки почты в PHP

Стоит обратить внимание на то, что если список получателей рассылки будет очень большой (несколько сотен адресов) то скрипт рассылки может не уложиться в 30 секунд. Это максимальный временной период отведенный на выполнение сценарию по умолчанию, а как итог скрипт уходит в fatal error и его работа прекращается.

Поэтому, если число получателей рассылки приближается к 1000 эквиваленту, то рекомендуется увеличить время для выполнения конкретного сценария с помощью функции set_time_limit(); которой в качестве параметра передается новое значение таймаута в секундах для конкретного сценария.

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

Существуют определенные трудности с кодировкой при отправке писем на mail.ru, а именно, если кодировка скрипта и письма не windows-1251 то в отличии от Яндекс и Gmail, в папке входящие mail.ru появляется абра-кадабра вместо текста сообщения. Правда после открытия письма текст отображается корректно.

Пример скрипта для отправки почты на PHP

В сети интернет есть определенные рекомендации по решению вопроса с кодировкой писем отправляемых с помощью PHP на mail.ru и rambler, но я решил пойти другим путем. 🙂

Благо у меня есть немного свободного места на одном сервере который поддерживает кодировку  Windows-1251 (Cyrillic)

Поэтому для корректной отправки почты с помощью PHP скрипта на mail.ru, можно сохранить сценарий в кодировке ANSI, закодировать письмо в  Windows-1251 и отправлять с сервера, который поддерживает эту кодировку.

Правда, справедливости ради, дома я немного переписал скрипт рассылки, после чего закодировал PHP сценарий и заголовки отправляемой почты в Utf-8. Кодировка сервера с которого отправлялась почта тоже Utf-8. В результате все три почтовых сервера приняли корректную корреспонденцию, т. е. почту. 🙂

В общем я не стал особо заморачиваться функционалом и дополнительными проверками, поэтому в моем случае скрипт рассылки получился очень простой. Вот его исходник с комментариями.

<?php
$text = trim($_POST['text']);
//проверяем. чтобы все поля были заполнены
if (isset($_POST[text]))
{
if (empty($text))
{
echo 'Вы не ввели <font color=red>текст письма</font>';
}
elseif ($_POST[subject]=='')
{
echo 'Не заполнено поле <font color=red>тема письма</font>';
}
else
{
$to=array('первый@mail.ru','второй@gmail.com', 'третий@yandex.ru');
//емайл получателей
$subject = $_POST[subject];
//тема письма
$message = $text;
//текст сообщения
$mailheaders = "Content-type:text/plain; charset=utf-8\r\n";
//формат письма и кодировка
$mailheaders .= "From: test <test@mail.ru>\r\n";
$mailheaders .= "Reply-To: test@mail.ru\r\n";
//емайл отправителя и емайл для ответа
foreach($to as $mail){
$res=mail($mail, $subject, $message, $mailheaders);
if($res) {
echo $mail'  &nbsp;  '  .  ' Ok!<br />';
} else {
echo 'Что-то пошло не так..<br />';
}
}
}
}
?>
<form name="product" action="mail.php" method="post">
//форма для ввода и отправки сообщений
<tr>
<td> <p><font color=#D70000> * </font> Title:</p> </td>
<td><input name="subject" value="<?php echo $subject; ?>" size="75"></td>
</tr>
<tr>
<td><p><font color=#D70000> * </font> Text:</p> </td>
<td><textarea cols="56" name="text" rows="10" wrap="virtual">
<?php  $_POST[text]=''; ?></textarea></td>
</tr>
<p><input type="submit" value="Start" style="width:110px;" id="submit"/></p>
</form>

 

Конечно, если создавать скрипт для полноценной рассылки на несколько сотен адресов, то данные лучше сохранять в мускуле БД MySQL, чтобы пользователь имел возможность создавать новые почтовые ящики и удалять старые. Но для решения моей задачи функционала скрипта вполне достаточно, поэтому при желании вы можете доработать PHP сценарий самостоятельно.

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

P.S. Как вы поняли из статьи, подделать заголовок отправителя почты не так уж и сложно. Поэтому вывод напрашивается очевидный: никогда не нужно переходить по почтовым ссылкам, даже если письмо пришло от вашего знакомого, и помнить, что безопасности много не бывает!