Подтвердить что ты не робот

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

<?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. Код отправляет отлично, но никогда не отправляет электронное письмо. пожалуйста помоги.

4b9b3361

Ответ 1

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

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

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

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

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

Смотрите этот ответ для более подробной информации об этом.

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

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

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

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

Функция mail принимает три обязательных параметра и, необязательно, четвертый и пятый. Если ваш вызов 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, так и в других случаях, чтобы свести к минимуму вероятность того, что ваши письма будут помечены как спам. Хорошие советы от Michiel de Mare включают в себя:

  • Используйте методы аутентификации электронной почты, такие как 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 :, вы не можете просто использовать какое-либо значение. В частности, адреса отправителей, отправленных пользователями, являются надежным способом заблокировать почту:

$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">

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

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

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

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

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

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

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

Включить PHP custom 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/веб-сервера. Как правило, вы отправляете почтовое исследование по адресу: их адрес, затем получаете отчет о доставке и более конкретные сбои или анализ позже:

Используйте другой почтовик

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

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

Ответ 2

Добавить почтовый заголовок в функции почты

$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>'; 
}

Ответ 3

  • Всегда старайтесь отправлять заголовки в почтовую функцию.
  • Если вы отправляете почту через localhost, выполните настройки smtp для отправки почты.
  • Если вы отправляете почту через сервер, проверьте, включена ли функция отправки электронной почты на вашем сервере.

Ответ 4

Вы используете 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 = "[email protected]"; // 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";
}

Ответ 5

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

<?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() не работает в localhost. Загрузите свой код на сервер и попробуйте.

Ответ 6

он работал у меня на 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)

Используйте '', а не ""

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

Ответ 7

В основном функция 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();
}
?>

Ответ 8

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

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

Ответ 9

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

  • удалите if($_POST['submit']){}
  • удалить $from (только моя кишка)

Ответ 10

Я думаю, что это должно сделать трюк. Я просто добавил 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>'; 
    }
}

?>

Ответ 11

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

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

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

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

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

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

$mail->SMTPDebug = 2;

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

Ответ 12

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

$config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'mail.domain.com', //your smtp host
        'smtp_port' => 26, //default port 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
}

Это работает для меня!

Ответ 13

$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 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>";
}

Ответ 14

Попробуйте это

<?php
$to = "[email protected], [email protected]";
$subject = "HTML email";

$message = "
    <html>
    <head>
       <title>HTML email</title>
    </head>
    <body>
      <p>This email contains HTML Tags!</p>
      <table>
        <tr>
         <th>Firstname</th>
         <th>Lastname</th>
        </tr>
        <tr>
          <td>John</td>
          <td>Doe</td>
        </tr>
      </table>
    </body>
    </html>";

// Always set content-type when sending HTML email
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";

// More headers
$headers .= 'From: <[email protected]>' . "\r\n";
$headers .= 'Cc: [email protected]' . "\r\n";

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

Ответ 15

Попробуйте это

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>
        '; 
    }
}

Ответ 16

Прежде всего,

У вас может быть много параметров для функции mail()... Вы можете иметь 5 макс. mail(to,subject,message,headers,parameters); Что касается переменной $from, которая должна автоматически поступать с вашего веб-хостинга, если вы используете linux cPanel. Он автоматически исходит из вашего имени пользователя cPanel и IP-адреса.

$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.) в этом порядке, иначе есть вероятность того, что он не будет работать. Дайте мне знать, если это поможет...

Ответ 17

Если у вас возникли проблемы с отправкой писем с помощью 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, см. официальную документацию.

Ответ 18

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

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

Различные MTA могут реализовать sendmail, они просто делают символическую ссылку на свои двоичные файлы на это имя. Например, в debian default используется 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 подходит только для отправки почты с локального хоста, он также может отправлять аутентифицированную электронную почту через вашу учетную запись в общедоступной почтовой службе. Установите ssmtp и отредактируйте config /etc/ssmtp/ssmtp.conf. Чтобы иметь возможность также получать локальную системную почту для учетных записей unix (например, оповещения для root из заданий cron), настройте файл /etc/ssmtp/revaliases.

Вот моя конфигурация для моей учетной записи в почте Yandex:

[email protected]
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
[email protected]
AuthPass=password

Ответ 19

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

Если вы проверили свой код и проверили, что там нет ничего плохого, перейдите в /var/mail и проверьте, нет ли этой папки.

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

sudo apt-get install sendmail

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

Ответ 20

Возможно, проблема в конфигурации почтового сервера, чтобы избежать подобных проблем или вам не нужно беспокоиться о проблеме с почтовым сервером, я рекомендую вам использовать 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;
     }

Ответ 21

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

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

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

Ответ 22

Вы можете использовать функции empty() и isset(). Если вы хотите, чтобы он работал с разными файлами, просто измените action='yourphp.php' на html, который я вам даю, и store the PHP скрипт на этот yourphp.php файл. Также вам нужно изменить index.html на index.php, чтобы активировать функции PHP.

PHP

<?php

    error_reporting(0);
    $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 (!(empty($_POST['name']))) {
                        if (!(empty($_POST['email']))){
                            if (!(empty($_POST['message']))){
                                mail ($to, $subject, $body, $from);
                                echo '<p>Your message has been sent!</p>';
                            }else{
                                echo '<p>Fill your message please.</p>';}
                        }else {
                            echo '<p>Fill your email please.</p>';}
                }else{
                    echo '<p>Fill your name please.</p>';}              
    }else{
            echo '<p>Fill the form.</p>';}
?>

HTML

<html>
    <form method="post" action="?">
        <table>
            <tr><td>Name</td><td><input type='text' name='name' id='name'/></td></tr>
            <tr><td>Email</td><td><input type='text' name='email' id='email'/></td></tr>
            <tr><td>Message</td><td><input type='text' name='message' id='message'/></td></tr>
            <tr><td></td><td><input type='submit' name='submit' id='submit'/></td></tr>
        </table>
    </form>
</html>

С наилучшими пожеланиями!

Ответ 23

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

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

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

Чтобы проверить, поддерживает ли ваша служба хостинга функцию 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);
?>

Надеюсь, что это помогло.

Ответ 24

Вы можете использовать libmail: http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=en

include "libmail.php";
$m = new Mail(); // create the mail
$m->From( $_POST['form'] );
$m->To( $_POST['to'] );
$m->Subject( $_POST['subject'] );
$m->Body( $_POST['body'] );
$m->Cc( $_POST['cc']);
$m->Priority(4);
//  attach a file of type image/gif to be displayed in the message if possible
$m->Attach( "/home/leo/toto.gif", "image/gif", "inline" );
$m->Send(); // send the mail
echo "Mail was sent:"
echo $m->Get(); // show the mail source

Ответ 25

Установка 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 часов...
НЕ ЗАБУДЬТЕ ПРОВЕРИТЬ СВОЮ ПАПКУ СПАМА !!!!

Ответ 26

<?php
    $name       = $_POST['name'];
    $email  = $_POST['email'];
    $message    = $_POST['message'];
    $from       = 'Sender <yoursite.com>'; 
    $to         = '[email protected]'; 
    $subject    = 'Customer Inquiry';
    $body       = "From: $name\n E-Mail: $email\n Message:\n $message";
    $headers.='X-Mailer: PHP/' . phpversion().'\r\n';
    $headers.= 'MIME-Version: 1.0' . "\r\n";
    $headers.= 'Content-type: text/html; charset=iso-8859-1 \r\n';

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

Ответ 27

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

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';
?>

Ответ 28

Почему вы не используете Papercut, вы можете проверить отправку почты на своем ПК без Интернета

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

Просто запустите его и попробуйте отправить пробную почту:

test_sendmail.php

<?php
$to = "[email protected]";
$subject = "My subject";
$txt = "Hello world!";
$headers = "From: [email protected]" . "\r\n" .
"CC: [email protected]";

mail($to,$subject,$txt,$headers);
?>

и вы увидите следующее:

введите описание изображения здесь

Ответ 29

Если ваша система sendmail работает, ваш код должен быть изменен следующим образом:

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];

    $header ="
Content-Type: text/html; charset=UTF-8\r\n
MIME-Version: 1.0\r\n
From: \"$name\" <$email>\r\n
Reply-To: [email protected]\r\n
X-Mailer: yoursite.com mailer\r\n
";

    $to = '"Contact" <[email protected]>'; 
    $subject = 'Customer Inquiry';
    $body =<<<EOB
<!DOCTYPE html>
<html>
    <body>
        $message
    </body>
</html>
EOB;

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

Это позволяет отправлять электронные письма в формате HTML.

Интересный интерес:

  1. мы создали многострочную строку заголовка (каждая строка разделена \r\n);
  2. мы добавили Content-type, чтобы выразить, что мы возвращаем HTML, чтобы вы могли создавать более качественные электронные письма (вы можете добавить любой HTML-код, который вы хотите, включая CSS, к вашему сообщению, как это было бы на HTML-странице).

Примечание: синтаксис <<<EOB требует, чтобы последний маркер EOB начинался как начало строки и не имел пробела или другого символа после точки с запятой.

Ответ 30

Если вы используете php mailer, вы можете использовать этот код, просто скопируйте и вставьте его, замените *** данными и учетными данными. А также изменить значение имени входных данных.

<?php

    require_once ("PHPMailer/PHPMailerAutoload.php");

    $error = array();

    //var_dump($_POST);

    $message = $_POST['a'] . '<br>';
    $message.= $_POST['b'] . '<br>';
    $message.= $_POST['c'] . '<br>';
    $message.= $_POST['d'] . '<br>';
    $message.= $_POST['e'] . '<br>';
    $message.= $_POST['f'] . '<br>';
    $message.= $_POST['g'] . '<br>';
    $message.= $_POST['h'] . '<br>';
    $message.= $_POST['i'] . '<br>';
    $message.= $_POST['j'] . '<br>';
    $message.= $_POST['k'] . '<br>';

    $subject = "Visitor Query";
    $from = "******@******.com"; // example [email protected]
    $password = '******';

    $mail = new PHPMailer();
    $body = $message;
    $mail->IsSMTP();
    $mail->SMTPAuth = true; // turn on SMTP authentication
    $mail->SMTPKeepAlive = true; // SMTP connection will not close after each email sent, reduces SMTP overhead
    $mail->SMTPDebug = 0;

    //$mail->Host = 'mail.******.com'; // sets SMTP server
    $mail->Host = 'mail.******.com'; // sets SMTP server        
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;
    //$mail->Port = 25;

    $mail->Username = $from; // SMTP username
    $mail->Password = $password; // SMTP password

    $mail->AddAddress ( "******@gmail.com" );
    $mail->AddReplyTo ( "******@gmail.com", "Team");
    $mail->Subject = $subject;
    $mail->Body = $message;
    $mail->From =  $from;
    $mail->FromName = "Visitor Query";
    $mail->ContentType = "text/html";

    if (count($error == 0)) {

         $mail->Send();

        // echo "_________________wait_______for_______ our _______ reply  !";


    } else {

        echo $error; // show error messages
        //echo $result;
    }

    //header("location: index.php");

?>