Электронные письма, отправленные с общего хостинга, заблокированы. Есть ли способ избежать этого? - PullRequest
2 голосов
/ 30 августа 2009

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

Аккаунтами, которые доставляют мне больше проблем, являются comcast.net, uol.com, mchsi.com и другие! Я связался с центром поддержки этих поставщиков услуг электронной почты и попросил удалить мой ip из черного списка.

Заголовок письма выглядит так:

$header = "Sender: $from_mail\n";
$header .= "From: Account <$from_mail>\n";
$header .= "Reply-To: Account <$from_mail >\n";
$header .= "Content-Type: multipart/mixed; boundary=$mixed_boundary\n";
$header .= "Mime-Version: 1.0\n";
$header .= "X-Mailer: PHP/".phpversion()."\n";

$body = "\n--$mixed_boundary\n";
.
.
.
.
$body .= "\n\n--$mixed_boundary--";

mail($to, $subject, $body, utf8_encode($header), "-f$from_mail");

Есть что-то, что я могу попытаться избежать этой проблемы? Кто-то знает, где я могу узнать, какой IP-адрес сервера используется для доставки электронной почты, если рассматривать функцию PHP mail ()?

Заранее спасибо за ваши ответы !!!


Привет

до сих пор некоторые службы электронной почты, такие как Comcast, продолжают блокировать мои IP-адреса, говоря, что мой почтовый сервер отправляет спам ... Я запросил удаление из черного списка, но их система продолжает блокировать их! Я не знаю, что еще я могу сделать ... Я последовал вашим предложениям и код выглядит так:

$md5 = md5(date('r', time()));
$mixed_boundary = "PHP-Mixed-$md5";
$alt_boundary = "PHP-Alt-$md5";

$header = "Sender: $from_mail\r\n";
$header .= "Errors-To: $from_mail\r\n";
$header .= "From: account <$from_mail>\r\n";
$header .= "Reply-To: $from_mail\r\n";
$header .= "Content-Type: multipart/mixed; boundary=$mixed_boundary\r\n";
$header .= "Mime-Version: 1.0\r\n";
$header .= "X-Mailer: PHP/".phpversion()."\r\n";

$body = "\n--$mixed_boundary\n";
$body .= "Content-Type: multipart/alternative; boundary=$alt_boundary\n";
.
.
.
.
$body .= "--$mixed_boundary\n";
$body .= "Content-Disposition: attachment filename=\"...\"\n";
$body .= "Content-Type: application/octet-stream; x-unix-mode=0644; name=\"...\"\n";
$body .= "Content-Transfer-Encoding: base64\n";
.
.
.
.
$body .= "\n\n--$mixed_boundary--";


mail($to, $subject, $body, utf8_encode($header), "-f$from_mail");

Предложения

Еще раз спасибо!

Ответы [ 6 ]

4 голосов
/ 25 октября 2009

Позвольте мне объяснить битву, с которой вы столкнулись. Забудьте о технических деталях на минуту. Существуют сотни провайдеров электронной почты. Крупными из них являются Yahoo, Gmail, AOL, Hotmail и т. Д. Если вы заблокированы какой-либо из этих служб, это может серьезно повлиять на ваш бизнес.

Эти провайдеры электронной почты чрезвычайно обеспокоены спамом, и в целях борьбы со спамом сделали все возможное, чтобы блокировать любые сообщения, которые могут быть спамом. Вы, возможно, никогда не получите жалобы на спам, но если другое предприятие в вашем плане общего хостинга получит жалобы на спам, вы будете иметь дело. Не имеет значения, как вы настраиваете свое приложение, если вы находитесь на подозрительном IP-адресе спама, ваши сообщения будут отправляться в папку спама.

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

Единственное решение заключается в передаче вам электронной почты на аутсорсинг. Такие компании, как Aweber или iContact, занимаются вопросами доставки электронной почты. Они имеют отношения со всеми основными поставщиками электронной почты и прилагают все усилия, чтобы ваши сообщения попадали в почтовые ящики получателей. Вам больше не нужно беспокоиться о том, чтобы связаться с Yahoo или Gmail, потому что кто-то нажал кнопку спама. Вы можете сосредоточиться на более важных вещах.

3 голосов
/ 30 августа 2009

Ваши заголовки сообщений недопустимы в соответствии с RFC2822 Интернет-формат сообщений .

С 2.1 Общее описание:

Сообщения делятся на строки символов. Линия - это серия символы, разделенные двумя символами возврата каретки и перевод строки; то есть символ возврата каретки (CR) (ASCII значение 13), за которым сразу следует символ перевода строки (LF) (ASCII значение 10). (Пара «возврат каретки / перевод строки» обычно записывается в этот документ как "CRLF".)

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

РЕДАКТИРОВАТЬ: Хотя использование "\ r \ n" рекомендуется в документации PHP для функции mail (), есть некоторые дебаты о том, действительно ли это правильно делать .

Функция mail () будет связываться с локальной командой sendmail (8) (или с настройками, указанными в sendmail_path), и окончания строк могут обрабатываться по-разному в зависимости от используемой реализации агента передачи почты. , Насколько я понимаю, sendmail (8) должно быть в порядке с "\ r \ n", но qmail (7) , например, заменит "\ r \ n" на "\" r \ r \ n ", что, вероятно, прервет сообщение.

Все это происходит до того, как письмо доставляется в конечный пункт назначения, поэтому можно легко проверить, правильно ли обработаны окончания строк, отправив себе сообщение электронной почты, созданное с помощью "\ r \ n", и проверив, что все заголовки присутствуют.

См. Также: RFC2822 , Функция PHP mail () , sendmail (8) , qmail (7)

3 голосов
/ 30 августа 2009

Вы можете отправить себе электронное письмо и проверить заголовки. Это даст вам представление о пути, по которому может идти электронное письмо, но на самом деле ничто не мешает электронным письмам на другие домены проходить по другому пути.

В целом, у этих крупных интернет-провайдеров действительно мощные спам-фильтры, поэтому отправлять им письма с общего хоста будет непросто. Если вы можете получить свой собственный IP-адрес и отправлять почту оттуда, это, вероятно, поможет. Затем вы можете настроить SPF-записи . Никаких гарантий, но это, безусловно, немного поднимет вас из ямы коммерческих спамеров.

Вы также можете покопаться с текстом ссылки и некоторыми другими антиспам-сервисами и посмотреть, делаете ли вы что-то еще неправильно.

Просьба клиентов добавить ваш адрес в свой белый список спама, вероятно, тоже не повредит.

2 голосов
/ 30 августа 2009

Я обнаружил, что настройка заголовков Return-Path, Sender и Errors-To помогает в некоторых случаях.

0 голосов
/ 22 октября 2009

Используйте PHPMailer (http://phpmailer.worxware.com/) для создания почтовых сообщений. Возможно, это не IP, а что-то другое. Есть много вещей, где спам-фильтры реагируют на аллергию (например, отсутствует Message-ID и т. Д.).Кроме того, с PHPMailer у вас есть возможность отправлять почту по почте () или, если она не работает из-за проблем общего хостинга через SMTP через другой хост (например, Gmail).

0 голосов
/ 22 октября 2009

Я заметил, что на моем хост-сервере Linux мне нужно заменить все вхождения CRLF на LF как в дополнительных, так и в смешанных / альтернативных заголовках. Об этом PHP документация гласит:

"Если сообщения не получены, попробуйте использовать только LF (\ n). Некоторые некачественные агенты пересылки почты Unix заменяют LF на CRLF автоматически (что приводит к удвоению CR, если используется CRLF). Это должно быть последнее средство, так как оно не соответствует »RFC 2822."

Я пытался отправить письмо (только с "\ n") на свой личный счет, и я искал "\ r" и "\ n" в необработанном сообщении ... каждая строка заканчивается CR и начинается с "\ n"!

ВОПРОС: Как сказано в документации PHP mail (), я использую функцию wordwrap (), чтобы сократить длину строки до 70 символов. Существует обходной путь, позволяющий почтовому клиенту отображать сообщение в оригинальном формате, а не в виде столбца, где каждая строка не длиннее 70 символов?

ОТВЕТ [РЕШЕНИЕ]: Я решил настроить для печати в кавычках как Content-Transfer-Encoding:

$body .= "Content-Transfer-Encoding: quoted-printable\n";
$body .= "Content-Type: text/plain;\n\tcharset=utf-8;\n\tformat=flowed;\n\tdelsp=yes\n";

$body .= "\n" . quoted_printable_encode($message);

Функция quoted_printable_encode () доступна только в PHP 5.3, реализация подходит на странице документации .

...