Как изменить имя отправителя в mail() при использовании ssmtp?

128
02 мая 2021, 03:00

Не как не могу разобраться с именем отправителя. У меня nginx, debian, ssmtp, php

Отправляю письмо при помощи:

$to = "awikong@mail.ru";
$subject = "Заголовок";
$message = "<b>Привет</b>";
$headers = "Content-type:text/html; charset = utf-8 \r\n";
$headers .= "From: admin@boosteam.ru";
$headers .= "Reply to admin@boosteam.ru";
mail($to, $subject, $message, $headers);

Но имя отправителя всегда одно и тоже: www-data

Как изменить имя отправителя?

Такие у меня настройки ssmtp.conf:

root=admin@boosteam.ru
rewriteDomain=boosteam.ru
mailhub=smtp.yandex.ru:465
hostname=boosteam.ru
UseTLS=YES
AuthUser=admin@boosteam.ru
AuthPass=*******
FromLineOverride=YES

revaliases:

root:admin@boosteam.ru:smtp.yandex.ru:465
UserUbuntu:admin@boosteam.ru:smtp.yandex.ru:465
www-data:admin@boosteam.ru:smtp.yandex.ru:465

В php.ini:

sendmail_path = /usr/sbin/ssmtp -t
Answer 1

Я разделяю проблему на две части, нужно последовательно проверить следующее:

1. Ошибка на стороне PHP при подготовке писем

Посмотрим какие письма отправляются (нас в данном случае интересует поле From:).

Для этого в командной строке создадим файл /var/tmp/dump.sh, который будет дампить все письма, которые должны приходить MTA в файл /var/tmp/mail.eml. Этот файл будет содержать текст последнего отправленого письма.

tee /var/tmp/dump.sh > /dev/null <<\EOF
#!/bin/bash
cat - > /var/tmp/mail.eml
EOF
chmod 775 /var/tmp/dump.sh

Затем временно заменим в php.ini MTA:

sendmail_path = /var/tmp/dump.sh

Теперь нужно перезапустить веб-сервер (для cli-варианта этого делать не нужно) и отправить пробное письмо из PHP. Его текст можно получить так:

cat /var/tmp/mail.eml

Будет что-то похожее на это:

To: yyyyyyyy@site.ru
Subject: =?windows-1251?B?zvLx8/Lx8uLz5fIg4vvj8PPn6uA=?=
X-PHP-Originating-Script: 509:tools.php
From: XXXX <xxxxxxxx@site.ru>
Reply-To: xxxxxxxx@size.ru
...

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

Замечание. Выяснить, какие php.ini используется можно так:

  • для командной строки (SAPI интерфейс): php --ini
  • для "www": разместить phpinfo(); в скрипте
2. MTA неправильно отправляет письма

Вначале стоит убедиться, что используется именно тот MTA:

sudo netstat -ntlp | grep 25

Получится что-то похожее:

tcp   0  0 127.0.0.1:25       0.0.0.0:*     LISTEN      3483/exim4      
tcp6  0  0 ::1:25             :::*          LISTEN      3483/exim4

Обычно сразу пишется название запущенной программы (тут - exim). Если нет, ее можно выяснить по PID: sudo cat /proc/3483/cmdline

sSMTP

Пакет в Debian больше не поддерживается

Поправить файл ssmtp.conf:

  • sendmail_path = /usr/sbin/ssmtp -t -fname - можно указать отправителя через -fname, но это будет работать только если не указывать в письме поле From: - не наш случай
  • В файле /etc/ssmtp/revaliases можно определить алиасы (для веба почта отправляется от пользователя, под которым запущен PHP, обычно это www-data) - не наш случай, так как включен FromLineOverride=YES
  • FromLineOverride=YES (по-умолчанию опция закоментирована через #) - эта опция заставляет в качестве отправителя использовать заголовок From:, который был сформирован в PHP.

После изменения конфига необходимо перегрузить демона.

EXIM

Exim может переписывать заголовки. Так можно проверить поведение правил перезаписи:

 exim -brw ph10@exim.workshop.example

Исправляется в секции begin rewrite. Обычно конфигурация находится в /etc/exim/exim.conf. Более подробно - в документации

READ ALSO
Ширина столбца в PhpSpreadsheet

Ширина столбца в PhpSpreadsheet

спасайте, потому, что это хаос блин

134
Как отправить куки в middleware Laravel?

Как отправить куки в middleware Laravel?

Как отправить куки непосредственно в мидлвере? Вариант

92
Забрать текст между &lt;BR&gt; регулярка php

Забрать текст между <BR> регулярка php

Например, есть произвольные данные вида:

75
Telegram получить id пользователя имея username

Telegram получить id пользователя имея username

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

117