Php скрипт для отправки почты – форма обратной связи. PHP Sendmail script. PHP скрипт отправки почты (сообщения), писем с сайта. Примеры работы (демо). Скачать бесплатно.

Как грамотно отправлять почту из скриптов (в частности — на PHP) / Habr

Первая часть текста взята из инструкции хостинг-провайдера Netangels. Вторая — авторская.

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

Для того, чтобы быть уверенным, что ваше сообщение отправляется действительно верно, необходимо иметь по меньшей мере базовые представления о формате почтового сообщения. Формат почтового сообщения описан в нескольких стандартизирующих документах, основными из которых являются RFC 822 (описывает формат передачи простого текста на английском языке) и RFC 2045 и далее (описывает расширения этого формата для передачи произвольных данных).

Формат почтового сообщения


Ниже приведен самый простой пример текстового сообщения, составленного в соответствии с приведенными выше стандартами и готового к отправке.
From: =?windows-1251?b?0J7RgtC/0YDQsNCy0LjRgtC10LvRjD89?= <[email protected]>
To:  =?windows-1251?b?0J/QvtC70YPRh9Cw0YLQtdC70Yw/PQ==?= <[email protected]>
Subject: =?windows-1251?b?0Y3RgtC+INGC0LXQvNCwINGB0L7QvtCx0YnQtdC90LjRjz89?=
Content-Type: text/plain; charset=«windows-1251»
Content-Transfer-Encoding: 8bit

Это почтовое сообщение на русском языке
Содержит несколько строк

Именно в таком формате клиент для отправки почты (MS Outlook или Mozilla Thunderbird) подготавливает сообщение, а затем отправляет его получателю (кстати, большинство почтовых клиентов позволяют просмотреть исходный код сообщения, в Mozilla Thunderbird, например, для этого служит комбинация клавиш Ctrl+U). Задача нашего скрипта языке PHP — добиться точно такого же формата письма.

Как видно из приведенного выше примера, электронное письмо содержит две части: в одной (верхней) размещаются заголовки, а в другой (нижней) собствено текст письма. Отделены эти части друг от друга пустой строкой. Заголовки состоят из строк, в которых содержится тема письма (Subject), имя и адрес отправителя (From), получателя (To) и другая информация. В самом простом случае каждая строка содержит пару «ИмяЗаголовка: ЗначениеЗаголовка». Особенно необходимо подчеркнуть, что, согласно стандартам, в заголовках ни при каких обстоятельствах не должны содержаться символы, не присутствующие в ASCII таблице — латинские буквы, цифры, знаки пунктуации и псевдографики.

Грамотное использование русских символов в заголовках почтового сообщения


Итак, в явном виде русский текст в заголовке присутствовать не должен, поэтому для того, чтобы включить его туда, этот текст предварительно нужно закодировать. Стандарты описывают способ кодирования «запрещенных» символов. Общий формат выглядит так:
=? кодировка? способ кодирования? закодированный текст?=
Кодировка может быть любой из списка «windows-1251», «koi8-r», «utf-8» и т.д. Во всех случаях, как правило, кодировка сообщения будет совпадать с кодировкой в которой работает сайт. То есть в большинстве случаев это будет «windows-1251», реже — «utf-8».

Способ кодирования указывает на то, каким именно образом русские символы будут преобразованы в безопасный набор. Способа определяется два: так называемый «Q-encoding» (обозначается одной буквой «Q») и «Base64» (обозначается одной буквой «B»).

К сожалению, штатной функции, которая бы могла бы обычную строку преобразовать в Q-encoded текст, в PHP нет, зато есть функция, которая умеет выполнять аналогичное преобразование в Base64. Итак, PHP код правильного создания заголовка темы почтового сообщения может выглядеть следующим образом:

$subject = «=?windows-1251?b?». base64_encode($_POST[«subject»]). «?=»;
Здесь предполагается, что в переменной $_POST[«subject»] у вас содержится тема почтового сообщения, записанная по-русски в кодировке windows-1251.

Адрес отправителя или получателя может быть записан в виде «[email protected]» или в виде «Имя пользователя <[email protected]>». Во втором случае имя пользователя необходимо преобразовать так же, как в предыдущем примере. Ниже приведен пример, в котором предполагается, что в переменной $_POST[«username»] содержится имя пользователя, а в переменной $_POST[«email»] его электронный адрес:

$sender = «=?windows-1251?B?». base64_encode($_POST[«username»]). «?= <«. $_POST[«email»]. «>»;

Content-type: multipart/???


С этим заголовком знаком любой разработчик, которому доводилось решать проблемы отправки писем с вложениями или HTML письмами. И зачастую письма, сформированные без использования библиотек вроде PEAR::Mail_mime отображаются не очень корректно. Практика показывает, что если при формировании письма жестко придерживаться стандарта, которы задается в RFC (в частности — RFC 2046) — подавляющее большинство клиентских программ (включая таких любителей придерживаться стандартов, как Mozilla Thunderbird) отображает письмо корректно. Далее мы будем исходить из того, что читатель этого документа представляет себе основной синтаксис команд и понимает, что таке boundary и почему необходимо указывать Content-type для каждой из частей письма. Постараемся отметить основные ошибки.

Ошибка первая — неверный subtype


Тип multipart имеет три субтипа — mixed, alternative и related, которые используются синтаксически одинаково, но имеют разное предназначение
  • mixed — используется, когда в рамках одного почтового сообщения имеется несколько независимых друг от друга, и равнозначных частей. Самый простой пример такого письма — сообщение с вложением.
    alternative — используется, когда в одном почтовом сообщении содержится несколько частей, содержащих одну и ту же информацию, предназначенную для отображения на различном клиентском ПО — например текстовая и HTML версия одного и того же письма.
    related — используется, когда в одном почтовом сообщении содержится несколько частей, формирующих один итоговый документ. Яркий пример — HTML письмо с картинками. Запомните, по стандарту только в этом случае должны работать ссылки на Contend-id элементов (вида <img src=«cid:image»>).
    Помните и применяйте по назначению.

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

    Порядок частей, в котором они указаны в письме, зачастую имеет ключевое значения для того, как будет отображаться сообщение у клиента.
    • mixed — порядок частей для наших задач не имеет значения.
      alternative — части должны быть расставлены по порядку, от более простых к более сложным. RFC регламентирует процесс выбора одной из версий письма клиентом пользователя примерно так: «В общем случае, почтовый клиент должен отображать последнюю доступную ему версию документа». Т.е. при формировании текстовой и HTML-версий письма необходимо вперед поставить текстовую.
      related — первой в очереди должна идти основная часть (HTML документ, например). Следом — все остальные. По большому счету, стандартом регламентирован специальный параметр «start», который указывает на основную часть документа, но этим лучше не злоупотреблять.

      Ошибка третья — выбор только одного субтипа

      Зачастую разработчик, формирующий из программы письмо забывает, что любая из частей письма может так же иметь Content-type: multipart, а значит можно выстроить некоторое подобие древовидной структуры, гарантирующей, что каждая из частей письма займет правильное место. Вот как примерно может выглядеть структура письма, имеющего текстовую и HTML версию (HTML с картинками), а так же приложенный документ MS Word:
      • Content-type: multipart/mixed
        • Content-type: multipart/alternative
          • Content-type: text/plain
            Content-type: multipart/related
            • Content-type: text/html
              Content-type: image/jpeg
              Content-type: image/jpeg

            Content-type: application/msword

          И напоследок — еще пара рекомендаций

          • Всегда делайте text/plain вариант письма — никто не может предсказать, как именно будут читать Ваше письмо.
            Не ленитесь и придерживайтесь стандартов.
            Если интересно — http://people.dsv.su.se/~jpalme/ietf/mhtml-test/mhtml.html тут есть несколько примеров.

PHP mail под Windows / Habr

В этой статье я хочу рассказать об отправке почты из php скриптов под Windows.

Америку я, конечно, не открою, но надеюсь, что кому-то эта статья будет полезна или просто сэкономит время.

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

Обычно эти ошибки имеют примерно такое описание:
Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in E:\www\simplemail\mailer.php on line ......



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

Sendmail, в свою очередь, для отправки почты использует SMTP сервер.

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

Версию sendmail для Windows можно скачать здесь.

Установка и настройка выполняется в три этапа.

1) Распаковываем архив на тот же диск, где установлен php. Например, я создал папку C:\wamp\sendmail.

2) Вносим изменения в файл php.ini:

[mail function]
SMTP =

sendmail_from =
sendmail_path = "C:\wamp\sendmail\sendmail.exe -t"

Как видите, нужно только указать путь к sendmail чтобы php мог ее найти.

3) Настраиваем sendmail. Все настройки находятся в файле sendmail.ini (расположен в папке с sendmail).

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

Ниже я покажу пример настройки sendmail для работы с SMTP сервером mail.ru, но, естественно, вы выбрать любой другой.

Итак, открываем sendmail.ini и устанавливаем следующие параметры:

smtp_server=smtp.mail.ru; адрес SMTP сервера
smtp_port=25; порт SMTP сервера

default_domain=mail.ru; домен по-умолчанию

error_logfile=error.log; файл в который будет записываться лог ошибок

debug_logfile=debug.log; очень полезная на этапе отладки опция. Протоколируются все операции, которые выполняет sendmail

[email protected]; имя вашего аккаунта
auth_password=account_password; ваш пароль

; следующие три опции используются если перед авторизацией на SMTP сервере требуется авторизация на POP3 сервере
pop3_server=pop.mail.ru
[email protected]
pop3_password=account_password

; параметр для команды MAIL FROM
[email protected]

hostname=mail.ru

Теперь не забудьте перезапустить web сервер, чтобы изменения вступили в силу.

Чтобы протестировать работу почты напишем простенький скрипт:

01 <html xmlns="http://www.w3.org/1999/xhtml">
02 <head>
03 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
04 <title>Simple Mail</title>
05 </head>
06 <body>
07 <?php
08 $addr = $_POST['addr'];
09 $theme = $_POST['theme'];
10 $text = $_POST['text'];
11 if (isset($addr) && isset($theme) && isset($text)
12 		&& $addr != "" && $theme != "" && $text != "") {
13 	if (mail($addr, $theme, $text, "From: [email protected]")) {
14 		echo "<h4>Сообщение отправлено</h4>";
15 	}
16 	else {
17 		echo "<h4>При отправке сообщения возникла ошибка</h4>";
18 	}
19 }
20 ?>
21 <form action="mailer.php" method="post">
22 <p>
23 	<label for="addr">eMail:</label>
24 	<input type="text" name="addr" size="30" />
25 </p>
26 <p>
27 	<label for="theme">Тема письма:</label>
28 	<input type="text" name="theme" size="30" />
29 </p>
30 <p>
31 	<label for="text">Текст письма:</label>
32 	<textarea rows="10" cols="20" name="text"></textarea>
33 </p>
34 <p>
35 	<input type="submit" value="Отправить" />
36 </p>
37 </form>
38 </body>
39 </html>

Он создает форму с тремя полями для ввода адреса, темы и содержания письма. Нажатие на кнопку «Отправить» отправит запрос этому же скрипту (строка 21).

Если данные введены, то будет вызвана функция mail (строка 13), которая и отправит письмо. В случае успешной отправки функция возвращает true, в противном случае — false.

Как видите, ничего сложного в настойке почты нет.

Удачи!

Источник: кросспостинг из моего блога – www.simplecoding.org.

Как написать скрипт отправки письма на php имея хостинг reg.ru? — Хабр Q&A

Имеется рабочий скрипт и хостинг Reg.ru на которой есть почта [email protected], как переписать мой код, чтобы письмо приходило не просто под именем «[email protected]», а чтобы оно исходило реально из этого адреса, очень жду ответа, заранее огромное спасибо!
<!DOCTYPE html>
<html>
   
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <meta http-equiv="Refresh" content="2; URL=http://test.ru">
        <title>Форма обратной связи Test</title> 
    </head>
    
<body>

<?php 

// Почта, на которую приходит письмо
$sendto   = "[email protected]"; // почта, на которую приходит письмо

// Записываем данные из полей ввода в переменные
$username = $_POST['name'];
$usertel = $_POST['telephone'];
$usermail = $_POST['email'];

// Тема письма
$subject  = "Пришлите прайс";

// Дополнительные заголовки
$headers .= "From: Отправитель <[email protected]>\r\n";
$headers .= "Content-type: text/html; charset=utf-8 \r\n";

// Формирование тела письма
$msg  = "<html><body>";
$msg .= "<h2>Данные клиента:</h2>\r\n";
$msg .= "<p><strong>Имя:</strong> ".$username."</p>\r\n";
$msg .= "<p><strong>Почта:</strong> ".$usermail."</p>\r\n";
$msg .= "<p><strong>Телефон:</strong> ".$usertel."</p>\r\n";
$msg .= "</body></html>";

// отправка сообщения
if(@mail($sendto, $subject, $msg, $headers)) {
	echo "<center><span><h2>Сообщение успешно отправленно</h2><br><h3>Мы свяжемся с вами в ближайшее время! </h3></span></center>";
} else {
	echo "<center><img src='img/ne-otprevleno.png'></center>";
}

?>

</body>
</html>

Пример PHP скрипта для отправки писем через функцию mail()

Несколько скриптов по типу формы обратной связи для проверки функции MAIL().

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<?php

// если нажали кнопку «Отправить»

if($_POST[‘submit’]) {

        

        $title = substr(htmlspecialchars(trim($_POST[‘title’])), 0, 1000);

        $mess =  substr(htmlspecialchars(trim($_POST[‘mess’])), 0, 1000000);

        // $to — кому отправляем

        $to = ‘[email protected]’;

        // $from — от кого

        $from=’[email protected]’;

        // Отправка письма.

        mail($to, $title, $mess, ‘From:’.$from);

        echo ‘Спасибо! Ваше e-mail отправлен.’;

}

?>

<form action=»» method=post>

 

<p>Текст перед формой <p>

              <div align=»center»>

              Teм а<br />

              <input type=»text» name=»title» size=»40″><br />

              Сообщение<br />

              <textarea name=»mess» rows=»10″ cols=»40″></textarea>

              <br />

              <input type=»submit» value=»Отправить» name=»submit»></div>

</form>

И еще один скрипт формы обратной связи  для проверки функции mail() его достаточно запустить предварительно вписав ваш почтовый ящик вместо ящика [email protected]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<?php

// Кому письмо

$to = «[email protected]»;

// Тема письма

$subject = «Testing mail() function»;

// Сообщение

$message = «Testing mail() function.»;

 

$message = wordwrap($message, 70);

// Отправка e-mail

// Возвращает TRUE, если e-mail отправлен (вернее, было успешно передано программе, которая отправляет почту, например, exim)

if ( mail($to, $subject, $message) )

{

    echo(«E-mail successfully sent!»);

}

else

{

    echo(«ERROR! E-mail wasn’t sent»);

}

?>

 

(Просмотрено 400 раз, 1 просмотров сегодня)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *