На хостинге не работает функция mail php разберем детали


настройка open server для функции mail



Отправка e-mail в PHP

Обычно я пишу вступление о том, почему данная тема так важна для изучения. Но не в этот раз, потому что здесь, уверен, ни у одного человека не возникнет вопрос: Зачем отправлять e-mail в PHP?. Поэтому предлагаю сразу приступить к делу и узнать об этом более подробно, тем более, что проще реализации отправки e-mail через PHP и придумать нельзя, так что поймут даже те, кто не знаком с PHP вообще.

Для начала давайте с Вами разберёмся немного с теорией. Скучно, но поверьте важно. Для отправки e-mail необходим SMTP-сервер. На большинстве платных хостингах он обязательно имеется. Однако, если такой возможности нет (допустим, хостинг бесплатный или очень дешёвый), то тогда можно воспользоваться сторонним SMTP-сервером (например, mail.ru). То есть главное: для отправки необходим SMTP-сервер.

Во-вторых, чтобы принимать e-mail необходим POP-сервер. К чему я всё это говорю. А к тому, что очень часто люди спрашивают на форумах: Почему у меня не работает отправка e-mail в PHP?. А при этом люди пытаются отправить письма с сервера, на котором вообще нет SMTP. Очень важно: PHP e-mail не отправляет! Отправляет e-mail приложение sendmail, которое имеется на операционных системах Unix, на которых и стоят большинство серверов. А PHP просто передаёт команды этому приложению. Надеюсь, объяснил понятно. Поэтому первое, что необходимо сделать - это раздобыть приложение sendmail. Но порадую тех, кто пользуется пакетом Denwer, так как у них это приложение уже встроено. Правда, с одной особенностью. Реальной отправки писем не происходит - они все складываются в директорию tmp/!sendmail. Но если письмо, которое Вы отправили в PHP, там оказалось, то можете быть уверены, что на 99% на реальном хостинге всё будет работать. Хотя, если Вам очень хочется по-настоящему отправлять e-mail, то Вы можете скачать sendmail, настроить его на какой-нибудь SMTP-сервер, например, mail.ru, затем изменить путь к sendmail в php.ini (настройки PHP) и дальше уже радоваться жизни.

А теперь переходим к PHP. Для отправки e-mail используется всего одна функция - mail(). Принимает эта функция четыре параметра, три из которых являются обязательными:

Как видите, всё интуитивно понятно: кому отправлять, какая тема и само сообщение. Если Вы используете пакет Denwer, то после запуска скрипта, Вы сможете найти файл в директории tmp/!sendmail, в котором и содержатся данные Вашего письма. Открыть эти файлы можно либо в блокноте, но лучше открыть их в какой-нибудь почтовой программе (например, The Bat или Microsoft Outlook).

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

Теперь давайте расшифрую то, что здесь написано. В переменной headers мы задали следующие параметры: в поле От кого будет стоять abc@gmail.com (то есть сообщения можно отправлять далеко не от своего имени). Сообщение также является обычным текстовым (text/plain) в кириллической кодировке (windows-1251), то есть в нашей с Вами родной кодировке, в которой имеется русский язык и английский. И, кстати, /n - это переход на новую строку (аналог
в HTML).

Также сообщения можно отправлять в HTML-формате. Для этого достаточно всего лишь заменить text/plain на text/html. И Вы сможете в сообщении использовать HTML-теги. Только не забывайте, что всякие теги, наподобие:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 20 ):

    А как сделать автоматическое сообщение вот такие сообщения например это вместо_этого_текста_приклепленный_фаил Вот файл который вы заказали с вместо_этого_текста_название_сайта. Если вы не заказывали данный файл просто игнорируйте это сообщение. или вместо_этого_текста_имя_пользователя на ваш комментарий ответили!?

    Для этого надо делать шаблон письма, например, такой: %user% на Ваш комментарий ответили. Затем через PHP перед отправкой надо заменить с помощью функции str_replace %user% на конкретное имя пользователя.

    Спасибо, но вопрос был как сделать письмо чтобы автоматический приходило всем зарегистрированным, или каким-то особенным пользователям, или вообще просто любым.

    Это надо сделать в цикле. Если же пользователей много, то здесь всё гораздо сложнее, так как сервер может не выдержать. Для отправки письма большому количеству пользователей нужно запускать скрипт много раз, каждый раз отправляя небольшие партии. Например, при первом запуске отправить 20 писем. При втором ещё 20, при третьем ещё 20 и так далее, пока не будут отправлены все письма. Интервал надо делать хотя бы 30 секунд.

    А если написать /r/nContent-type: text/html, charset=windows-1251 /r/n, mail ($to, $subject, $message, $headers), ?> то письмо отправится на почтовые ящики 1, 2, 3? И как сделать такое уведомление автоматическое, например пользователь отправил письмо на форум, и ему на почтовый ящик такое письмо Вы отправили новое сообщение на форум вместо_этого_текста_название_сайта?

    Да, письмо дойдёт до всех трёх ящиков. Однако, минус данного способа: каждый из получателей увидит адреса других получателей. Сделать уведомление автоматическим элементарно. Например, при добавлении нового сообщения на форум, надо вызвать функцию mail(). Тогда сразу же придёт уведомление.

    Спасибо, а как сделать каждый из получателей не видел адрес других получателей? Или можете сказать как Вы делали такие уведомления?

    Надо через цикл (например, for) по очереди вызывать функцию mail, каждый раз отправляя одному получателю.

    Михаил, очень нужна ваша помощь. на моём тестовом хостинге не работает функция mail, но там можно через сторонний SMTP сервер. Расскажите как им пользоваться,и как его настроить. Прошу расскажите мне или напишите статью. Оооочень надо

    Проверьте можно ли на хостинге прямо указать сторонний SMTP, чтобы функция mail на него отправляла. Либо поищите скрипты, которые будут сами отправлять почту в обход стандартной функции.

    извините за нелепый вопрос: а как на этот скрипт попадает пользователь? ведь РНР сидит и работает на сервере. и можно ли каким то образом РНР-скрипты вставлять в HTML страницы.

    Пользователь к нему обращается, отправляя запрос. В HTML-страницах нельзя использовать PHP, но в PHP-коде можно использовать HTML.

    Функция mail PHP – главный почтальон интернета

    Дата публикации: 2016-09-01

    От автора: мой пятилетний племянник разгадал тайную причину изобретения электронной почты. Просто человеку надоело бегать за почтальоном, чтобы отправить письмо. Так и появились электронные почтовые ящики. Тогда получается, что функция mail PHP была разработана авторами языка потому, что им лень было заходить каждый раз на email, чтобы отправить очередное электронное письмо.

    Что за функция такая?

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

    Также хочу отметить, что настройка функции mail PHP на сервере происходит в соответствующем разделе файла конфигурации php.ini. Настроек всего несколько. Они устанавливают значение заголовков по умолчанию, задают путь к лог-файлам, порт и т.д.

    Всего функция mail() принимает 5 аргументов, хотя обязательными являются всего 3:

    Бесплатный курс по PHP программированию

    Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

    В курсе 39 уроков | 15 часов видео | исходники для каждого урока

    Если используете Денвер, то ищите все отправленные письма по этому пути на виртуальном диске: Z:/tmp/!sendmail

    Другие особенности mail()

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

    Отправляемое email должно содержать установленный заголовок From, который задается через 4 (необязательный) параметр additional_headers. Его отсутствии может стать причиной того, что функция mail PHP не будет работать.

    Бесплатный курс по PHP программированию

    Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

    В курсе 39 уроков | 15 часов видео | исходники для каждого урока

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

    Некоторые почтовые агенты, работающие на Unix, могут автоматически заменять /n на /r/n. В результате заголовки разделяются двумя символами перевода строки и одним переводом каретки, что может привести к выводу ошибки. Если email не отсылается, попробуйте разделить все хедеры одним символом /n. Но помните, что такой синтаксис является нарушением существующих стандартов.

    Длина каждой строки не должна быть больше 70 символов. Строки между собой разделяются сочетанием управляющих символов /r/n.

    Если функция «не фурычит»

    Проще всего настроить отправку писем на локальном сервере. После тестирования в Денвере проверенный скрипт может не работать на «настоящем» сервере. Одной из причин того, почему не работает функция mail PHP на вашем хостинге, может быть отсутствие указанного почтового ящика отправителя. В таком случае лучше проверить корректность заданного «мыла», заданного в панели управления хостингом.

    Если ваш сайт развернут на основе одной из современных CMS, то в них адрес почтового ящика отправителя задается в специальном модуле, отвечающем за рассылку email.

    Кроме этого функция mail() может не работать, если в php.ini она занесена в раздел запрещенных «к употреблению» (disable_functions). Чтобы не рыскать как угорелому по содержанию этого (довольно объемного) файла, лучше использовать функцию phpinfo(), которая выводит все параметры языка в специальной таблице.

    Для проверки функции mail в PHP имеет смысл использовать простенький отладочный код. Его следует разместить в новом файле в корневой директории сайта на серверном пространстве:

    Настройки функции mail в PHP. Почему не работает mail в PHP?

    Какой бы интернет-проект на PHP вы не сделали, на нём должна быть форма обратной связи, что особенно актуально для проектов коммерческого направления. А значит, вам не обойтись без функции mail. Что же, давайте посмотрим, как использовать эту функцию для отправки сообщений.

    Лирическое отступление

    Прежде чем двигаться дальше, давайте немного вспомним теорию. Во-первых, чтобы отправлять письма нам потребуется SMTP-сервер. Но это не проблема, т. к. он есть практически на всех современных платных хостингах. Во-вторых, для приёма писем нам понадобится POP-сервер. В-третьих, следует понимать, что сам по себе PHP не отправляет сообщение, а лишь передаёт команды приложению sendmail — именно оно занимается отправкой, следовательно, его нужно иметь (если используете Денвер, то данное приложение уже встроено). В-четвёртых, все сообщения помещаются в директорию под названием «tmp/!sendmail».

    Настройка mail в PHP

    Настройка функции mail в PHP выполняется в конфигурационном файле php.ini. В этом файле нужно прописать путь к лог-файлам, а также задать значения порта.

    Mail принимает 5 аргументов, три из которых являются обязательными, вот они: 1) адрес отправителя, 2) текст сообщения, 3) тайтл письма.

    Если вы являетесь веб-мастером и используете Денвер, то информация, которая будет вами отправлена, сохранится на виртуальном диске Z в папке «tmp!sendmail».

    Особенности использования mail в PHP

    Работа функции mail в PHP зависит от ряда нюансов, включая вид операционной системы, выполненные настройки и параметры. Вот некоторые особенности: — во время отправки письма заголовок Form задаётся через необязательный параметр «additional_headers». Если его нет, нередко возникает ошибка при отправлении, — заголовки разделяйте символами перевода на новую строку и перевода каретки (/r/n), — следите, чтобы длина строки не превышала 70 знаков, для регулировки тоже используйте (/r/n).

    Что делать, когда функция mail в PHP не отправляет письма?

    Даже если учесть всё вышеперечисленное, mail в PHP иногда не работает, причём на локальном сервере всё отправляется нормально. Одна из причин — некорректная настройка функции непосредственно на хостинге. Для решения проблемы рекомендуется обратиться к конфигурационному файлу php.ini и посмотреть на параметры функции «disable_functions». Дело в том, что нужная вам функция mail() может не работать, если она занесена в php.ini в раздел запрещённых (disable_functions).

    Идём дальше. Мы можем проверить работоспособность, написав простой код и разместив его в корневом каталоге созданного веб-проекта:

    Если всё функционирует верно, на экране браузера мы увидим цифру один — «1». Её нам вернёт «print» после выполнения. Что касается кодировки, то рекомендуется использовать UTF-8.

    Важный момент! Если вы в качестве локального сервера используете OpenServer, то письма будут сохраняться в папке C:/openserver/userdata/temp/email. Естественно, если вы его установили на локальный диск «С».

    Отправка с вложением

    Давайте посмотрим, как отсылать сообщения, включающие в себя прикреплённый файл. Воспользуемся для этого функцией sendMailAttachment() :

    Как видите, работа функции mail в PHP совсем несложна. При этом мы рассмотрели лишь наиболее распространённые ошибки, возникающие при её реализации. Впрочем, повысить свои навыки PHP-программирования вы всегда сможете на наших курсах.

    Отзывы

    kerstecca
    Афиноген
    Берта
    Прокл
    cenpopete

    Написать отзыв

    Success! Your message has been sent.