Блог студии веб-дизайна «Make a Site» Дизайн, верстка, программирование, наполнение и раскрутка сайтов.

Отправка почты без SMTP. PHP функция отправки на основе mail()

Использование громоздких SMTP классов для отправки почтовых сообщений с небольшого сайта-визитки, насчитывающего от силы 3-4 страницы, напоминает пальбу из пушки по воробьям. Лучше будет воспользоваться функцией mail.

Отправка почты без SMTP. PHP функция отправки на основе mail()
Содержание статьи

Что такое SMTP

smtp-architectureSMTP – сетевой протокол, использующийся для отправки почты. Аббревиатура SMTP расшифровывается как Simple Mail Transfer Protocol и переводится дословно, как простой протокол передачи почты.

Этот протокол может использоваться как почтовыми серверами, так и отдельными приложениями, настроенными на совместную с ним работу. Поскольку в нашей статье речь идет об отправке почтовых сообщений с использованием движка сайта, написанного на языке программирования PHP (Hypertext Preprocessor), по большей части ориентированного на разработку веб-приложений, то мы будем рассматривать данный вопрос именно в этом контексте.

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

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

Вместе с этой необходимостью программист оказывается перед выбором между двумя основными способами отправки почты:

  • отправка с помощью SMTP-класса (например, PHPMailer);
  • использование встроенной функции mail.

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

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

Использование PHPMailer для отправки почты

phpmailerPHPMailer – самый популярный на сегодняшний день SMTP класс, позволяющий отправлять почтовые сообщения без особых проблем. Главным преимуществом этого класса является его универсальность и огромное количество настроек. Однако большие возможности и чрезмерная гибкость заставят вас порядочно повозиться, прежде чем PHPMailer заработает на вашем сервере.

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

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

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

Но если на подобные сайты устанавливать такие универсальные и обширные классы как PHPMailer, то это будет не очень то и логично – все равно что поставить ракетный двигатель на велосипед и радоваться его крутости.

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

Многие системы администрирования и так имеют встроенные классы, позволяющие отправлять сообщения посредством SMTP, а если сайт статичный и состоит из 3 страниц, то этот класс и вовсе не нужен.

Отправка почты при помощи PHP-функции mail

В большинстве случаев можно обойтись встроенной в PHP функцией mail. Просто необходимо ее немного доработать и не использовать в сыром виде.

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

Мы долго бились с этой проблемой, перепробовали огромное количество всевозможных вариантов, но постоянно находился какой-то косяк – во всех почтовых сервисах письма отображались отлично, но на iPhone они приходили в нечитаемой кодировке. Как только мы пытались поменять заголовки, ориентируясь на iPhone, появлялась проблема в каком-нибудь почтовом сервисе (чаще всего в Mail.Ru).

Это напоминало момент, когда вы находитесь на корабле, который имеет 3 пробоины в разных местах, из которых тонкой струйкой льется вода, а вы пытаетесь заткнуть все эти дырки одновременно, но у вас только две руки.

Примерно в 2005 году (уже более 10 лет назад) нам удалось нащупать прекрасный результат, который с тех пор ни разу не подводил. Функция, проверенная таким количеством лет выглядит надежной и с этим не поспоришь. Именно поэтому мы и решили ей сегодня поделиться.

function coolSendMail($target_email, $sender_name, $sender_email, $subject, $message, $template_mode, $document_root) {
	// template_mode = 1 - берем шаблон из файла. template_mode = 0 - не берем шаблон из файла
	
	$sender = '=?windows-1251?B?'.base64_encode(mb_convert_encoding($sender_name, "CP1251", "UTF-8")).'?=';
	$none_encoded_subject = $subject;
	$subject = "=?windows-1251?B?" . base64_encode(mb_convert_encoding($subject, "CP1251", "UTF-8")) . "?=";
	$mail_header = 'From: '.$sender_name.' <'.$sender_email.'>' . "\r\n";
	$mail_header .= 'Reply-To: '.$sender_email.'' . "\r\n";
	$mail_header .= 'MIME-Version: 1.0' . "\r\n";
	$mail_header .= 'Content-type: text/html; charset=windows-1251';
	
	if($template_mode == 1) {
		$filename = $document_root."/modules/mail-template/template.php"; $handle = fopen($filename, "r"); $contents = fread($handle, filesize($filename)); fclose($handle);
		$bad = array("%MAIL_TEMPLATE_TITLE%", "%MAIL_TEMPLATE_BODY%");
		$good = array($none_encoded_subject, $message);
		$contents = str_replace($bad, $good, $contents);
	}
	else {
		$contents = $message;
	}
	
	mail($target_email, "★ ".$subject, mb_convert_encoding($contents, "CP1251", "UTF-8"), $mail_header);
}

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

Шаблоном письма является обычный PHP файл, в котором заменяются некоторые важные переменные, например, %MAIL_TEMPLATE_TITLE% (тема письма) и %MAIL_TEMPLATE_BODY% (тело письма).

Какой вариант отправки выбрать

Как показывает практика, использование громоздких классов довольно часто оказывается нецелесообразным. Как мы уже говорили выше, многие популярные системы администрирования уже содержат встроенные SMTP-классы, позволяющие настроить отправку сообщений прямо в консоли администратора, не копаясь в кодах.

turbo-bikeСайты же, которые можно вообще сделать без системы администрирования (прежде всего для простоты, значительного увеличения скорости загрузки, облегчения сервера и т. д.) могут обойтись и уже встроенной в PHP функцией mail. Почему бы и нет? Ведь если доработать должным образом, она будет не менее надежной, чем все эти классы, использующие по 50 файлов.

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

А какой способ отправки почты использовать вам – зависит от конкретной ситуации.





Предыдущая статья:
Резиновая и адаптивная HTML верстка каталога товаров

Читайте также:
Планировщик заданий Cron – выполнение скриптов в назначенное время

Возможно, вам это интересно:



Блог студии веб-дизайна «Make a Site».
Дизайн, верстка, программирование, наполнение и раскрутка сайтов.

Текущий проект: «Stream Booster» — раскрутка Twitch и YouTube каналов

Студия веб-дизайна «Make a site»