Почему я не должен использовать функцию PHP mail()?

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

То, что я хочу знать, являются фактическими причинами и недостатками в использовании mail() через библиотеку или расширение. Например, обычно указанные заголовки, которые не включены в стандарт mail() вызов.

4 ответа

Решение

Цитирование:

Недостатки PHP mail() функция

В некоторых случаях письма отправляются через PHP mail() не получили получателей, хотя они были отправлены WB без каких-либо сообщений об ошибках. Наиболее распространенные причины этой проблемы перечислены ниже.

  • неправильный формат почтового заголовка или содержимого (например, различия в разрыве строки между Windows / Unix)
  • sendmail не установлен или не настроен на вашем сервере (php.ini)
  • почтовый провайдер рецепта не разрешает отправлять почту через PHP mail(); общая защита от спама

Ошибки в формате заголовка или содержимого могут привести к тому, что письма будут рассматриваться как СПАМ. В лучшем случае такие письма передаются в папку со спамом папки входящих сообщений получателя или отправляются обратно отправителю. В худшем случае такие письма удаляются без каких-либо комментариев. Если sendmail не установлен или не настроен, никакие письма не могут быть отправлены вообще.

Бесплатный почтовый провайдер, такой как GMX, часто отклоняет письма, отправленные через функцию PHP. mail(), Очень часто такие письма удаляются без какой-либо информации получателя.

РНР mail() говорят искажать заголовки и работает медленно. Я не могу сказать это из личного опыта, потому что я никогда не использовал это, потому что, как и вы, мне всегда советовали против этого. Если вы посмотрите на комментарии к записи для mail() В руководстве по PHP вы можете увидеть некоторые проблемы, с которыми сталкиваются люди (особенно с заголовками).

Это определенно не подходит для отправки какого-либо существенного количества электронной почты, потому что, согласно самому руководству,

Стоит отметить, что функция mail() не подходит для больших объемов электронной почты в цикле. Эта функция открывает и закрывает сокет SMTP для каждого электронного письма, что не очень эффективно.

Для отправки большого количества сообщений электронной почты см. Пакеты "PEAR::Mail и" PEAR::Mail_Queue.

AFAIK, никогда не бывает предпочтительным (с точки зрения производительности) открывать и закрывать сокет для каждого отправляемого сообщения, независимо от количества отправляемой почты.

По сути, это функция, которая работает, но не очень хорошо, и затмевается рядом лучших библиотек.

Важна не только функция mail(), но и SMTP-сервер, который вы используете совместно. Я использовал три разных сервера smtp с php: postfix, qmail,sendmail.

По моему опыту, postfix был самым простым для работы с php mail(), но даже у postfix были некоторые проблемы. Вы столкнетесь с небольшими ошибками. Это могут быть такие вещи, как получатели "to", получающие правильно структурированные письма, и получатели "bcc", получающие испорченные письма. Вы потеряете много времени, пытаясь выяснить эти ошибки. И ваши исправления приведут к тому, что ваш код не будет работать должным образом с другими серверами smtp.

Проблема заключается в обработке заголовка письма, и PHP, к сожалению, плохо справляется с этим. Недавно я перешел на библиотеку "PHP Mailer". На нашем сайте у нас есть два сервера smtp, один с postfix, а другой с qmail. "PHP Mailer" работал с ними обоими без дополнительной настройки.

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

Другие вопросы по тегам