admin / 02.01.2018

Gmail и mail php не отправляет почту. — Форум об интернет-маркетинге

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

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

Что такое SMTP

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Отправка почты при помощи 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-классы, позволяющие настроить отправку сообщений прямо в консоли администратора, не копаясь в кодах.

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

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

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

Программирование

01.09.2015

4024

Блог веб-разработчика / Статьи / php

PHP sendmail: отправка почты с вложениями посредством PHP

В этой статье хочу поведать Вам о том, как отправлять почту с вложениями стандартными средствами PHP, не прибегая к PEAR и подобным библиотекам.

Начнем с азов. Отправка почты в php выполняется с помощью функции mail:

bool mail ( string $to, string $subject, string $message [, string $additional_headers [, string $additional_parameters]] ) to — адрес получателя subject — тема письма message — текст письма Далее слудуют необязательные параметры: additional_headers — дополнительные заголовки additional_parameters — дополнительные параметры командной строки Возвращаемое значение: true — письмо принято к доставке false — письмо не принято к доставке

В простейшем виде это выглядит так:

<?php if (mail(‘test@example.com’, ‘Письмо из скрипта’, ‘Привет, Василий! Как дела?’)){ echo ‘Письмо успешно отправлено!’; }else{ echo ‘При отправке письма возникла ошибка’; } ?>

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

Теперь разберёмся с дополнительными заголовками. Что вообще такое, заголовок письма? Это, согласно стандарту RFC-822, одна из частей электронного письма. То есть, письмо состоит из заголовков и тела (также и из «конверта», но это нам сейчас не нужно). Заголовок всегда находится перед телом и отделен от него пустой строкой. Заголовок состоит из имени и содержания, разделённых двоеточием. Между собой заголовки разделяются так: каждый заголовок начинается с новой строки. Но, лучше смотреть на примере:

Date: Fri, 4 Jun 2010 16:12:00 From: sales@example.com To: ivan@example.com Reply-to: sales@example.com Subject: Ваш заказ принят X-Mailer: php script

Следовательно, чтобы, к примеру, установить произвольную дату письма, или установить адрес отправителя, необходимо указать заголовки (по умолчанию, дата задаётся текущая, а тема устанавливается во втором параметре)

<?php if (mail(‘test@example.com’, ‘Письмо из скрипта’, ‘Привет Василий, как дела?’, ‘From: ivan@example.com’)){ echo ‘Письмо успешно отправлено!’; }else{ echo ‘При отправке письма возникла ошибка’; } ?>

Отправка письма в HTML-формате

Большинству задач вышеприведённого скрипта отправки mail`ов хватает, но мы пойдём дальше, и научимся отправлять письма в HTML-формате. В этом также нет ничего сложного:

<?php if (mail(‘test@example.com’, ‘Письмо из скрипта’, ‘<html><head><title>Вася, привет</title></head><body bgcolor=»#feeffe»><font color=»blue»>Привет Василий, как дела?</font><br /><font color=»green»>Я умею отправлять письма с помощью php! И скоро научусь отправлять письма с помощью php с вложениями! Это будет круто!</font></body></html>’, «From: ivan@example.com\r\n Content-type: text/html; charset=utf-8\r\n X-Mailer: PHP mail script» )) { echo ‘Письмо успешно отправлено!’; }else{ echo ‘При отправке письма возникла ошибка’; } ?>

Обратите внимание! После каждого заголовка стоит конструкция \r\n — это так обозначается перенос строки. А тот перенос, что вы видите — это обычное выравнивание, дабы удобно было читать код. Т.е. смело можно написать так:

mail(‘test@example.com’, ‘Письмо из скрипта’, ‘(аштиэмэль…)’, «From: ivan@example.com\r\nContent-type: text/html; charset=utf-8\r\nX-Mailer: PHP mail script»)…

И ещё обратите внимание на то, что escape-последовательности (а именно так называются конструкции вида \r\n) работают только с двойными кавычками!
Что же нового в этом скрипте?

Ну, во-первых, мы в заголовках указали тип содержимого (HTML) и кодировку. Во-вторых, просто в теле написали нужный нам html-код. Всё просто!

Отправка писем с вложениями

Вот мы вплотную подошли к отправке писем на php с вложениями.

Отправка электронной почты с помощью PHP с SMTP-сервера

<?php $un = strtoupper(uniqid(time())); $file = file_get_contents(‘file.zip’); if (mail(‘test@example.com’, ‘Письмо из скрипта’, //тело «————«.$un.»\r\n\r\n Content-Type:text/plain; charset=utf-8\r\n Content-Transfer-Encoding: 8bit\r\n\r\n Привет Василий, посмотри вложение\r\n\r\n ————«.$un.»\r\n\r\n Content-Type: application/octet-stream;name=\»file.zip\»\r\n\r\n Content-Transfer-Encoding:base64\r\n Content-Disposition:attachment;filename=»file.zip»\r\n\r\n «.chunk_split(base64_encode($file)).»\r\n «, //заголовки «From: ivan@example.com\r\n MIME-Version: 1.0\r\n Content-Type: multipart/alternative;boundary=\»———-«.$un.»\»\r\n » )) { echo ‘Письмо успешно отправлено!’; }else{ echo ‘При отправке письма возникла ошибка’; } ?>

Всё сложно? Неправда, давайте разбираться. Для начала, мы создали уникальный идентификатор $un, с его помощью мы сможем разделять между собой вложенные файлы, а также тело письма. Далее, мы читаем содержимое подключаемого файла и заносим его в переменную $file.

Но как происходит отправка? В заголовках мы указываем тип содержимого и наш уникальный разделитель (Content-Type: multipart/alternative;boundary=\»———-«.$un.»\»). А в теле письма, разделяя разделителем, пишем сначала текст, потом вложенный файл:

«————«.$un.»\r\n\r\n Content-Type:text/plain; charset=utf-8\r\n Content-Transfer-Encoding: 8bit\r\n\r\n Привет Василий, посмотри вложение\r\n\r\n ————«.$un.»\r\n Content-Type: application/octet-stream;name=\»file.zip\»\r\n\r\n Content-Transfer-Encoding:base64\r\n Content-Disposition:attachment;filename=\»file.zip\»\r\n\r\n «.chunk_split(base64_encode($file))

Пишем, естественно, с указанием типа содержимого (Content-Type) и типа конвертации (Content-Transfer-Encoding).
chunk_split(base64_encode($file)) — это и есть вложение нашего файла (помните, мы в переменную $file внесли содержимое?), предварительно его конвертировав в base64

Готовая функция отправки почты с вложением

Если терпеливый читатель дочитал до этого места, то вот универсальная функция отправки почты с вложением:

function KMail($to, $from, $subj, $text, $files = null, $isHTML = false){ $boundary = «————«.strtoupper(md5(uniqid(rand()))); $headers = «From: «.$from.»\r\n X-Mailer: koz1024.net\r\n MIME-Version: 1.0\r\n Content-Type: multipart/alternative;boundary=\»$boundary\»\r\n\r\n «; if (!$isHTML){ $type = ‘text/plain’; }else{ $type = ‘text/html’; } $body = $boundary.»\r\n\r\n Content-Type:».$type.»; charset=utf-8\r\n Content-Transfer-Encoding: 8bit\r\n\r\n «.$text.»\r\n\r\n»; if ((is_array($files))&&(!empty($files))){ foreach($files as $filename => $filecontent){ $body .= $boundary.»\r\n Content-Type: application/octet-stream;name=\»».$filename.»\»\r\n Content-Transfer-Encoding:base64\r\n Content-Disposition:attachment;filename=\»».$filename.»\»\r\n\r\n «.chunk_split(base64_encode($filecontent)); } } return mail($to, $subj, $body, $headers); }

Использование:

$files = array(‘archive.zip’ => file_get_contents(‘archive.zip’), ‘myphoto.png’ => file_get_contents(‘myfoto.png’)); if (KMail(‘test@example.com’, ‘ivan@example.com’, ‘проба пера’, ‘Привет, высылаю файлы…’, $files, false)){ echo ‘Mail Отправлен’; }else{ echo ‘Произошла ошибка’; } //или так $html = «(HTML код письма)»; if (KMail(‘test@example.com’, ‘ivan@example.com’, ‘проба пера’, $html, null, true)){ echo ‘Mail Отправлен’; }else{ echo ‘Произошла ошибка’; }

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

Отправка письма в HTML формате с картинками

Хотел написать этот раздел сразу после «Отправки письма в HTML-формате», и это было бы логично. Но. Раздел бы получился очень громоздким, а пользуясь функцией, которую я описал выше, можно легко передавать письма в формате HTML да ещё и с картинками. Скажу лишь о том, что сами картинки должны являтся частью html кода, а вместо ссылок на них — использоваться cid — идентификаторы

Вот мы и разобрали, как с помощью простого php отправлять e-mail`ы, отправлять в HTML-формате, отправлять с вложениями. Удачи!

Предыдущая статья: cURL для начинающих. Пишем парсер Следующая статья: Аякс загрузка файлов

Вы нашли то, что искали? Да  Нет

Вам понравилась статья? Да  Нет

Отправка писем на PHP через SMTP

Отправлять письма через PHP намного проще, чем кажется. Всего-то надо сформировать правильный EML, подключиться к SMTP и отправить письмо. Ну ещё может быть, хотя и не факт, надо где-то как-то залогировать отправку, а то потом потеряют письмо, скажут, что и не было никаких писем. И виноватый опять ты, хотя ты бел и пушист. А ещё бы хорошо сделать хоть какую-то обработку ошибок, а то вдруг эксепшин, или серевер устал, или коннект не пошёл, а тут суперважный клиент. И уж совсем замечательно хранить где-то письма на случай «я потеряль», «мне не дошло», «а вышлите мне ещё раз». А ещё мы хотим отправлять письма на сайте, который видел расцвет динозавров. А ещё…

Как настроить почту или отправка Email PHP

мне кажется, что список ещё может расширяться не хуже нашей вселенной.

Для решения всех этих проблем я решил написать небольшой инструмент — ApMailer.

ApMailer

ApMailer — это небольшая библиотека, единственной целью которой является отправка почты. Я постарался сделать её максимально простой и удобной. Вы можете скачать всего один файл и отправлять письма и из консоли, и из web-скриптов!

Подключение ApMailer

Скачайте из репозитория файл mailer.phar или src/lib.php (если не нужна консольная версия). После этого подключите lib.php:

После этого будет доступна функция :

Инициализация

Перед отправкой писем Mailer надо проинициализировать. Делается это так:

Конфиг представляет из себя многомерный массив, в котором указываются адрес отправителя по умолчанию, хуки для обработки ошибок и ведения логов и транспортёры:

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

Транспортёр сохраняет письмо в виде EML в папку. Доступны следующие настройки:

  • — папка, а которую будут сохраняться письма. Если предполагается много писем, лучше хранить их с разбивкой по дате

Транспортёр отправляет письмо через SMTP. Доступны следующие настройки:

  • — адрес SMTP-сервера
  • — использовать SSL при подключении (обязательно для google, yandex и других популярных сервисов)
  • — порт подключения (обычно 25 для подключения без SSL и 465 для подклюения с SSL)
  • — логин для авторизации (если логин не указан, то используется подключение без авторизации)
  • — пароль для авторизации (не используется, если логин не указан)

Хуки:

  • — срабатывает на ошибку транспортёра (удобно делать лог ошибок отправки писем)
  • — срабатывает после отправки письма (удобно делать общий лог отправки писем)

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

Рабочий пример

В качестве примера я сделал форму отправки письма:

Пример письма:

Отправка почты на старых версиях PHP

Поскольку библиотека умеет работать через консоль, то можно формировать команду, которая сможет отправлять письма. Единственное, что нужно, наличие скомпилированного бинарника PHP 5.6.

А дальше уже можно отправлять письма:


© 2018 Антон Прибора. При копировании материалов с сайта, пожалуйста, указывайте ссылку на источник.

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

Все настройки отправки почты можно произвести в «Общие настройки» вкладка «Сервер».

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

По умолчанию в Joomla! выбран способ отправки «PHP Mail».

К сожалению, не на всех хостингах, предоставляемых хостинг-компаниями, корректно работает этот способ. Поэтому протестируйте ваш сайт выбрав другие способы отправки.

Второй способ отправки почты — «Sendmail».

В этом способе добавляется дополнительное поле «Путь к Sendmail». Как правило, оно автоматически определяется и уже будет заполнено.

Третий способ отправки почты «SMTP».

При этом способе, если Вы используете почтовый ящик созданный на вашем домене заполните все поля, кроме имени пользователя и пароля, как указано на рисунке выше. Если же Вы используете почтовый ящик, скажем mail.ru, укажите в поле SMTP-сервер «smtp.mail.ru», порт «465».

Отправка писем (SMTP vs. mail PHP)

Установка и настройка SMTP сервера на Windows Server 2008 является простым процессом, требующим лишь несколько шагов. В этой статье мы опишем шаг за шаг настройки и установки функции SMTP-сервер и как включить SMTP для передачи сообщений от локального сервера.

Шаг 1:

Откройте Server Manager (Правой клавишой на "Мой компьютер" -> "Управление") и  выберите Add Features

Шаг 2:

Выбираем SMTP Server (для проверки работы так же можете установить telnet) и устанавливаем необходимые компоненты

Шаг 3:

Открываем "IIS 6.0 Manager" он находится в "Control Panel" -> "Administrative Tools" -> "Internet Information Services 6.0"

Шаг 4:

Выбираем меню "Свойства" на SMTP Server

Шаг 5:

Переходим на закладку "Access" нажимаем на "Relay…"

Шаг 6:

Выбираем пункт "Only the list below" и добавляем в список IP адрес 127.0.0.1

На этом настройка smtp server закончена.

Шаг 7:

Что бы проверить, что все работает можете в командной строку вызвать команду

telnet localhost 25

Если подключились, значит все правильно сделали. (для выхода напишите Quit)

 

Шаг 8:

Письма могут не приходить:

1) Если в брандмауэре закрыт 25 порт

2) Сам хостинг закрыл 25 порт (у хостинга 1gb он закрыт)

3) IP адрес находиться в спам-списке

3) Не правильно прописали web.config Должно быть так:

<system.net>
    <mailSettings>
            <smtp deliveryMethod="SpecifiedPickupDirectory"
                        from="support@site.com.ua">
                <specifiedPickupDirectory
                                pickupDirectoryLocation="C:\inetpub\mailroot\Pickup" />
            </smtp>
        </mailSettings>
</system.net>

 

Проверка php mail, тест отправки почты

Php

Это удобный небольшой скрипт, который поможет протестировать ваш хостинг, чтобы вы могли отправлять электронные письма с сайтов на основе PHP, которые включают контактную форму или подобное. Это быстрый способ убедиться, что отправка электронных писем работает.

[PHP] Использование mail() для работы с SMTP (GMail)

Нужно проверить работу функции mail()?

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

Создайте скрипт testemail.php с содержимым:

<?php
$to = «user@domain.com»; //куда отправить письмо?
$subject = «Отправка почты работает!»; // Тема письма
$message = «Это тестовое письмо было отправлено используя php mail().»; // Тело письма
$result = mail($to,»$subject «,$message, «From:PHPMail-Script»);
if ($result){
echo (‘Письмо отправлено!’);
} else { echo(‘Ошибка! Письмо не отправлено.’); }

Загрузите созданный файл в директорию сервера, доступную по HTTP-протоколу (public_htmlwwwhtdocs или другую в зависимости от конфигурации сервера). Запустите файл, набрав его адрес (URL) в адресной строке браузера, например: http://domain.ru/testemail.php.

Если не работает

Проверьте работает ли вообще функция mail на сервере:

Проверьте установлена ли почтовая служба: sendmail, postfix или другая.
Проверьте запущена ли почтовая служба.

Для sendmail/postfix проверьте настройки в php.ini:

Проверьте в php.ini не внесена ли функция mail в список запрещённых функций:

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*