Отправка почты по шаблону минуя SMTP-сервер провайдера на PHP


Содержание

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

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

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

ApMailer

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

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

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

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

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

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

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

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

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

  • dir — папка, а которую будут сохраняться письма. Если предполагается много писем, лучше хранить их с разбивкой по дате ‘dir’ => strftime( ‘/path/to/mails/%Y/%m/%d’ )

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

  • host — адрес SMTP-сервера
  • ssl — использовать SSL при подключении (обязательно для google, yandex и других популярных сервисов)
  • port — порт подключения (обычно 25 для подключения без SSL и 465 для подклюения с SSL)
  • login — логин для авторизации (если логин не указан, то используется подключение без авторизации)
  • password — пароль для авторизации (не используется, если логин не указан)
  • onError — срабатывает на ошибку транспортёра (удобно делать лог ошибок отправки писем)
  • afterSend — срабатывает после отправки письма (удобно делать общий лог отправки писем)

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

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

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

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

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

Отправка email в PHP: настройка OpenServer

В этом уроке мы научимся отправлять почту средствами PHP в рамках сервера OpenServer. О том, чем хорош этот сервер и о том, как его установить, я писал в статье «Установка и настройка OpenServer».

Начнем с того, что в PHP отправить email – очень просто. Для этого используется функция mail(). Чтобы отправить письмо нужно указать адрес получателя, тему письма и текст сообщения, а также специальный заголовок From, с указанием отправителя вот так:

Однако, вот незадача – если этот код выполнить на хостинге, то письмо будет отправлено и придёт получателю, а вот если мы используем OpenServer, то по умолчанию все наши письма будут просто записываться в специальный лог-файл. Убедиться в этом вы можете, заглянув во вкладку «Почта» настроек OpenServer.

И действительно, перейдя по этому пути, мы увидим наше письмо.

Но как же быть, если мы хотим на самом деле отправлять письма? Для этого нам нужен SMTP-сервер. Если кто не знает – электронная почта отправляется по специальному протоколу SMTP, а принимается по протоколу POP3. SMTP-сервер можно поднять самому, привязать к нему свой домен, и использовать свои адреса вроде x@myproject.ru. Мы же в рамках данного урока будем использовать SMTP-сервер Google.

Илон Маск рекомендует:  Visual basic html = vbscript объект location

Первым делом вам нужно создать новый аккаунт Google – просто перейдите в режиме инкогнито на https://gmail.com/ и создайте новую учетную запись. Я создал для примера kek777cheburek@gmail.com.

После этого переходим в настройки OpenServer и заполняем поля:

  • способ отправки почты: отправлять почту через удаленный SMTP сервер
  • SMTP сервер: smtp.gmail.com
  • порт: 465
  • email отправителя: почта, которую вы зарегали ранее
  • имя пользователя: та же почта
  • пароль: пароль от почты
  • шифрование: авто

После этого жмем кнопку «Сохранить» и перезапускаем сервер.

Изменяем наш код:

После чего запускаем скрипт и проверяем свой ящик.

Мне письмо пришло мгновенно, так как в моём случае и отправитель и получатель были на gmail.com. Если у вас по-другому — возможно, придется подождать.

Стоит отметить, что данная инструкция является универсальной и данные настройки можно задать не только в OpenServer, но и в любом другом месте, где требуется конфигурация SMTP-сервера.

Отправка почты на PHP через внешний SMTP с авторизацией

При оптимизации очередного проекта, доставшегося в наследство встал вопрос разгрузки сервера. В ходе анализа выяснилось, что сервер достаточно часто генерирует и отправляет через себя (через стандартную функцию mail() на php) большое количество уведомлений пользователям. Решение пришло само собой — сделать отправку через внешний STMP-сервер с аутентификацией.Если своего сервера нет — можно воспользоваться любым, который позволяет это делать (их масса как платных, так и бесплатных)

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

Внимание: код устарел, возможно на вашей версии ПХП работать не будет :(

Отправка почты через SMTP на PHP

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

Почему отправка через SMTP а не mail()

У меня ответ довольно простой — какое-то время через мой сервер вирусяки отправляли тонны писем, что привело в БАНу моего IP-адреса у многих почтовиков, в частности у gmail.com, а в связи с этим пользователи могли получать письма, поэтому пришлось искать альтернативу, и я ее нашел — это SMTP

Возможно, вас заинтересует, чем же мой скрипт лучше других, которые валяются на просторах?! Отвечу

  1. Он работает с почтой yandex, rambler, mail (gmail победить не смог)
  2. Понятный код. Чтобы его настроить достаточно поменять несколько строчек
  3. Отправляет письма в HTML формате

Вот достоинства моего скрипта, коих я не нашел каком-либо в интернете, но из каждого я взял все необходимо. И так, давайте рассмотрим код.

Вот и все, готовый скрипт у вас в руках, только скопируйте, поменяйте значения массива $config и все будет отлично работать.

Теперь давайте разберем некоторые элементы, на которые я бы хотел заострить внимание.

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

сервер не разрешил начать авторизацию

Чтобы увидеть что-то более конкретное, давайте немного видоизменим код

И получаем в итогде вполне конкретную ошибку

530 5.7.0 Must issue a STARTTLS command first. x4sm16408296lbn.2 — gsmtp

Что она означает точно — я не знаю, но полагаю, что связанно что-то с защищеннымнезащищенным подключением. Как от нее избавиться — пока не знаю, поэтому gmail остался не побежденным на данный момент.

PHP — отправка электронной почты через PHP

Дата публикации: 2020-10-19

От автора: отправка почты через PHP настраивается с помощью файла php.ini. Откройте файл php.ini, который находится в каталоге / etc/, и найдите раздел с заголовком [mail function].

Пользователям Windows нужно предоставить в этом разделе две директивы. Первая называется SMTP, она задает адрес SMTP-сервера. Вторая называется sendmail_from, она определяет ваш адрес электронной почты. Настройки для Windows должны выглядеть примерно так:

Пользователи Linux должны указать PHP местоположение своего приложения sendmail. Путь и любые требуемые ключи должны указываться в директиве sendmail_path. Настройки для Linux должны выглядеть примерно так:

Как создать сайт самому?

Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!

Теперь все готово.

Отправка обычного текстового сообщения

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

Ниже приводится описание каждого аргумента.

Как создать сайт самому?

Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!

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


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

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

Илон Маск рекомендует:  Нейрокомпьютерная техника перспективы на будущее

Почтовая программа. Отправка почты на PHP

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

Отправить письмо с сервера можно 3-я способами:

  • через функцию mail() – самый простой и менее надежный вариант, его рассматривать не будем, кого интересует данный вид отправки, можете почитать в документации PHP;
  • через SMTP-сервер, как собственный, так и сторонний – самый оптимальный вид отправки сообщений, его подробнее и рассмотрим в данной статье;
  • через сторонние сервисы, такие как Amazon, Mandrill, Mailgun и прочее – хорошее и простое решения, но зачастую использование подобных серверов, может оказаться дороже собственного сервера. Подробнее рассмотрим в другой статье.

Для отправки письма через SMTP-сервер необходимо:

  • данные для доступа к SMTP-серверу;
  • e-mail получателя;
  • письмо и его заголовок;
  • системные заголовки.

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

Создание системных заголовков

Рассмотрим основной набор заголовков, которое должно иметь письмо претендующее на попадание в папку “Входящие”:

  • Date– дата отправки;
  • Subject– заголовок сообщения перекодированный в base64, чтобы избежать проблем с кодировкой;
  • Reply-To – имя и e-mail для ответа;
  • MIME-Version– версия MIME-стандарта;
  • Content-Type – тип письма и его кодировка, тип письма обычно указывается html либо plain (текстовая версия);
  • Content-Transfer-Encoding – тип конвертации, обычно используется “8bit”;
  • From– имя и e-mail отправителя;
  • To– имя и e-mail получателя;
  • Message-ID – id сообщения в вашей системе;
  • Errors-To – e-mail, куда будут отправлена информация о возникших ошибках;
  • X-Complaints-To – e-mail, куда будут отправлена информация о возникших жалобах;
  • X-Sender – e-mail системного отправителя;
  • List-Unsubscribe – здесь указывается ссылка или e-mail для отписки;
  • List-id – id текущей рассылки, для статистики;
  • Precedence– этот заголовок необходим в случае массовой рассылки, значение ставится bulk.

Класс для отправки почты на PHP

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

PHP-скрипт отправки почты через SMTP

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

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

Как написать скрипт отправки почты через SMTP

Создание функции для работы с открытым SMTP-соединением

Создание письма

Замените windows-1251 на кодировку, которую вы используете; sender – на имя отправителя, а [email protected] – на e-mail, с которого вы собираетесь отправлять письмо.

Замените @domain.com на домен, на котором расположена ваша почта.

Замените windows-1251 на кодировку, которую вы используете; recipient на имя получателя письма, а [email protected] – на его e-mail.

Замените check на тему письма.

Замените привет, проверка связи на текст вашего письма.

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

Если есть желание – замените vasya на имя своего ПК. Но можно и не заменять, эта информация – только для самого сервера.

Замените login на ваш логин на почтовом сервере

Замените password на ваш пароль на почтовом сервере.

Замените [email protected] на почтовый адрес, с которого будет отправлено письмо.

Замените [email protected] на почтовый адрес получателя.

Этот скрипт можно использовать для отправки почты через SMTP с любого хостинга или сервера.

Отправка почты через SMTP с помощью PHP

Здравствуйте дорогие читатели. В этой записи я расскажу Вам как отправить письмо с вашего сайта через SMTP сервер. Перед тем, как отправлять письма через SMTP необходимо обязательно настроить DMARC, DKIM, SPF. Если не настроить, ваши письма будут попадать в спам, но нам этого не нужно. Статья — Как настроить DMARC, SPF, DKIM подпись на своем сайте.

Готовый класс — PHP

Для начала загрузите готовый класс, по ссылке — SendMailSmtpClass.php.zip

Распаковываем архив, и размещаем в любую директорию на Вашем сайте.

Настройка класса

Настройка очень простая. Разместите этот код на странице, которая присутствует на каждой. Обычно это — страница конфига.

Код отправки самого письма:

$result возвращает либо true — успешная отправка, либо false — ошибка.

Прикрепление файлов к письму

В итоге, если Вы все настроили правильно Ваше письмо будет отправляется через этот SMTP сервер с подписей DKIM, и не попадет в спам.

Илон Маск рекомендует:  Издать звук динамика указанной частоты и длительности на чистом javascript

Пишите свои вопросы, предложения в комментариях помогу Всем!

Отправка электронной почты через SMTP

Технические данные

Описание

Часто возникают проблемы при отправке почтовых сообщений через стандартный механизм отправки ( попадание в папку СПАМ, блокировка отправки по различным причинам).

Данный модуль призван решить эту проблему путем отправки через внешние SMTP сервера ( Google, Yandex, Amazon SES, корпоративный SMTP сервер )

С версии 0.1.4 появилась возможность отправлять почту через разные SMTP сервера ( поддержка многосайтовости ).

Устранена проблема с возможным падением сайта после установки

Поддержка кириллических доменов и PHP 7 & 7.1

!!Модуль не работает на демо сайтах bitrixlabs.ru!!

Консультации по установке и настройке info@wsrubi.ru

Возникла проблема с модулем. Одна из форм отправляет письма с аттачами (аттачи прикрепляются по этому примеру https://dev.1c-bitrix.ru/community/webdev/user/11948/blog/1623/), но через модуль письма не уходят, выдает ошибки:

Error: Header name is not set, use setFieldName() line:143
Error: Header name is not set, use setFieldName() line:88

Остальные формы на сайте отправляются. Подскажите, в чем может быть проблема?

Смотрел видео с инструкцией, там видно, что после установки добавился код про custom_mail в init.php — у меня в файле пусто. В настройках модуля включено «создавать init.php для новых сайтов».

Как включить модуль? Не с видео же код перепечатывать?

0.2.11 (13.11.2020) Мелкие исправления

После установки появится пункт «Отправка почты через SMTP» в административной части «Настройки->Настройки модулей».

В настройках модуля необходимо указать параметры вашего SMTP сервера и отметить галочку «Модуль активен», после этого почтовые сообщения будут уходить через SMTP сервер.

Дополнительные SMTP аккаунты добавляются через опцию «Добавить дополнительный E-mail SMTP аккаунт». Добавляете исходящий адрес и в новой вкладке указываете настройки для этого адреса.

Для подключения модуля необходимо добавить строку

в файл /bitrix/php_interface/init.php или /local/php_interface/init.php , если файл отсутствует то его необходимо создать

Внимание

  1. Для отправки писем модуль использует функцию custom_mail
  2. Модуль подключается через php_interface/init.php

Техническая поддержка оказывается только по электронной почте — support@wsrubi.ru

Поддержка по телефону не оказывается.

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

У меня возникли проблемы с отправкой электронной почты на PHP. Я получаю сообщение об ошибке: SMTP server response: 530 SMTP authentication is required .

У меня создалось впечатление, что вы можете отправлять электронную почту без SMTP для проверки. Я знаю, что эта почта будет отфильтрована, но это не имеет значения прямо сейчас.

Это настройка в файле php.ini . Как настроить SMTP? Существуют ли какие-либо SMTP-серверы, которые не требуют проверки, или я должен сам настроить сервер?

Когда вы отправляете электронное письмо через сервер, которому требуется SMTP-аутентификация, вам действительно нужно указать его и указать хост, имя пользователя и пароль (и, возможно, порт, если он не является значением по умолчанию — 25).

Например, я обычно использую PHPMailer с настройками, подобными этим:

Вы можете найти больше о PHPMailer здесь: https://github.com/PHPMailer/PHPMailer

или, для более подробной информации, читайте дальше.

Для пользователей Unix, mail() фактически использует команду Sendmail для отправки электронной почты. Вместо изменения приложения вы можете изменить среду. msmtp — это SMTP-клиент с синтаксисом CLI, совместимым с Sendmail, что означает, что он может использоваться вместо Sendmail. Это требует только небольшого изменения вашего php.ini.

Тогда даже функция lowly mail() может работать с поддержкой SMTP. Это очень полезно, если вы пытаетесь подключить существующее приложение к почтовым службам, таким как sendgrid или mandrill, без изменения приложения.

Вот способ сделать это с PHP PEAR

Если вы используете SMTP Gmail, не забудьте включить SMTP в своей учетной записи Gmail, в настройках

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

  • mail() использует SMTP-сервер в вашей системе. В Windows можно использовать как минимум два сервера: hMailServer и xmail. Я провел несколько часов, настраивая и поднимая их. На мой взгляд, первый из них проще. Сейчас hMailServer работает с Windows 7 x64.
  • mail() использует SMTP-сервер на удаленной или виртуальной машине с Linux. Конечно, реальная почтовая служба, такая как Gmail, не позволяет прямое соединение без каких-либо учетных данных или ключей. Вы можете настроить виртуальную машину или использовать ее в локальной сети. Большинство дистрибутивов Linux имеют почтовый сервер из коробки. Настройте его и получайте удовольствие. Я использую exim4 по умолчанию на Debian 7, который прослушивает его интерфейс LAN.
  • Библиотеки рассылки используют прямые подключения. Libs легче настроить. Я использовал SwiftMailer, и он отлично отправляет почту из учетной записи Gmail. Я думаю, что PHPMailer тоже хорош.

Независимо от вашего выбора, я рекомендую вам использовать некоторый уровень абстракции. Вы можете использовать библиотеку PHP на своей машине разработки под управлением Windows и просто mail() на производственной машине с Linux. Уровень абстракции позволяет вам обменивать почтовые драйверы в зависимости от системы, в которой работает ваше приложение. Создайте абстрактный класс MyMailer или интерфейс с абстрактным методом send() . Наследуем два класса MyPhpMailer и MySwiftMailer . Внедрите метод send() соответствующим образом.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL