Функция отправки почты php

Самый простой способ отправить письмо при помощи PHP – воспользоваться стандартной функцией mail. Она имеет следующий синтаксис:

bool mail ( string to, string subject, string message [, string additional_headers [, string additional_parameters]])

  • E-mail получателя
  • Заголовок письма
  • Текст письма
  • Дополнительные заголовки письма
  • Дополнительные параметры командной строки
  • true, если письмо было принято к доставке
  • false, в противном случае.

Простейший пример ее использования выглядит так:

( "joecool@example.com" , "My Subject" , "Line 1
Line 2
Line 3" );
?>

Если у Вас на экране появилась ошибка "Fatal error: Call to undefined function: mail()", это значит, что либо PHP собран без поддержки функции mail, либо она запрещена настройками сервера. Такая практика в последнее время широко распространена на бесплатных хостинговых серверах. Если Вы столкнулись с такой проблемой, воспользуйтесь возможностью отправки писем при помощи сокетов (sockets), детально описанной в разделе "альтернативные способы отправки писем". В случае, если Вы администратор системы, обратитесь к разделу "Как настроить сервер" и попробуйте устранить эту проблему как таковую.

Дополнительные заголовки письма (additional headers) могут использоваться для указания кодировки письма, адреса отправителя, обратного адреса и множества других опций. Они должны быть разделены переводом строк: комбинацией "
". Например, так:

( "nobody@example.com" , "the subject" , $message ,
"From: webmaster@ example.com
"
. "X-Mailer: PHP/" . phpversion ());
?>

Перейдем к более сложному примеру. Предыдущие скрипты работали с форматом text/plain, теперь же попробуем отправить почту в формате HTML нескольким адресатам с указанием кодировки:

= "Mary , " ;
$to .= "Kelly " ;

$subject = "Birthday Reminders for August" ;

$message = ‘

Birthday Reminders for August

Обычно я пишу вступление о том, почему данная тема так важна для изучения. Но не в этот раз, потому что здесь, уверен, ни у одного человека не возникнет вопрос: "Зачем отправлять 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) и дальше уже радоваться жизни.

Читайте также:  Dhcp соединение что это

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

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

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

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

Также сообщения можно отправлять в HTML-формате. Для этого достаточно всего лишь заменить "text/plain" на "text/html". И Вы сможете в сообщении использовать HTML-теги. Только не забывайте, что всякие теги, наподобие: "

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 20 ):

    А как сделать автоматическое сообщение вот такие сообщения например это "вместо_этого_текста_приклепленный_фаил Вот файл который вы заказали с вместо_этого_текста_название_сайта. Если вы не заказывали данный файл просто игнорируйте это сообщение." или "вместо_этого_текста_имя_пользователя на ваш комментарий ответили!"?

    Для этого надо делать шаблон письма, например, такой: "%user% на Ваш комментарий ответили". Затем через PHP перед отправкой надо заменить с помощью функции str_replace %user% на конкретное имя пользователя.

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

    Это надо сделать в цикле. Если же пользователей много, то здесь всё гораздо сложнее, так как сервер может не выдержать. Для отправки письма большому количеству пользователей нужно запускать скрипт много раз, каждый раз отправляя небольшие партии. Например, при первом запуске отправить 20 писем. При втором ещё 20, при третьем ещё 20 и так далее, пока не будут отправлены все письма. Интервал надо делать хотя бы 30 секунд.

    Читайте также:  Mikrotik bridge vlan filtering

    А если написать
    Content-type: text/html; charset=windows-1251
    "; mail ($to, $subject, $message, $headers); ?> то письмо отправится на почтовые ящики 1, 2, 3? И как сделать такое уведомление автоматическое, например пользователь отправил письмо на форум, и ему на почтовый ящик такое письмо "Вы отправили новое сообщение на форум вместо_этого_текста_название_сайта"?

    Да, письмо дойдёт до всех трёх ящиков. Однако, минус данного способа: каждый из получателей увидит адреса других получателей. Сделать уведомление автоматическим элементарно. Например, при добавлении нового сообщения на форум, надо вызвать функцию mail(). Тогда сразу же придёт уведомление.

    Спасибо, а как сделать каждый из получателей не видел адрес других получателей? Или можете сказать как Вы делали такие уведомления?

    Надо через цикл (например, for) по очереди вызывать функцию mail, каждый раз отправляя одному получателю.

    Михаил, очень нужна ваша помощь. на моём тестовом хостинге не работает функция "mail", но там можно через сторонний SMTP сервер. Расскажите как им пользоваться,и как его настроить. Прошу расскажите мне или напишите статью. Оооочень надо

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

    извините за нелепый вопрос: а как на этот скрипт попадает пользователь? ведь РНР "сидит" и работает на сервере. и можно ли каким то образом РНР-скрипты вставлять в HTML страницы.

    Пользователь к нему обращается, отправляя запрос. В HTML-страницах нельзя использовать PHP, но в PHP-коде можно использовать HTML.

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

    Работающий php-скрипт для отправки письма с помощью функции mail()

    Как обычно, сперва приведу код программы на php, а потом объясню: как и что работает.

    Форма для получения данных, которые нужно отправить по электронной почте

    Первые 10 строк кода, приведённого выше — это HTML-форма, в которую вводим email, куда будем отправлять письмо, тему письма и собственно сам текст письма. Это поля с именами to , subject и message .

    Ниже идёт php-код, обрабатывающий полученные данные из этой формы и, если все поля заполнены, пытается отправить письмо на указанный адрес электронной почты.

    PHP функция mail()

    Перед тем, как рассматривать код, разберёмся вкратце с php-функций mail() , которая присутствует во всех версиях php и имеет следующий формат:

    • в первой строковой переменной $to должен содержаться получатель или список получателей письма в формате, описанном в RFC 2822, например,
    • Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
    • Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. , Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
    • User Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >
    • User Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >, Another User Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. >
    Читайте также:  Сколько цветов в палитре rgb
  • во второй строковой переменной $subject может быть указана тема письма. (Тема должна соответствовать RFC 2047 , но не будем углубляться.)
  • в третьей строковой переменной $message может находиться тело письма (собственно сообщение). Каждая строка должна быть отделена символом CRLF (
    ). Строки не должны быть длиннее 70 символов.
  • в четвертой переменной $additional_headers могут находиться дополнительные заголовки, влияющие на то, как к этому письму отнесётся почтовый сервер получателя и его программа, которой он будет читать это сообщение. Обычно используется для добавления дополнительных заголовков ( From , Cc и Bcc ). Несколько дополнительных заголовков должны быть разделены CRLF (
    ). Если в эту переменную передан массив, то его ключи будут именами заголовка, а значения значениями. Так как последнее время спамеры в конец расшалились, то заголовок From стал обязательным (хотя, это конечно не спасает от спама — в это поле можно подставить абсолютно любой адрес).
  • Это если вкратце.

    Стоит ещё обратить внимание на то, какие значения возвращает функция mail() : возвращает TRUE , если письмо было принято для передачи, иначе FALSE . Так можно отслеживать, что что-то пошло не так при попытке отправить сообщение на электронную почту.

    Дополнительные заголовки функции mail() для того, чтобы письмо сразу не попадало в спам

    Вернёмся к нашему коду. В строчках 13..14 в переменную $headers мы как раз записываем три заголовка:

    • From — адрес отправителя (можно подставить какое угодно мыло, но лучше своё) =)
    • Reply-To — адрес, который подставится почтовой программой при попытке получателя ответить на это сообщение.
    • X-Mailer — поможет для того, чтобы отследить, кто (какая программа) отправила письмо. Бывает полезно для отлова и отстрела спамеров.

    Отправка письма функцией mail() с предварительной проверкой полей перед отправкой

    В 16-й строке проверяем, что все поля заполнены. Более полную проверку на соответствие всем требованиям RFM всех заголовков пока писать лень. Кому интересно, могут почитать про валидацию электронной почты (email) из данных формы на стороне сервера с помощью php в → этой статье.

    В 17-й строке запускаем функцию mail() и. письмо полетело.

    • если полёт нормальный, в 18-й строке выводим зелёное сообщение о том, что всё хорошо;
    • если при попытке передать письмо возникли проблемы: функция mail() вернула значение FALSE , сообщаем об этом.

    Резюме

    Таким образом можно достаточно легко и быстро отправлять сообщения с помощью php-функции mail() , подписываясь Санта Клаусом, Кукусклановцем или Биллом Гейтсом. Но, надеюсь, что прочитав эту статью, никто не решил стать ещё одним рассыльным почтового спама. Для этого нужно знать немного больше. 😉

    Но этих сведений будет достаточно, чтобы отправить письмо с сайта пользователю со ссылкой подтверждения регистрации. Что и требовалось. =D