Блог веб разработки

Блог веб-разработки статьи | видеообзоры | исходный код

Отправка почты средствами PHP через функцию mail

Здравствуйте друзья! Сегодня хочу поделится с вами php скриптом, который без особых проблем может отправлять письма на любую почту. Ранее я публиковал информацию об отправке писем через php.

"РАБОТА С ПОЧТОЙ PHP"

Там мы рассматривали отправку почты через функцию phpMailer, разбирались с ее установкой и настройкой. На самом деле если в вашем письме нет никаких дополнительных вложений(файлов, картинок), то все можно сделать намного проще. Лично я пользуюсь стандартной функцией php - mail(), так как это не требует установки дополнительных компонентов и их муторной настройки. И так, приступаем к рассмотрению!

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

Разберем что принимает в себя данная функция:

mail($to, $subject, $body, $headers);

$to - кому отправляется письмо (почта)

$subject - Тема письма

$body - текст письма

$headers - Заголовок письма

Чтобы письмо было отправлено, я использую две функции:

function send_mail(
          $n_from,    # имя отправителя
          $e_from,   # email отправителя
          $n_to,      # имя получателя
          $e_to,     # email получателя
          $charset, # кодировка переданных данных
          $charset2, # кодировка письма
          $theme,      # тема письма
          $text,         # текст письма
          $flag          # письмо в виде html или обычного текста
        ) {

        $to = header_encode($n_to, $charset, $charset2) . ' <' . $e_to . '>';
        $theme = header_encode($theme, $charset, $charset2);
        $from =  header_encode($n_from, $charset, $charset2) .' <' . $e_from . '>';

        if($charset != $charset2) {
          $text = iconv($charset, $charset2, $text);
        }

      $headers = "From: $from\r\n";
      $type = ($flag) ? 'html' : 'plain';
      $headers .= "Content-type: text/$type; charset=$charset2\r\n";
      $headers .= "Mime-Version: 1.0\r\n";

      return mail ($to, $theme, $text, $headers);
}

function header_encode($string, $charset, $charset2) {
  if($charset != $charset2) {
    $string = iconv($charset, $charset2, $string);
  }
  return '=?' . $charset2 . '?B?' . base64_encode($string) . '?=';
}

с помощью них вы сможете правильно сформировать общие заголовки письма и передать их в функцию mail().

Рассмотрим какие параметры передаются в функцию send_mail():

$n_from - имя отправителя

$e_from - email отправителя

$n_to - имя получателя

$e_to - email получателя

$charset - кодировка переданных данных

$charset2 - кодировка письма

$theme - тема письма

$text - текст письма

$flag - флаг, (true) - письмо отправляется в формате html, (false) - письмо отправляется в формате text/plain

Можно заметить что параметров в функцию send_mail() мы передаем намного больше чем в mail(). Все эти данные необходимы для формирования заголовков.

Теперь практический пример:

Допустим у нас есть страница с формой.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Отправка почты с помощью функции mail</title>
</head>
<body>
<form action="mail.php" method="post">
    <input type="text" name="name" required  placeholder="Введите ваше имя" />
    <input type="email" name="email" required  placeholder="Введите ваш email" />
    <button >Подписаться</button>
</form>
</body>
</html>

Отправка формы идет на обработчик mail.php

<?php
function send_mail(
          $n_from,    # имя отправителя
          $e_from,   # email отправителя
          $n_to,      # имя получателя
          $e_to,     # email получателя
          $charset, # кодировка переданных данных
          $charset2, # кодировка письма
          $theme,      # тема письма
          $text,         # текст письма
          $flag          # письмо в виде html или обычного текста
        ) {

        $to = header_encode($n_to, $charset, $charset2) . ' <' . $e_to . '>';
        $theme = header_encode($theme, $charset, $charset2);
        $from =  header_encode($n_from, $charset, $charset2) .' <' . $e_from . '>';

        if($charset != $charset2) {
          $text = iconv($charset, $charset2, $text);
        }

      $headers = "From: $from\r\n";
      $type = ($flag) ? 'html' : 'plain';
      $headers .= "Content-type: text/$type; charset=$charset2\r\n";
      $headers .= "Mime-Version: 1.0\r\n";

      return mail ($to, $theme, $text, $headers);
}

function header_encode($string, $charset, $charset2) {
  if($charset != $charset2) {
    $string = iconv($charset, $charset2, $string);
  }
  return '=?' . $charset2 . '?B?' . base64_encode($string) . '?=';
}

if(
  isset($_POST['name']) &&
  trim($_POST['name']) !== '' &&
  isset($_POST['email']) &&
  filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)
){


    $message = '<h2>Новый подписчик!</h2>';
    $message .= '<p>'.trim($_POST['name']) .'<p>';
    $message .= '<p>'.trim($_POST['email']) .'<p>';
    $message .= '<span float="right">'.date('H:i d-m-Y').'</span>';
   send_mail(
          'Новый подписчик!',  // имя отправителя
          'admin@webmygames.ru', // email отправителя
          'Новый подписчик!',    // имя получателя
          'andrey-gribin@mail.ru',   // email получателя
          'UTF-8',        // кодировка переданных данных
          'KOI8-R',   // кодировка письма
          'Сообщение с сайта о новом подписчике', // тема письма
          $message,
          true  // письмо в виде html или обычного текста
        );

    }

    $referer = $_SERVER['HTTP_REFERER'];
    if($referer === null){
      $referer = '/';
    }
    header("Location: ".$referer);
?>

В самом обработчике мы используем все вышеописанные функции и в конечном итоге вызываем функцию send_mail() куда передаем данные. Общее сообщение письма сформировано в переменной $message.

Отправка осуществляется с почты admin@webmygames.ru на andrey-gribin@mail.ru.

Здесь есть очень тонкий нюанс! Почта с которой будет отправляться сообщение обязательно должна быть АДМИНСКОЙ. Если вы попробуете осуществить отправку, например с почты такого вида (andrey@yandex.ru, andrey@mail.ru, andrey@gmail.ru и т. п.), то вероятнее всего у вас ничего не пройдет.

Админская почта представляет собой такую структуру {название}@{ваш домен}. В нашем случае это admin@webmygames.ru, admin - произвольное название, webmygames.ru - домен с которого мы будем отправлять письмо. Такую почту вы можете создать на своем хостинге, иногда админская почта указывается в переданных доступах хостинга при его покупке. Как создавать админскую почту мы не будем, так как это не входит в тему поста.

В итоге работы скрипта на мою почту andrey-gribin@mail.ru пришло письмо с переданной информацией через форму отправки.

Сам процесс произошел довольно быстро без видимых задержек. Я использую данный скрипт постоянно из за его простоты, скорости работы и надежности. Письма успешно проходят на почты mail.ru, yandex.ru, gmail.com и т. п. Теперь и вы можете использовать его в своих проектах! Надеюсь я помог вам в решении вашего вопроса.

Не забывайте подписываться на

Мой блог группу Вконтакте канал youtube

С вами был Грибин Андрей. Всего вам хорошего!

Оцените статью

Еще статьи

Агрегатные функции в SQL

Коммиты GIT

CSS перенос слов

GIT Config

User select css

CSS supports правило

Модуль zipfile в python

Свойство quotes в css

Комментарии

Проверочный код

Администратор

Прием прием

11:01 03-04-2019

История

    ПОДПИСКА

    • Подпишись и получай информацию о выходе новых статей на почту! Просто введите свою почту, нажмите кнопку подписаться. На почту должно будет прийти сообщение с потверждением подписки. Если сообщение не пришло проверьте раздел спам или попробуйте другую почту. Также по всем техническим проблемам вы можете написать в поддержку

    НОВОСТИ

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