Какое Content-Transfer-Encoding я должен использовать при отправке PHP-почты (), содержащей длинную http-ссылку? - PullRequest
8 голосов
/ 02 апреля 2012

У меня есть скрипт, который отправляет электронные письма, которые выглядят примерно так:

$headers = "From: test@example.com\r\n";
$headers .= "Reply-To: test@example.com\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=utf-8\r\n";
$headers .= "Content-Transfer-Encoding: 8bit";
$orgsubject = "A subject with some swedish characters like å, ä and ö";
$newsubject='=?UTF-8?B?'.base64_encode($orgsubject).'?=';
$body = 'A lot of text.

Some more text.

A long URL:
http://example.com/subpage/?id=1234&hash=23jh4lk2j3h4lkjh674598xzxlk2j34h&anotherhash=h2k3j4h23kh42kj34h2lk3';

Он тщательно протестирован, но некоторые пользователи, я думаю, пользователи Outlook, получают URL, похожий на этот: http://example.com/subpage/?id=3D1234&hash=3D3D23jh4lk2j3h4lkjh674598xzxlk2j34h&anotherhash=3Dh2k3j4h23kh42kj34h2lk3 После знака равенства следует «3D», что делает URL-адрес бесполезным в моем случае.Я думаю, это как-то связано с Content-Transfer-Encoding или, возможно, Content-type. Нужно ли мне кодировать тело сообщения в base64 или что-то в этом роде?

Обновление

Только что нашел этосообщение на форуме: https://stackoverflow.com/a/7289434/513321 Итак, я удалил Content-Transfer-Encoding, и он, кажется, работает нормально, но с другой стороны, я никогда не смог воспроизвести ошибку, когда URL содержал текст «3D», поэтому я не могубудьте уверены, что это сработает.Кто-нибудь знает, решит ли мою проблему удаление Content-Transfer-Encoding?

1 Ответ

3 голосов
/ 20 января 2014

В вашем вопросе об этом нет упоминания, но =3D является escape-последовательностью цитируемой передаваемой кодировки для печати; он используется для безопасной передачи 8-битных данных с использованием 7-битной кодировки.

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

Начиная с версии 5.3.0, вы можете использовать quoted_printable_encode() для кодирования вашего сообщения и соответственно установить заголовок Content-Transfer-Encoding:

Content-Transfer-Encoding: quoted-printable

Установка явной кодировки передачи - это хорошая практика, которую вы должны принять, а не наивный подход «как-то работает»:)

...