Отправка вложенных в MIME сообщений электронной почты с именами файлов utf-8

Здравствуйте, дорогие люди,

Последние 3 дня я потратил на поиск ответа в Интернете, но не смог найти ни одного.
Я нашел много «почти» случаев, но ни один не был именно тем, что я искал.

Я могу получить тему и текст сообщения на иврите, но не могу получить имя прикрепленного файла на иврите.

Кстати, я не заинтересован в сторонних программах, таких как PHPMailer и т. Д.

Вот что я получаю:

W_W (W’W_W_.pdf

Вот что я хочу получить:

שלום. PDF

Вот мой код, очень простой ..

$boundary = uniqid("HTMLEMAIL");
$separator = md5(time());
$eol = PHP_EOL;

// attachment name
$fileName = "שלום.pdf";
var_dump($fileName);

$pdfdoc = $pdf->Output("", "S");
$attachment = chunk_split(base64_encode($pdfdoc));

// main header (multipart mandatory)
$headers = [];
$headers[] = "From: $from";
$headers[] = "MIME-Version: 1.0";
$headers[] = "Content-Type: multipart/mixed; boundary=\"".$separator."\"";
$headers[] = "This is a MIME encoded message.";

// message
$msg = "--".$separator.$eol;
$msg .= "Content-Type: text/html; charset=UTF-8".$eol;
$msg .= "Content-Transfer-Encoding: base64".$eol.$eol;
$msg .= chunk_split(base64_encode($message)).$eol.$eol;

// attachment
$msg .= "--".$separator.$eol;
$msg .= "Content-Type: application/pdf; name=\"".$fileName."\"".$eol;
$msg .= "Content-Transfer-Encoding: base64".$eol.$eol;
$msg .= "Content-Disposition: attachment".$eol;
$msg .= $attachment.$eol;
$msg .= "--".$separator."--";

mail($to,'=?UTF-8?B?'.base64_encode($subject).'?=', $msg, implode("\n\r", $headers));

1

Решение

Согласно RFC2047 в параметрах заголовка Content-Type не должно быть кодировок, отличных от ascii.

Согласно RFC2231 вы можете попытаться определить расширенный параметр:
Content-Type: application/pdf; name*=utf-8''%D7%A9%D7%9C%D7%95%D7%9D%2E%70%64%66

Я понятия не имею, насколько хорошо это поддерживается.

Я не могу придумать oneliner для этого, но вы можете попробовать адаптировать этот PHP преобразовать строку в шестнадцатеричное и шестнадцатеричное в строку

Обновление согласно комментариям:
Хотя спецификация явно запрещает это, большинство почтовых клиентов должны понимать следующий формат
'name="?UTF-8?B?' . base64_encode($filename) . '?='

Я предлагаю вам использовать его ради здравомыслия.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]