отправка почты из скриптов

phpBB но не только...

Модераторы: Olej, adminn

Аватара пользователя
Olej
Писатель
Сообщения: 14878
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

отправка почты из скриптов

Непрочитанное сообщение Olej » 30 дек 2019, 19:00

Разборка с этой темой нужна для корректной рассылкой почтовых сообщений с этого вот форума, из phpBB.
Но представляет интерес и сама по себе.
Итак, задача: послать корректно русскоязычные письма из PHP скрипта ... или даже не из PHP скрипта, а как-то другим образом из командной строки.

Аватара пользователя
Olej
Писатель
Сообщения: 14878
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: отправка почты из скриптов

Непрочитанное сообщение Olej » 30 дек 2019, 19:05

Olej писал(а):
30 дек 2019, 19:00
Итак, задача: послать корректно русскоязычные письма из PHP скрипта ... или даже не из PHP скрипта, а как-то другим образом из командной строки.
Прежде всего, во-первых, чтобы посылать почту вообще, на хосте должен быть установлен почтовый агент: sendmail или exim4, на выбор. Всё это есть в стандартных дистрибутивах, как-то так:

Код: Выделить всё

root@277938:~# aptitude search sendmail | grep ' sendmail'
p  dhis-mx-sendmail-engine - Dynamic Host Information System - sendmail MX engine
p  sendmail - powerful, efficient, and scalable Mail Transport Agent (metapackage)
idA sendmail-base - powerful, efficient, and scalable Mail Transport Agent (arch independent files)
c  sendmail-bin - powerful, efficient, and scalable Mail Transport Agent
idA sendmail-cf - powerful, efficient, and scalable Mail Transport Agent (config macros)
p  sendmail-doc - powerful, efficient, and scalable Mail Transport Agent (documentation)

root@277938:~# aptitude search exim4
i   exim4                                                                              - метапакет для упрощения установки Exim MTA (v4)                                              
i A exim4-base                                                                         - общие файлы для всех пакетов Exim MTA (v4)                                                   
i A exim4-config                                                                       - конфигурация для Exim MTA (v4)                                                               
v   exim4-config-2                                                                     -                                                                                              
p   exim4-daemon-heavy                                                                 - Exim MTA (v4) демон с дополнительными возможностями, включая exiscan-acl                     
i A exim4-daemon-light                                                                 - облегчённая версия Exim MTA (v4)                                                             
p   exim4-dev                                                                          - header files for the Exim MTA (v4) packages                                                  
p   exim4-doc-html                                                                     - documentation for the Exim MTA (v4) in html format                                           
p   exim4-doc-info                                                                     - documentation for the Exim MTA (v4) in info format                                           
v   exim4-localscanapi-2.0                                                             -                                                                                      
У меня на сервере установлено и то и другое:

Код: Выделить всё

root@277938:~# which sendmail
/usr/sbin/sendmail

root@277938:~# which exim4
/usr/sbin/exim4
Но использоваться в какой-то момент должно только что-то одно.

Код: Выделить всё

root@277938:~# ps -A | grep sendmail

root@277938:~# ps -A | grep exim4
24938 ?        00:00:00 exim4

Аватара пользователя
Olej
Писатель
Сообщения: 14878
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: отправка почты из скриптов

Непрочитанное сообщение Olej » 30 дек 2019, 19:55

Olej писал(а):
30 дек 2019, 19:05
Прежде всего, во-первых, чтобы посылать почту вообще, на хосте должен быть установлен почтовый агент: sendmail или exim4, на выбор.
Установка и настройка sendmail под Ubuntu
03 июня 2013 г.
Настройка EXIM4 для отправки почтовых сообщений в Linux
Последнее обновление: 07.12.2018

Аватара пользователя
Olej
Писатель
Сообщения: 14878
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: отправка почты из скриптов

Непрочитанное сообщение Olej » 30 дек 2019, 20:20

Olej писал(а):
30 дек 2019, 19:05
Прежде всего, во-первых, чтобы посылать почту вообще, на хосте должен быть установлен почтовый агент: sendmail или exim4, на выбор.
Если мы используем sendmail, то первейшим делом делаем:

Код: Выделить всё

root@277938:~# sendmailconfig
Configure sendmail with the existing /etc/mail/sendmail.conf? [Y]
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Writing configuration to /etc/mail/sendmail.conf.
Writing /etc/cron.d/sendmail.
Configure sendmail with the existing /etc/mail/sendmail.mc? [Y]
Updating sendmail environment ...
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Writing configuration to /etc/mail/sendmail.conf.
Writing /etc/cron.d/sendmail.
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Writing configuration to /etc/mail/sendmail.conf.
Writing /etc/cron.d/sendmail.
Could not open /etc/mail/databases(No such file or directory), creating it.
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Creating /etc/mail/databases...

Checking filesystem, this may take some time - it will not hang!
  ...   Done.

Checking for installed MDAs...
sasl2-bin not installed, not configuring sendmail support.

To enable sendmail SASL2 support at a later date, invoke "/usr/share/sendmail/update_auth"


Creating/Updating SSL(for TLS) information
Creating /etc/mail/tls/starttls.m4...
You already have sendmail certificates


*** *** *** WARNING *** WARNING *** WARNING *** WARNING *** *** ***

Everything you need to support STARTTLS (encrypted mail transmission
and user authentication via certificates) is installed and configured
but is *NOT* being used.

To enable sendmail to use STARTTLS, you need to:
1) Add this line to /etc/mail/sendmail.mc and optionally
   to /etc/mail/submit.mc:
  include(`/etc/mail/tls/starttls.m4')dnl
2) Run sendmailconfig
3) Restart sendmail

Checking {sendmail,submit}.mc and related databases...
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Creating /etc/mail/databases...
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Creating /etc/mail/databases...
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Creating /etc/mail/Makefile...
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Writing configuration to /etc/mail/sendmail.conf.
Writing /etc/cron.d/sendmail.
Disabling HOST statistics file(/var/lib/sendmail/host_status).
Creating /etc/mail/sendmail.cf...
Creating /etc/mail/submit.cf...
Informational: confCR_FILE file empty: /etc/mail/relay-domains
Informational: confCT_FILE file empty: /etc/mail/trusted-users
Updating /etc/mail/access...
Informational: ALIAS_FILE file empty: /etc/mail/aliases
Updating /etc/mail/aliases...
/etc/mail/aliases: 0 aliases, longest 0 bytes, 0 bytes total
Reload the running sendmail now with the new configuration? [Y]
Reloading sendmail ...

Код: Выделить всё

root@277938:/var/mail# systemctl restart sendmail

root@277938:/var/mail# systemctl status sendmail
* sendmail.service - LSB: powerful, efficient, and scalable Mail Transport Agent
   Loaded: loaded (/etc/init.d/sendmail; generated)
   Active: active (running) since Thu 2019-12-26 16:26:50 MSK; 2s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 21956 ExecStart=/etc/init.d/sendmail start (code=exited, status=0/SUCCESS)
    Tasks: 1 (limit: 544)
   Memory: 7.2M
   CGroup: /system.slice/sendmail.service
           `-22042 sendmail: MTA: accepting connections

Dec 26 16:26:46 277938.local systemd[1]: Starting LSB: powerful, efficient, and scalable Mail Transport Agent...
Dec 26 16:26:47 277938.local su[22029]: (to smmsp) root on none
Dec 26 16:26:47 277938.local su[22029]: pam_unix(su:session): session opened for user smmsp by (uid=0)
Dec 26 16:26:48 277938.local su[22029]: pam_unix(su:session): session closed for user smmsp
Dec 26 16:26:48 277938.local sm-mta[22042]: starting daemon (8.15.2): SMTP+queueing@00:10:00
Dec 26 16:26:50 277938.local sendmail[21956]: Starting Mail Transport Agent (MTA): sendmail.
Dec 26 16:26:50 277938.local systemd[1]: Started LSB: powerful, efficient, and scalable Mail Transport Agent.
После этого мы можем отправлять почту из терминала:

Код: Выделить всё

root@277938:/etc/php/7.3/apache2# php -r "mail('o.tsiliuric@yandex.ru', 'test from server', 'test');"
You have new mail in /var/mail/root
На приёмной стороне получим:
От: root@277938.local
Тема: test from server
Кому: o.tsiliuric@yandex.ru
Или отправляем так:

Код: Выделить всё

root@277938:/etc/php/7.3/apache2# echo "Тестовое письмо" | sendmail 'o.tsiliuric@yandex.ru'
От: root@277938.local
Тело: Тестовое РїРёСЃСЊРјРѕ
Видно, что это сообщение в UTF-8 отображается в какой-то байтовой кодировке, искажается...

Аватара пользователя
Olej
Писатель
Сообщения: 14878
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: отправка почты из скриптов

Непрочитанное сообщение Olej » 30 дек 2019, 21:16

Позже техподдержка нашего хостера перевела работу на exim4:

Код: Выделить всё

root@277938:~# systemctl status exim4
● exim4.service - LSB: exim Mail Transport Agent
   Loaded: loaded (/etc/init.d/exim4; generated)
   Active: active (running) since Sun 2019-12-29 21:21:25 MSK; 23h ago
     Docs: man:systemd-sysv-generator(8)
    Tasks: 1 (limit: 544)
   Memory: 8.1M
   CGroup: /system.slice/exim4.service
           └─24938 /usr/sbin/exim4 -bd -q30m

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
Утверждают, что он проще в настройках.
Важно, для контроля принимающей стороной актуальных мэйлов, настройки записей DNS для хоста. Я в этом ничего не понимаю, но только фиксирую:

Код: Выделить всё

Список DNS-записей
Хост	Тип	Значение
_domainkey.linux-ru.ru	TXT	t=s; o=~;	 
_dmarc.linux-ru.ru	TXT	v=DMARC1; p=none	 
linux-ru.ru	A	185.178.47.95	 
linux-ru.ru	TXT	v=spf1 a mx ~all
Отправка почты:

Код: Выделить всё

root@277938:~# php -r "mail('o.tsiliuric@yandex.ru', 'Тестовое письмо с вашего сайта', 'Привет.' );"
root@277938:~# php -r "mail('olej-tsil@yandex.ru', 'Тестовое письмо с вашего сайта', 'Привет.' );"
root@277938:~# php -r "mail('olej@rambler.ua', 'Тестовое письмо с вашего сайта', 'Привет.' );"
root@277938:~# php -r "mail('olej.tsil@mail.ru', 'Тестовое письмо с вашего сайта', 'Привет.' );"
root@277938:~# php -r "mail('olej.tsil@gmail.com', 'Тестовое письмо с вашего сайта', 'Привет.' );"
root@277938:~# php -r "mail('olej.tsil@yahoo.com', 'Тестовое письмо с вашего сайта', 'Привет.' );"
Или так:

Код: Выделить всё

root@277938:~# echo "тестирование нового Exim4" | mail -s 'тест' o.tsiliuric@yandex.ru
Все домены приняли и показали письма.
Но некоторые (большинство из них в Thunderbird) представляют тело письма как:
тестирование нового Exim4
Т.е. осталось разобраться с кодировкой UTF-8.

Аватара пользователя
Olej
Писатель
Сообщения: 14878
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: отправка почты из скриптов

Непрочитанное сообщение Olej » 30 дек 2019, 21:28

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

Аватара пользователя
Olej
Писатель
Сообщения: 14878
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: отправка почты из скриптов

Непрочитанное сообщение Olej » 31 дек 2019, 00:18

Olej писал(а):
30 дек 2019, 21:16
Т.е. осталось разобраться с кодировкой UTF-8.
Скрипт PHP для Linux, где всё и вся представляется в UNICODE UTF-8:

Код: Выделить всё

root@277938:~# cat test2.php 
<?php
    ini_set( 'display_errors', 1 );
    error_reporting( E_ALL );
    $to = "o.tsiliuric@yandex.ru";
    $subject = "Тестовое письмо с вашего сайта, Привет";
    $message = "Текст письма русскоязычный";
    $from = "script@linux-ru.ru";
    $type = "text/plain; charset=utf-8";
    $headers = "From:" . $from . "\n" . "Content-Type:" . $type;
    mail( $to, $subject, $message, $headers );
    echo "Test email sent\n";
?>

Отправка:

Код: Выделить всё

root@277938:~# php test2.php 
Test email sent
На приёмном конце получаем (Thunderbird):
От: script@linux-ru.ru
Тема: Тестовое письмо с вашего сайта, Привет
Кому: o.tsiliuric@yandex.ru
Текст письма: Текст письма русскоязычный
Вот теперь это то что надо!

Ответить

Вернуться в «Управление WEB ресурсами»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость