Андрей Смирнов
Время чтения: ~16 мин.
Просмотров: 30

Настройка PHP mail – отправка почты скриптом — Помощь

php-email.jpg

Обычно я пишу вступление о том, почему данная тема так важна для изучения. Но не в этот раз, потому что здесь, уверен, ни у одного человека не возникнет вопрос: «Зачем отправлять e-mail в PHP?». Поэтому предлагаю сразу приступить к делу и узнать об этом более подробно, тем более, что проще реализации отправки e-mail через PHP и придумать нельзя, так что поймут даже те, кто не знаком с PHP вообще.

Для начала давайте с Вами разберёмся немного с теорией. Скучно, но поверьте важно. Для отправки e-mail необходим SMTP-сервер. На большинстве платных хостингах он обязательно имеется. Однако, если такой возможности нет (допустим, хостинг бесплатный или очень дешёвый), то тогда можно воспользоваться сторонним SMTP-сервером (например, mail.ru). То есть главное: для отправки необходим SMTP-сервер.

Во-вторых, чтобы принимать e-mail необходим POP-сервер. К чему я всё это говорю. А к тому, что очень часто люди спрашивают на форумах: «Почему у меня не работает отправка e-mail в PHP?«. А при этом люди пытаются отправить письма с сервера, на котором вообще нет SMTP. Очень важно: PHP e-mail не отправляет! Отправляет e-mail приложение sendmail, которое имеется на операционных системах Unix, на которых и стоят большинство серверов. А PHP просто передаёт команды этому приложению. Надеюсь, объяснил понятно. Поэтому первое, что необходимо сделать — это раздобыть приложение sendmail. Но порадую тех, кто пользуется пакетом Denwer, так как у них это приложение уже встроено. Правда, с одной особенностью. Реальной отправки писем не происходит — они все складываются в директорию «tmp/!sendmail«. Но если письмо, которое Вы отправили в PHP, там оказалось, то можете быть уверены, что на 99% на реальном хостинге всё будет работать. Хотя, если Вам очень хочется по-настоящему отправлять e-mail, то Вы можете скачать sendmail, настроить его на какой-нибудь SMTP-сервер, например, mail.ru, затем изменить путь к sendmail в php.ini (настройки PHP) и дальше уже радоваться жизни.

А теперь переходим к PHP. Для отправки e-mail используется всего одна функция — mail(). Принимает эта функция четыре параметра, три из которых являются обязательными:

  $to = "abc@gmail.com";  $subject = "Robot - Робот";  $message = "Message, сообщение!";  mail ($to, $subject, $message);

Как видите, всё интуитивно понятно: кому отправлять, какая тема и само сообщение. Если Вы используете пакет Denwer, то после запуска скрипта, Вы сможете найти файл в директории «tmp/!sendmail«, в котором и содержатся данные Вашего письма. Открыть эти файлы можно либо в блокноте, но лучше открыть их в какой-нибудь почтовой программе (например, The Bat или Microsoft Outlook).

Я не даром написал вперемешку русский и английский текст, чтобы проверить кодировку. Очень часто она распознаётся неправильно, и в результате, пользователи видят «абракадабру«. Чтобы этого избежать необходимо задать кодировку. И как раз для кодировки, а также для других особых параметров и существует четвёртый аргумент функции mail():

  $to = "abc@gmail.com";  $subject = "Robot - Робот";  $message = "Message,n сообщение!";  $headers = "From: MyRusakov.ru rnContent-type: text/plain; charset=windows-1251 rn";  mail ($to, $subject, $message, $headers);

Теперь давайте расшифрую то, что здесь написано. В переменной headers мы задали следующие параметры: в поле «От кого» будет стоять «abc@gmail.com» (то есть сообщения можно отправлять далеко не от своего имени). Сообщение также является обычным текстовым (text/plain) в кириллической кодировке (windows-1251), то есть в нашей с Вами родной кодировке, в которой имеется русский язык и английский. И, кстати, «n» — это переход на новую строку (аналог в HTML).

Также сообщения можно отправлять в HTML-формате. Для этого достаточно всего лишь заменить «text/plain» на «text/html«. И Вы сможете в сообщении использовать HTML-теги. Только не забывайте, что всякие теги, наподобие: «», «» и другие, — фильтруются любой уважающей себя почтовой системой. Однако, использовать теги оформления («», «», «» и другие) Вы можете. И давайте, напоследок, отправим e-mail с использованием HTML-тегов:

  $to = "abc@gmail.com";  $subject = "Robot - Робот";  $message = "Hello World!Это письмо отправлено роботом   и отвечать на него не нужно!";  $headers = "From: MyRusakov.ru rnContent-type: text/html; charset=windows-1251 rn";  mail ($to, $subject, $message, $headers);

Вот и всё. Как видите, тема очень простая, а отправлять e-mail в PHP очень важно уметь.

До скорых встреч.

  • date_article.png Создано 23.11.2010 12:36:00
  • icon_user.png Михаил Русаков

Вступление

Функция PHP mail() предназначена для отправки электронной почты средствами PHP, иными словами – отправка email PHP. Это удобно, если вы хотите создать форму контактов на вашем сайте. С функцией PHP mail() электронные письма или email могут быть отправлены при помощи простого PHP-скрипта. В этом руководстве вы узнаете, как производится отправка email PHP и протестируете функцию PHP mail().

Что понадобится

Прежде, чем приступить к действиям из руководства, проверьте наличие:

  • Доступ к вашему хостинг аккаунту
  • Включённая функция PHP mail()

Шаг 1 – Создание нового файла PHP

Первым делом, нужно создать PHP-файл на вашем хостинг аккаунте. Ваш PHP-файл должен быть доступен по имени домена, следовательно, его нужно разместить в директории public_html. Для создания файла можете использовать File Manager или FTP client. Назовите свой файл testmail.php.

testmail.png

Шаг 2 –  Редактирование PHP-файла

Теперь разместите следующий код внутри файла testmail.php:

     ini_set( 'display_errors', 1 );      error_reporting( E_ALL );      $from = "testing@yourdomain";      $to = "recipientemailaddress";      $subject = "Checking PHP mail";      $message = "PHP mail works just fine";      $headers = "From:" . $from;      mail($to,$subject,$message, $headers);      echo "The email message was sent."; 
  • Первые две строки включают сообщения об ошибках, таким образом вы сможете увидеть, если скрипт содержит ошибки и не запускается.
  • $from – адрес отправителя email-а. Многие хостинг-провайдеры не разрешают использовать случайный email-адрес, поэтому вам нужно ввести email-адрес, созданный для вашего доменного имени в этом поле для успешной авторизации и отправки писем.
  • $to – адрес получателя email-а. Если вы отправляете email для проверики, то здесь должен быть ваш собственный email адрес.
  • $subject – тема электронного письма.
  • $message – содержимое сообщения email-а.
  • $headers – у каждого email-а есть заголовки. Они содержат важную информацию, такую как От (From) email-адрес.
  • mail($to,$subject,$message, $headers) – это функция PHP, которая выполняет отправку писем. Ничего не изменяйте в этой строке.
  • echo “Ваше email сообщение успешно отправлено.” – PHP функция echo отобразит сообщение на экране, как только скрипт успешно отработает.

Шаг 3 – Запуск скрипта и отправка email PHP

Если (как это рекомендовалось выше) вы разместили PHP-скрипт в директории public_html, вы можете запустить скрипт путем доступа по адресу yourdomainname/testmail.php. Если вы видите сообщение Ваше email сообщение успешно отправлено. в вашем браузере – это значит, что email отправлен успешно и вы можете проверит его во входящих письмах вашей электронной почты (не забудьте проверить папки SPAM/JUNK).

Если вы получили какую либо ошибку, проверьте все ли детали вы заполнили правильно. Если ошибка не появилась в барузере, вы можете проверить файл error_log в вашем аккаунте. Если вы не уверенны в том, как проверять этот файл посмотрите руководство по ссылке error logs.

Заключение

Теперь вы знаете как происходит отправка email PHP. Хотя это руководство предназначено для тестирования, такой же синтаксис можно использовать для разработки контактной формы на вашем сайте. Однако, если вам понадобится более сложная отправка email PHP, то скрипты для этого можно поискать здесь: PHPMailer project. В проекте есть встроенная поддержка SMTP, обширный error_logs на 47 языках и много других полезных функций.

В этом топике вы узнаете, как грамотно настроить, сервер исходящей почты и в частности функцию mail() в PHP. Сам являюсь жутким педантом. Люблю, что бы везде было все на своих местах, не терплю халтуры. Увидев один раз полную чушь в заголовках письма со своего сервера я разобрался с этим кардинально и безоговорочно. Под грамотной настройкой я подразумеваю такую, которая удовлетворяет потребности спам фильтров крупных почтовых систем, и просто выглядело красиво и осмысленно.a825016230806e86a2ca38756a4d0f64.jpg Как известно протокол SMTP не подразумевает никаких средств защиты от спама и аутентификации пользователя, поэтому крупными и не очень компаниями были придуманы «фиксы» безопасности протокола. Если вы устанавливаете выделенный сервер с доменом размещенным на нем, очень рекомендуется выполнить данные настройки, что бы все было как надо. На изучение этого вопроса я потратил немало времени, разобравшись в каждом заголовке. Начал с базовой настройки из пакетов, при этом из предоставляемых пакетов выбрал, то что понравилось, а закончил тонким феншуем, который я так до конца не воплотил, ибо это уже было совсем изыск. Название заголовка выбрал именно такое, так как вначале своего пути я искал что-то вроде этого. Настраивать будем postfix, php, dns (ptr, spf), и другое. Эта статья будет интересная людям, настраивающим выделеные сервера, но не менее интересна для обычных программистов. Подробности под катом

Преамбула

Кто-то пользуется либами, которые заменяют функцию mail (например phpmailer), они могут общаться с SMTP напрямую, а могут отправлять и на локальный сервер. Но лучше использовать стандартную встроенную и настроенную функцию PHP mail() которая будет отправлять почту на локальный сервер исходящей почты, который в свою очередь будет с ней сам разбираться. При использовании данной функции тормозов всегда наименьшее количество, так как локальный почтовый агент быстро принимает либо отклоняет почту, а если принимает, то доставляет самостоятельно. Статья отформатирована не самым лучшим образом. Извиняюсь, время поджимает, а рассказать хочется пока вспомнил, а то потом не времени будет.

Чем проверять нашу работу?

Тестируем вот этим методом

$result = mail('yourmail@domain.ru', 'subject', 'message');  if($result) { echo 'все путем'; } else { echo 'что-то не так'; } 

Мы будем очень много читать заголовки писем. Просматривать заголовки очень удобно в gmail, там есть такая фишка в 2 клика, сами найдете.

Каких целей в заголовках нам требуется достичь?

— Вот этих заголовков от gmail.com Прошу заметить, что это заголовки с которыми письмо попадает в ящик конечного пользователя

 Delivered-To: YOURMAIL@DOMAIN.DOM Received: by 10.182.0.137 with SMTP id 9cs9033obe;         Sat, 21 Jan 2012 13:25:09 -0800 (PST) Received: by 10.205.119.199 with SMTP id fv7mr1052469bkc.113.1327181107295;         Sat, 21 Jan 2012 13:25:07 -0800 (PST) Return-Path:  Received: from wartur.ru (wartur.ru. [188.134.79.140])         by mx.google.com with ESMTP id ua10si4066845bkb.110.2012.01.21.13.25.06;         Sat, 21 Jan 2012 13:25:07 -0800 (PST) Received-SPF: pass (google.com: domain of no-reply@wartur.ru designates 188.134.79.140 as permitted sender) client-ip=188.134.79.140; Authentication-Results: mx.google.com; spf=pass (google.com: domain of no-reply@wartur.ru designates 188.134.79.140 as permitted sender) smtp.mail=no-reply@wartur.ru Received: by wartur.ru (Postfix, from userid 1002) id 9913B61D; Sun, 22 Jan 2012 01:24:55 +0400 (MSK) To: YOURMAIL@DOMAIN.DOM Subject: subject X-PHP-Originating-Script: 1002:index.php Message-Id: <201B61D@wartur.ru> Date: Sun, 22 Jan 2012 01:24:55 +0400 (MSK) From: no-reply@wartur.ru 

— А так же этих заголовков от mail.ru

 Return-path:  Received-SPF: pass (mx64.mail.ru: domain of wartur.ru designates 188.134.79.140 as permitted sender) client-ip=188.134.79.140; envelope-from=no-reply@wartur.ru; helo=wartur.ru; Received: from [188.134.79.140] (port=64667 helo=wartur.ru) by mx64.mail.ru with esmtp (envelope-from ) id 1RoiQJ-0005E9-6r for wartur@list.ru; Sun, 22 Jan 2012 01:24:31 +0400 X-Mru-BL: 0:0:0:0 X-Mru-PTR: wartur.ru X-Mru-NR: 1 X-Mru-OF: Linux (ethernet/modem) X-Mru-RC: RU Received: by wartur.ru (Postfix, from userid 1002) id 460BC9B7; Sun, 22 Jan 2012 01:24:20 +0400 (MSK) To: wartur@list.ru Subject: subject X-PHP-Originating-Script: 1002:index.php Message-Id: <20120121212420.460BC9B7@warn, 22 Jan 2012 01:24:20 +0400 (MSK) From: no-reply@wartur.ru X-Spam: Not detected X-Mras: Ok X-Mru-Authenticated-Sender: uid:1002@wartur.ru 

Когда вы только начнете, вы увидите, что таких красивых заголовков у вас нет. Принимающий сервер почты будет считать вас каким-то чучмеком, об этом и будет писать в заголовке письма с предупреждением, что вот еще чуть чуть и он тебя точно в блек-лист поставит. Вся информация в заголовке используются всеми цепочками серверов и принимающий агент для того что бы в зависимости от настроек спам фильтра отклонить письмо или принять. Самые драконовые методы это блек-листы, а мягкие определяют плохих по заголовкам и жалобам. Так же замечаю, если установить в функции mail() 4-й параметр и поставить туда заголовок From то и заголовок From: no-reply@wartur.ru тоже изменится, а если не задавать, то оно будет автоматически определяться таким же как и заголовок Return-path: , что вы можете видеть у меня в заголовках. Очень удобна такая схема: отправка идет через сервер с измененным заголовком From, а прием на gmail (через службы домена). Желательно, что бы почта тоже принадлежала к тому же домену, для которого настроен сервер, а так же выполнены некоторые пункты указанные ниже.

Приступим

— Совет Господа, я люблю ставить все пакетами и новичкам не советую заниматься самодеятельностью, во многих пакетах уже есть скрипты автоматической настройки, результаты которых надо только чутка подправить и все будет хорошо. Кроме того, из репозиториев оно само обновляется и вообще меньше запары просто потому что её меньше. — Настройка PHP Ставим как хотим php, это вы как-нибудь без меня. Идем в настройки php, заменяем эквивалентно:

 sendmail_path = /usr/sbin/sendmail -t -i -fno-reply@wartur.ru 

Этим мы указали заголовок Return-Path: Кстати 1: это будет таковым для всех виртуальных доменов сервера, что бы это исправить и настроить под текущий, то требуется передать 5-й параметр в функцию mail().

$result = mail('YOURMAIL@DOMAIN.DOM', 'subject', 'message', 'From ...', '-fno-reply@yourdomine.ru'); 

Кстати 2: если вы поставите 5-й параметр на обычном виртуальном хостинге, то вам тоже рекомендуется проводить настройку вашего домена, как это описано ниже. Обращаю внимание, что операцию с PTR записями сделать невозможно, так как 1 IP = Домен, ну или по крайней мере не рекомендуется делать их 2, не помню уже. — Настройка MTA, он же локальный сервер исходящей почты Я вам искренне советую postfix, далее идем в настройки /etc/postfix/main.cf для тех, кто уже нарвался на sendmail, и понял как они трудно выпиливаются из системы, советую команду:

aptitude purge sendmail 

Далее, делаем эквивалетно вот так myhostname = wartur.ru #smtp_helo_name = k-wartur.wartur.ru mydestination = _ALL_, wartur.ru, k-wartur.wartur.ru, localhost.wartur.ru, localhost (k-wartur.wartur.ru — это мой сервер в домене wartur.ru) — Если я не ошибаюсь, это помогло. Когда агент доставки представляется другому серверу передается HELO. Поменяете myhostname, поменяется следующий заголовок: Message-Id: <20120121212420.460BC9B7@wartur.ru> name по дефолту это myhostname, читаем матчасть — mydestination — если я не ошибаюсь, это задает те домены с которых MTA будет принимать почту на обработку, если у вас виртуальный хостинг (что я устроил на сервере дома), то без _ALL_ у вас будут проблемы с отправкой почты с других доменов кроме указанных.Ну вот, видите, заголовки уже намного правильнее не так ли, а то ужас поначалу был. — Разборки с почтовыми сервисами (почтовики) А они нас считают как недобрый источник. Наш сервер смог правильно helo представиться, но вот только почтовики нам все равно не доверяют. Для этого были придуман алгоритм, для того что бы владелец домена с помощью DNS (если он конечно грамотный как мы) мог указывать, что вот таким-то серверам можно доверять, а другим нельзя. У вас вместо ужаса который сейчас должно получиться вот это:

 Received-SPF: pass (google.com: domain of no-reply@wartur.ru designates 188.134.79.140 as permitted sender) client-ip=188.134.79.140; Received-SPF: pass (mx64.mail.ru: domain of wartur.ru designates 188.134.79.140 as permitted sender) client-ip=188.134.79.140; envelope-from=no-reply@wartur.ru; helo=wartur.ru; 

Мы уже на пути к истине. К слову, по умолчанию, почтовик все считает как v=spf1 ~all, что понижает уровень порога входа в блек лист, и а так же можно пользоваться вашим доменом для отправки спама, и вас сами того не знали пометят как плохиша на будущие времена. Идем в ДНС и создаем TXT запись в вашем домене, в моем случае wartur.ru v=spf1 +mx +a:wartur.ru +a:k-wartur.wartur.ru +include:gmail.com -all v=spf1 это означает, что версия алгоритма spf1 +mx Можно доверять почте если она отправлена с серверов mx, например если mx.wartur.ru это сервер приема, то если этот сервер будет отправлять, то все будет хорошо. +a:wartur.ru Можно доверять серверу, обслуживающий домен wartur.ru так же добавлю, например на моем почтовом сервере разместился pupkin.ru. Я дал Пупкину погонять мой почтовый сервер исходящей почты k-wartur.wartur.ru (обычная ситуация виртуального хостинга, он всегда стоит локально, как бд, и все все все). Тогда он у себя должен настроить +a:k-wartur.wartur.ru +include:gmail.com Импортируем все правила gmail.com, у них тоже есть такая запись TXT для своих серверов. (я использую сервисы google для домена) -all Указываем, что админ считает другие места не своими, и это может быть ближайший бордель в подворотне рассылающий спам от моего имени (+all а это означает, что весь мир мои друзья) Матчасть для самообученияhttp://ru.wikipedia.org/wiki/Sender_Policy_Framework — Разборки с почтовыми сервисами, настройка обратной PTR Почтовики еще спрашивают обратные доменные зоны PTR для дополнительной галочки, думаю эта галочка одна из самых жирных, так как она 100% определяет сервер, и если он ведет себя правильно, то ему очень сильно доверяют и любое письмо наверняка дойдет до адресата. X-Mru-PTR: wartur.ru, он же есть в google наврное это Received: from wartur.ru (wartur.ru. [188.134.79.140])Заметка: В виртуальном хостинге вам это сделать не дадут, у них на этот адрес замапин свой сервер, какой-нибудь servername.badhosting.ru, на котором вы и размещаетесь, да и вообще только на собственном серваке с собственным IP это возможно провернуть. Интересно: Если вы живете дома, а у меня один из серверов стоит дома, в частности wartur.ru. Что делать? вроде IP выделенный, а обратный адрес, не настроить. Я позвонил выше (к провайдеру) сказал мол так и так хочу PTR зону. Мне её сделали, очень доволен.

Еще немного слов о заголовках (все вперемешку)

X-Mru-BL: 0:0:0:0 упаси вас иметь что-нибудь кроме нолей, это блеклисты. X-Mru-OF: интерфейс с которого посылается, я так и не понял от чего это зависит. X-PHP-Originating-Script: — я бы советовал добавлять, хотя если вы очень печетесь о безопасности и неразглашении, то можно и запретить. Делается это неподалеку от той настройки PHP которой мы делали. По умолчанию включено. Еще можно и интересно посмотреть что пишет Яндекс при приеме, очень интересно.

Дополнительно

Там еще какие-то цифровые подписи есть. определяется заголовком, DKIM-Signature С виду у меня уже было все в порядке, а этот заголовок не очень нужен. Он нужен обычно сервисом очень крупного масштаба вроде facebook или google где рассылка уведомлений и почты идет в гигатонном масштабе. Если ваш сервис не обладает миллионами пользователей, то не думайте об этом, хотя если вы изыскатель — напишите как об этом здесь и мы свяжем статьи — что бы все казалось полностью законченным, только я прошу намного проще написать, так как уже где-то видел статьи про это все. От себя добавлю что мне было лень устанавливать еще один пакет, разбираться и еще что-нить. Материала к сожалению нет, так как по крупицам отовсюду собирал 4 месяца назад, потом меня не было времени, а теперь я написал по памяти. Удачной грамотной настройки вашего сервера. Я попробовал объяснить хотя бы один из нескольких аспектов настройки.UPD: Найден интересный пруф по теме: http://forum.ixbt.com/topic.cgi?id=7:26978 Так же интересно прочитать:http://habrahabr.ru/blogs/sysadm/114852/UPD2: 2012.08.02 Классная статья как раз по теме!http://habrahabr.ru/post/141534/UPD3: 2013.04.04 Понадеявшийся на сознательность/внимательность людей, я поставил труадреса, для того, то вы Вы увидели реальную картину и их сменили. Мне не однократно приходили на почту сообщения с бессмысленным содержанием, поэтому я изменил адрес на YOURMAIL@DOMAIN.DOMИспользуемые источники:

  • https://myrusakov.ru/email-php.html
  • https://www.hostinger.ru/rukovodstva/kak-nastroit-pochtu-otpravka-email-php/
  • https://habr.com/post/136735/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации