Функция почты PHP не завершает отправку электронной почты

Jul 09 2014
<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com';
    $to = '[email protected]';
    $subject = 'Customer Inquiry';
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";

    if ($_POST['submit']) {
        if (mail ($to, $subject, $body, $from)) {
            echo '<p>Your message has been sent!</p>';
        } else {
            echo '<p>Something went wrong, go back and try again!</p>';
        }
    }
?>

Я пробовал создать простую почтовую форму. Сама форма находится на моей index.htmlстранице, но она отправляется на отдельную страницу «Спасибо за отправку» thankyou.php, куда встроен приведенный выше PHP-код. Код отправляется отлично, но никогда не отправляет электронное письмо. Как я могу это исправить?

Ответы

533 JohnConde Jul 09 2014 at 09:21

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

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

Убедитесь, что отчет об ошибках включен и настроен так, чтобы сообщать обо всех ошибках.

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

error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");

См. Как я могу получать полезные сообщения об ошибках в PHP? - этот ответ для получения более подробной информации об этом.

Убедитесь, что mail()функция вызывается

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

Убедитесь, что mail()функция вызывается правильно

bool mail (строка $ to, строка $ subject, строка $ message [, строка $ additional_headers [, строка $ additional_parameters]])

Функция почты принимает три обязательных параметра и, возможно, четвертый и пятый. Если ваш вызов mail()не имеет хотя бы трех параметров, он завершится ошибкой.

Если ваш вызов mail()не имеет правильных параметров в правильном порядке, он также завершится ошибкой.

Проверьте журналы почты сервера

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

Проверьте наличие сбоя подключения к порту

Блокировка портов - очень распространенная проблема, с которой сталкиваются большинство разработчиков при интеграции своего кода для доставки электронной почты с использованием SMTP. И это можно легко отследить в почтовых журналах сервера (расположение сервера почтового журнала может варьироваться от сервера к серверу, как объяснено выше). Если вы находитесь на сервере общего хостинга, порты 25 и 587 по умолчанию остаются заблокированными. Эта блокировка была специально сделана вашим хостинг-провайдером. Это верно даже для некоторых выделенных серверов. Когда эти порты заблокированы, попробуйте подключиться через порт 2525. Если вы обнаружите, что этот порт также заблокирован, единственное решение - обратиться к вашему хостинг-провайдеру, чтобы разблокировать эти порты.

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

Используйте порты 25 или 587 для обычных / TLS-соединений и порт 465 для SSL-соединений. Для большинства пользователей рекомендуется использовать порт 587, чтобы избежать ограничений скорости, установленных некоторыми провайдерами хостинга.

Не используйте оператор подавления ошибок

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

Если ваш код содержит, @mail(...)то вы можете скрывать важные сообщения об ошибках, которые помогут вам отладить это. Удалите @и посмотрите, есть ли сообщения об ошибках.

Это рекомендуется только тогда, когда вы сразу после этого проверяетеerror_get_last() наличие конкретных неисправностей.

Проверить mail()возвращаемое значение

mail()Функция:

Возвращает, TRUEесли письмо было успешно принято к доставке, в FALSEпротивном случае. Важно отметить, что тот факт, что почта была принята к доставке, НЕ означает, что она действительно будет доставлена ​​по назначению.

Это важно отметить, потому что:

  • Если вы получаете FALSEвозвращаемое значение, значит, ошибка связана с тем, что ваш сервер принимает вашу почту. Вероятно, это не проблема кодирования, а проблема конфигурации сервера. Вам нужно поговорить со своим системным администратором, чтобы узнать, почему это происходит.
  • Если вы получили TRUEвозвращаемое значение, это не означает, что ваше письмо обязательно будет отправлено. Это просто означает, что электронное письмо было успешно отправлено соответствующему обработчику на сервере с помощью PHP. Есть еще больше точек отказа вне контроля PHP, которые могут привести к тому, что электронное письмо не будет отправлено.

Это FALSEпоможет указать вам правильное направление, хотя TRUEэто не обязательно означает, что ваше письмо было отправлено успешно. Это важно отметить!

Убедитесь, что ваш хостинг-провайдер позволяет отправлять электронные письма и не ограничивает отправку писем.

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

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

Проверить папки со спамом; предотвращать пометку писем как спам

Часто по разным причинам электронные письма, отправленные через PHP (и другие серверные языки программирования), попадают в папку для спама получателя. Всегда проверяйте его, прежде чем устранять неполадки в вашем коде.

Чтобы почта, отправляемая через PHP, не отправлялась в папку для спама получателя, вы можете сделать различные вещи, как в вашем PHP-коде, так и в других случаях, чтобы свести к минимуму вероятность того, что ваши электронные письма будут помечены как спам. Вот хорошие советы от Мишель де Маре :

  • Используйте методы проверки подлинности электронной почты, такие как SPF и DKIM, чтобы доказать, что ваши электронные письма и ваше доменное имя принадлежат друг другу, и предотвратить подделку вашего доменного имени. На веб-сайте SPF есть мастер для генерации информации DNS для вашего сайта.
  • Проверьте свой обратный DNS, чтобы убедиться, что IP-адрес вашего почтового сервера указывает на доменное имя, которое вы используете для отправки почты.
  • Убедитесь, что используемый IP-адрес не находится в черном списке.
  • Убедитесь, что адрес для ответа - действительный существующий адрес.
  • Используйте полное настоящее имя адресата в поле Кому, а не только адрес электронной почты (например "John Smith" <[email protected]>).
  • Следите за своими учетными записями злоупотреблений, такими как [email protected] и [email protected]. Это означает - убедитесь, что эти учетные записи существуют, прочитайте, что им присылают, и принимайте меры по жалобам.
  • Наконец, сделайте так, чтобы отписка была действительно простой. В противном случае ваши пользователи откажутся от подписки, нажав кнопку спама , и это повлияет на вашу репутацию.

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

Убедитесь, что указаны все заголовки писем

Некоторые программы для спама будут отклонять почту, если в ней отсутствуют общие заголовки, такие как «От» и «Ответить»:

$headers = array("From: [email protected]",
    "Reply-To: [email protected]",
    "X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);

Убедитесь, что в заголовках писем нет синтаксических ошибок.

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

$headers = array("From [email protected]", // missing colon
    "Reply To: [email protected]",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);

Не используйте фальшивого From:отправителя

Хотя у сообщения должен быть From: sender, вы не можете просто использовать любое значение. В частности, адреса отправителей, задаваемые пользователями, - верный способ заблокировать почту:

$headers = array("From: $_POST[contactform_sender_email]"); // No!

Причина: ваш веб-сервер или почтовый сервер-отправитель не внесен в белый список SPF / DKIM, чтобы выдавать себя за адреса @hotmail или @gmail. Он может даже незаметно отбрасывать письма с From:доменами отправителя, для которых он не настроен.

Убедитесь, что значение получателя верное

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

$to = '[email protected]';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to

Другой способ проверить это - жестко закодировать значение получателя в mail()вызове функции:

mail('[email protected]', $subject, $message, $headers); 

Это может относиться ко всем mail()параметрам.

Отправить на несколько учетных записей

Чтобы исключить проблемы с учетной записью электронной почты, отправьте свое письмо на несколько учетных записей электронной почты у разных поставщиков услуг электронной почты . Если ваши электронные письма не поступают в учетную запись Gmail пользователя, отправьте те же электронные письма в учетную запись Yahoo, учетную запись Hotmail и обычную учетную запись POP3 (например, учетную запись электронной почты, предоставленную провайдером).

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

Убедитесь, что код соответствует методу формы

Если вы установили свой метод формы на POST, убедитесь, что вы используете $_POSTдля поиска значений формы. Если вы установили GETили не установили его вообще, убедитесь, что вы используете его $_GETдля поиска значений формы.

Убедитесь, что actionзначение вашей формы указывает на правильное местоположение

Убедитесь, что actionатрибут формы содержит значение, указывающее на ваш почтовый код PHP.

<form action="send_email.php" method="POST">

Убедитесь, что веб-хостинг поддерживает отправку электронной почты.

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

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

Убедитесь, что localhostпочтовый сервер настроен

Если вы разрабатываете на своей локальной рабочей станции с использованием WAMP, MAMP или XAMPP, почтовый сервер, вероятно, не установлен на вашей рабочей станции. Без него PHP по умолчанию не может отправлять почту.

Вы можете преодолеть это, установив базовый почтовый сервер. Для Windows вы можете использовать бесплатную Mercury Mail .

Вы также можете использовать SMTP для отправки писем. Смотрите этот большой ответ от Викас Dwivedi , чтобы узнать , как это сделать.

Включить пользовательский PHP mail.log

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

ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);

См. Http://php.net/manual/en/mail.configuration.php для подробностей. (Лучше всего включить эти параметры в php.iniили .user.iniили .htaccessвозможно.)

Обратитесь в службу тестирования почты

Существуют различные службы доставки и проверки на спам, которые вы можете использовать для проверки настройки вашего MTA / веб-сервера. Обычно вы отправляете почтовое сообщение To: на их адрес, а затем получаете отчет о доставке и более конкретные ошибки или анализ позже:

Используйте другую почтовую программу

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

  • Самый популярный из них: PHPMailer
  • Точно так же функционально: SwiftMailer
  • Или даже более старый PEAR :: Mail .

Все это можно комбинировать с профессиональным SMTP-сервером / поставщиком услуг. (Потому что типичные планы общего веб-хостинга 08/15 сбиваются или пропадают, когда дело доходит до настройки / настройки электронной почты.)

39 er.irfankhan11 Jul 27 2015 at 21:01

Добавьте заголовок письма в почтовую функцию:

$header = "From: [email protected]\r\n";
$header.= "MIME-Version: 1.0\r\n";
$header.= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$header.= "X-Priority: 1\r\n";

$status = mail($to, $subject, $message, $header);

if($status)
{
    echo '<p>Your mail has been sent!</p>';
} else {
    echo '<p>Something went wrong. Please try again!</p>';
}
25 sonamgupta May 20 2015 at 20:23
  1. Всегда пытайтесь отправлять заголовки в почтовой функции.
  2. Если вы отправляете почту через localhost, выполните настройки SMTP для отправки почты.
  3. Если вы отправляете почту через сервер, убедитесь, что на вашем сервере включена функция отправки электронной почты.
21 oneDerer Jul 09 2014 at 09:55

Если вы используете конфигурацию SMTP для отправки электронной почты, попробуйте вместо этого использовать PHPMailer . Вы можете скачать библиотеку с https://github.com/PHPMailer/PHPMailer .

Я создал свое письмо с отправкой таким образом:

function send_mail($email, $recipient_name, $message='')
{
    require("phpmailer/class.phpmailer.php");

    $mail = new PHPMailer();

    $mail->CharSet = "utf-8";
    $mail->IsSMTP();                                      // Set mailer to use SMTP
    $mail->Host = "mail.example.com";  // Specify main and backup server
    $mail->SMTPAuth = true;     // Turn on SMTP authentication
    $mail->Username = "myusername";  // SMTP username
    $mail->Password = "p@ssw0rd"; // SMTP password

    $mail->From = "[email protected]";
    $mail->FromName = "System-Ad";
    $mail->AddAddress($email, $recipient_name);

    $mail->WordWrap = 50;                                 // Set word wrap to 50 characters
    $mail->IsHTML(true);                                  // Set email format to HTML (true) or plain text (false)

    $mail->Subject = "This is a Sampleenter code here Email";
    $mail->Body    = $message;
    $mail->AltBody = "This is the body in plain text for non-HTML mail clients";
    $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
    $mail->addAttachment('files/file.xlsx');

    if(!$mail->Send())
    {
       echo "Message could not be sent. <p>";
       echo "Mailer Error: " . $mail->ErrorInfo;
       exit;
    }

    echo "Message has been sent";
}
17 user1258544 Jul 09 2014 at 10:22

Просто добавьте несколько заголовков перед отправкой почты:

<?php 
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = '[email protected]'; 
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html\r\n";
$headers .= 'From: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

И еще кое-что. mail()Функция не работает в локальном хосте. Загрузите свой код на сервер и попробуйте.

13 bat.t Sep 29 2015 at 21:25

Для меня это сработало на 000webhost, выполнив следующие действия:

$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: ". $from. "\r\n";
$headers .= "Reply-To: ". $from. "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$headers .= "X-Priority: 1" . "\r\n";

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

mail('[email protected]', $subject, $message, $headers)

Пользуюсь ''и нет "".

Этот код работает, но письмо было получено с задержкой в ​​полчаса.

10 Karthik Jun 23 2016 at 16:02

В основном mail()функция отключена на виртуальном хостинге. Лучше использовать SMTP. Лучшим вариантом будет Gmail или SendGrid.


SMTPconfig.php

<?php 
    $SmtpServer="smtp.*.*";
    $SmtpPort="2525"; //default
    $SmtpUser="***";
    $SmtpPass="***";
?>

SMTPmail.php

<?php
class SMTPClient
{

    function SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body)
    {

        $this->SmtpServer = $SmtpServer;
        $this->SmtpUser = base64_encode ($SmtpUser);
        $this->SmtpPass = base64_encode ($SmtpPass);
        $this->from = $from;
        $this->to = $to;
        $this->subject = $subject;
        $this->body = $body;

        if ($SmtpPort == "") 
        {
            $this->PortSMTP = 25;
        }
        else
        {
            $this->PortSMTP = $SmtpPort;
        }
    }

    function SendMail ()
    {
        $newLine = "\r\n";
        $headers = "MIME-Version: 1.0" . $newLine;  
        $headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;  

        if ($SMTPIN = fsockopen ($this->SmtpServer, $this->PortSMTP)) 
        {
            fputs ($SMTPIN, "EHLO ".$HTTP_HOST."\r\n"); 
            $talk["hello"] = fgets ( $SMTPIN, 1024 ); 
            fputs($SMTPIN, "auth login\r\n");
            $talk["res"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpUser."\r\n");
            $talk["user"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpPass."\r\n");
            $talk["pass"]=fgets($SMTPIN,256);
            fputs ($SMTPIN, "MAIL FROM: <".$this->from.">\r\n"); 
            $talk["From"] = fgets ( $SMTPIN, 1024 ); 
            fputs ($SMTPIN, "RCPT TO: <".$this->to.">\r\n"); 
            $talk["To"] = fgets ($SMTPIN, 1024); 
            fputs($SMTPIN, "DATA\r\n");
            $talk["data"]=fgets( $SMTPIN,1024 );
            fputs($SMTPIN, "To: <".$this->to.">\r\nFrom: <".$this->from.">\r\n".$headers."\n\nSubject:".$this->subject."\r\n\r\n\r\n".$this->body."\r\n.\r\n");
            $talk["send"]=fgets($SMTPIN,256);
            //CLOSE CONNECTION AND EXIT ... 
            fputs ($SMTPIN, "QUIT\r\n"); 
            fclose($SMTPIN); 
            // 
        } 
        return $talk;
    } 
}
?>

contact_email.php

<?php 
include('SMTPconfig.php');
include('SMTPmail.php');
if($_SERVER["REQUEST_METHOD"] == "POST")
{
    $to = "";
    $from = $_POST['email'];
    $subject = "Enquiry";
    $body = $_POST['name'].'</br>'.$_POST['companyName'].'</br>'.$_POST['tel'].'</br>'.'<hr />'.$_POST['message'];
    $SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
    $SMTPChat = $SMTPMail->SendMail();
}
?>
9 iatboy Aug 05 2014 at 10:49

Если вы используете только эту mail()функцию, вам необходимо заполнить файл конфигурации.

Вам нужно открыть расширение почты и установить SMTP smtp_portи так далее, самое главное, ваше имя пользователя и пароль. Без этого почту нельзя отправить. Также вы можете использовать PHPMailкласс для отправки.

9 vldfr Feb 11 2015 at 22:20

Попробуйте эти две вещи по отдельности и вместе:

  1. удалить if($_POST['submit']){}
  2. удалить $from(только моя кишка)
8 StephenM Jan 03 2015 at 09:32

Я думаю, это должно помочь. Я просто добавил if(issetи добавил конкатенацию к переменным в теле, чтобы отделить PHP от HTML.

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = '[email protected]'; 
    $subject = 'Customer Inquiry';
    $body = "From:" .$name."\r\n E-Mail:" .$email."\r\n Message:\r\n" .$message;

if (isset($_POST['submit'])) 
{
    if (mail ($to, $subject, $body, $from)) 
    { 
        echo '<p>Your message has been sent!</p>';
    } 
    else 
    { 
        echo '<p>Something went wrong, go back and try again!</p>'; 
    }
}

?>
8 Machavity May 20 2016 at 19:45

Тем, кто обнаружит, что это в будущем, я бы не рекомендовал использовать mail. Есть несколько ответов, которые касаются этого, но не причины .

mailФункция PHP не только непрозрачна, она полностью зависит от того, какой MTA вы используете (например, Sendmail ) для выполнения своей работы. mailбудет только сказать вам , если АПС не смог принять его (т.е. Sendmail был вниз , когда вы пытались отправить). Он не может сказать вам, было ли письмо успешным, потому что оно было передано. Таким образом (как подробности ответа Джона Конде ), теперь вы можете возиться с журналами MTA и надеяться, что он расскажет вам достаточно о том, что это не удалось исправить. Если вы находитесь на общем хосте или у вас нет доступа к журналам MTA, вам не повезло. К сожалению, по умолчанию для большинства обычных установок Linux это делается именно так.

Почтовая библиотека ( PHPMailer , Zend Framework 2+ и т. Д.) Делает нечто очень отличное от mail. Они открывают сокет непосредственно на принимающем почтовом сервере, а затем отправляют почтовые команды SMTP непосредственно через этот сокет. Другими словами, класс действует как собственный MTA (обратите внимание, что вы можете указать библиотекам использовать их mailдля окончательной отправки почты, но я настоятельно рекомендую вам не делать этого).

Это означает, что вы можете напрямую видеть ответы принимающего сервера (например, в PHPMailer вы можете включить отладочный вывод ). Больше не нужно гадать, не удалось ли отправить письмо или почему.

Если вы используете SMTP (т. Е. Звоните isSMTP()), вы можете получить подробную расшифровку SMTP-разговора, используя SMTPDebugсвойство.

Установите этот параметр, включив в сценарий такую ​​строку:

$mail->SMTPDebug = 2;

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

6 Chiragpatel Jul 13 2015 at 14:27
$name = $_POST['name'];
$email = $_POST['email'];
$reciver = '/* Reciver Email address */';
if (filter_var($reciver, FILTER_VALIDATE_EMAIL)) {
    $subject = $name;
    // To send HTML mail, the Content-type header must be set.
    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= 'From:' . $email. "\r\n"; // Sender's Email
    //$headers .= 'Cc:' . $email. "\r\n"; // Carbon copy to Sender
    $template = '<div style="padding:50px; color:white;">Hello ,<br/>'
        . '<br/><br/>'
        . 'Name:' .$name.'<br/>'
        . 'Email:' .$email.'<br/>'
        . '<br/>'
        . '</div>';
    $sendmessage = "<div style=\"background-color:#7E7E7E; color:white;\">" . $template . "</div>";
    // Message lines should not exceed 70 characters (PHP rule), so wrap it.
    $sendmessage = wordwrap($sendmessage, 70);
    // Send mail by PHP Mail Function.
    mail($reciver, $subject, $sendmessage, $headers);
    echo "Your Query has been received, We will contact you soon.";
} else {
    echo "<span>* invalid email *</span>";
}
6 dEsta88 Oct 07 2014 at 05:33

Вы можете использовать электронную почту конфигурации от CodeIgniter . Например, с помощью SMTP (простой способ):

$config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'mail.domain.com', // Your SMTP host
        'smtp_port' => 26, // Default port for SMTP
        'smtp_user' => '[email protected]',
        'smtp_pass' => 'password',
        'mailtype' => 'html',
        'charset' => 'iso-8859-1',
        'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('[email protected]', 'Title');
$this->email->to('[email protected]');
$this->email->subject('Header');
$this->email->message($message);

if($this->email->send()) 
{
   // Conditional true
}

Меня устраивает!

4 GauravSirauthiya Jun 23 2015 at 17:58

Попробуй это

if ($_POST['submit']) {
    $success= mail($to, $subject, $body, $from);
    if($success)
    { 
        echo '
        <p>Your message has been sent!</p>
        ';
    } else { 
        echo '
        <p>Something went wrong, go back and try again!</p>
        '; 
    }
}
4 JackCh Mar 20 2018 at 02:09

Может проблема в настройке почтового сервера. Чтобы избежать этого типа проблем или вам не нужно беспокоиться о проблеме с почтовым сервером, я рекомендую вам использовать PHPMailer .

Это плагин, в котором есть все необходимое для отправки почты, и единственное, что вы должны принять во внимание, это включить порт SMTP (порт: 25 и 465).

require_once 'PHPMailer/PHPMailer.php';
require_once '/servicios/PHPMailer/SMTP.php';
require_once '/servicios/PHPMailer/Exception.php';

$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
    //Server settings
    $mail->SMTPDebug = 0;
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = '[email protected]';
    $mail->Password = 'contrasenia';
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;

    // Recipients
    $mail->setFrom('[email protected]', 'my name');
    $mail->addAddress('[email protected]');

    // Attachments
    $mail->addAttachment('optional file');         // Add files, is optional

    // Content
    $mail->isHTML(true);// Set email format to HTML
    $mail->Subject = utf8_decode("subject");
    $mail->Body    = utf8_decode("mail content");
    $mail->AltBody = '';
    $mail->send();
}
catch (Exception $e) {
    $error = $mail->ErrorInfo;
}
3 Daniel Sep 24 2017 at 10:50

Убедитесь, что на вашем сервере установлен Sendmail.

Если вы проверили свой код и убедились, что все в порядке, перейдите в / var / mail и проверьте, пуста ли эта папка.

Если он пуст, вам нужно будет сделать:

sudo apt-get install sendmail

если вы находитесь на сервере Ubuntu.

3 aidangig Jan 31 2016 at 21:15

Во-первых, у вас может быть слишком много параметров для функции mail () ... У вас может быть максимум пять, mail(to, subject, message, headers, parameters);

Что касается $fromпеременной, она должна автоматически поступать с вашего веб-хостинга, если вы используете Linux cPanel . Он автоматически исходит из вашего имени пользователя и IP-адреса cPanel.

$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = '[email protected]';
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

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

В mail($to, $subject, $message, etc.)таком порядке, иначе есть вероятность, что он не сработает.

3 JohnSlegers Feb 10 2016 at 20:23

Если у вас возникли проблемы с отправкой писем с помощью PHP, рассмотрите альтернативу, например PHPMailer или SwiftMailer .

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


Основное использование:

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('[email protected]' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('[email protected]' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Your message has been sent!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "error",
        "message" => 'Oops! Something went wrong!'
    ], JSON_PRETTY_PRINT);
}

См. Официальную документацию для получения дополнительной информации о том, как использовать SwiftMailer.

3 user3132194 Jun 21 2017 at 19:07

Для тех, кто не хочет использовать внешние почтовые программы и хочет использовать mail () на выделенном сервере Linux.

Способ отправки почты PHP описан php.iniв разделе [mail function].

Параметр sendmail-pathописывает, как вызывается sendmail. Значение по умолчанию - sendmail -t -i, поэтому, если вы получите работу sendmail -t -i < message.txtв консоли Linux - все будет готово. Вы также можете добавить mail.logв отладку и убедиться, что mail () действительно вызывается.

Могут быть реализованы разные MTA sendmail. Они просто создают символическую ссылку на свои двоичные файлы с этим именем. Например, в Debian по умолчанию используется Postfix . Настройте свой MTA для отправки почты и проверьте его с консоли с помощью sendmail -v -t -i < message.txt. Файл message.txtдолжен содержать все заголовки сообщения и тело, адрес назначения для конверта будет взят из To:заголовка. Пример:

From: [email protected]
To: [email protected]
Subject: Test mail via sendmail.

Text body.

Я предпочитаю использовать ssmtp в качестве MTA, потому что он прост и не требует запуска демона с открытыми портами. ssmtp подходит только для отправки почты с localhost . Он также может отправлять аутентифицированную электронную почту через вашу учетную запись в общедоступной почтовой службе. Установите ssmtp и отредактируйте файл конфигурации /etc/ssmtp/ssmtp.conf. Чтобы иметь возможность также получать локальную системную почту для учетных записей Unix (например, предупреждения для root от заданий cron), настройте /etc/ssmtp/revaliasesфайл.

Вот моя конфигурация аккаунта на Яндекс почте:

[email protected]
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
[email protected]
AuthPass=password
2 TonyLuigiC Apr 05 2017 at 08:09

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

Если вы собираетесь в университет, в котором работает XAMPP с сайта www.AceITLab.com, вы должны знать то, что не сказал нам наш профессор: брандмауэр AceITLab (а не брандмауэр Windows) блокирует MercuryMail в XAMPP. Придется использовать альтернативный почтовый клиент, груша у нас работает. Вам нужно будет отправить на учетную запись Gmail с низкими настройками безопасности.

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

1 Ron Apr 01 2017 at 10:30

Если вы запускаете этот код на локальном сервере (то есть на вашем компьютере в целях разработки), он не отправит электронное письмо получателю. Он создаст .txtфайл в папке с именем mailoutput.

В случае, если вы используете бесплатную службу рассылки , например 000webhostили hostinger, эти поставщики услуг отключают эту mail()функцию, чтобы предотвратить непреднамеренное использование подделки электронной почты, рассылки спама и т. Д. Я предпочитаю, чтобы вы связались с ними, чтобы узнать, поддерживают ли они эту функцию.

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

Почта PHP ()

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

<?php
    $to      = '[email protected]';
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: [email protected]' . "\r\n" .
        'Reply-To: [email protected]' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

    mail($to, $subject, $message, $headers);
?>
1 BadLoser Aug 21 2019 at 16:14

На самом деле установка Sendmail для Debian 10.0.0 («Buster») была тривиальной!

php.ini

[mail function]
sendmail_path=/usr/sbin/sendmail -t -i
; (Other directives are mostly windows)

Стандартная установка пакета sendmail (с возможностью отправки):

su -                                        # Install as user 'root'
dpkg --list                                 # Is install necessary?
apt-get install sendmail sendmail-cf m4     # Note multiple package selection
sendmailconfig                              # Respond all 'Y' for new install

Разные полезные команды:

which sendmail                              # /usr/sbin/sendmail
which sendmailconfig                        # /usr/sbin/sendmailconfig
man sendmail                                # Documentation
systemctl restart sendmail                  # As and when required

Подтверждение (возможности отправки)

echo "Subject: sendmail test" | sendmail -v <yourEmail>@gmail.com

Все это заняло около 5 минут. Тогда я потратил 5 часов ... Не забудьте проверить папку со спамом !

SuReSh Apr 28 2015 at 13:08

Есть несколько возможностей:

  1. Вы столкнулись с проблемой сервера. На сервере нет почтового сервера. Итак, ваша почта не работает, потому что ваш код в порядке и почта работает с типом.

  2. Вы не получаете объявленное значение. Попробуйте свой код со статическим значением.

  3. Используйте почту SMTP для отправки почты ...

krishna Dec 23 2018 at 21:25

Вы можете увидеть свои ошибки:

error_reporting(E_ALL);

И мой пример кода:

<?php
    use PHPMailer\PHPMailer\PHPMailer;
    require 'PHPMailer.php';
    require 'SMTP.php';
    require 'Exception.php';

    $name = $_POST['name'];
    $mailid = $_POST['mail'];
    $mail = new PHPMailer;
    $mail->IsSMTP();
    $mail->SMTPDebug = 0;                   // Set mailer to use SMTP
    $mail->Host = 'smtp.gmail.com';         // Specify main and backup server
    $mail->Port = 587;                      // Set the SMTP port
    $mail->SMTPAuth = true;                 // Enable SMTP authentication
    $mail->Username = '[email protected]';  // SMTP username
    $mail->Password = 'password';           // SMTP password
    $mail->SMTPSecure = 'tls';              // Enable encryption, 'ssl' also accepted

    $mail->From = '[email protected]';
    $mail->FromName = 'name';
    $mail->AddAddress($mailid, $name);       // Name is optional
    $mail->IsHTML(true);                     // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'Here is your message' ;
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
    if (!$mail->Send()) {
       echo 'Message could not be sent.';
       echo 'Mailer Error: ' . $mail->ErrorInfo;
       exit;
    }
    echo 'Message has been sent';
?>
ofricofri Aug 16 2020 at 08:44

Если вы застряли в приложении, размещенном на Hostgator, это решило мою проблему. Большое спасибо парню, который опубликовал подробное решение. Если в один прекрасный день ссылка отключится, вы увидите сводку:

  • Найдите путь sendmail на своем сервере. Простой способ проверить это, чтобы временно записать следующий код страницы , который только вы будете обращаться, чтобы поизучать информацию: <?php phpinfo(); ?>. Откройте эту страницу и найдите sendmail path. (Тогда не забудьте удалить этот код!)
  • Проблема и решение: если ваш путь sendmail говорит только -t -i, то отредактируйте свой сервер php.iniи добавьте следующую строку:sendmail_path = /usr/sbin/sendmail -t -i;

Но после того, как я смог отправлять почту с помощью mail()функции PHP , я узнал, что она отправляет не аутентифицированную электронную почту, что создало еще одну проблему. Все электронные письма падали в ящик нежелательной почты моего Hotmail, а некоторые электронные письма так и не были доставлены, что, я думаю, связано с тем, что они не аутентифицированы. Вот почему я решил перейти от mail()к PHPMailerс SMTP, в конце концов.