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

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

  • 1
    ваша программа на локальном компьютере или в режиме реального времени
  • 6
    1. Вы уверены, что это не входит в ваш спам? 2. у вас на почтовом ящике настроен sendmail?
Показать ещё 2 комментария
Теги:
email

27 ответов

388

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

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

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

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

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

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

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

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

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

bool mail (string $ to, string $ subject, string $ message [, string $ дополнительные_headers [, string $ дополнительные_параметры]])

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

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

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

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

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

Порт-блок - очень распространенная проблема, с которой сталкиваются большинство разработчиков, интегрируя свой код для доставки электронной почты с использованием SMTP. И это можно легко проследить на сервере maillogs (расположение сервера почтового журнала может варьироваться от сервера к серверу, как объяснялось выше). Если вы находитесь на сервере общедоступного хостинга, порты 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
);

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

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

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

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

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

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

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

  • 10
    Хорошо написано, Джон. Я хотел бы просто добавить еще одну вещь: проверка журналов почтового сервера отправляющего почтового сервера (будь то локально или удаленно), если это возможно, часто может пролить свет на причину проблемы. Эти журналы должны показывать: 1) было ли получено сообщение из сценария PHP отправляющим почтовым сервером и, если да, 2) принято или нет получающее MX получение от отправляющего почтового сервера.
  • 0
    @ mti2935 Это так полезно, я удивлен, что пропустил это. Я обязательно добавлю это в ближайшее время. :)
Показать ещё 4 комментария
31

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

$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>'; 
}
19
  • Всегда старайтесь отправлять заголовки в почтовую функцию.
  • Если вы отправляете почту через localhost, выполните настройки smtp для отправки почты.
  • Если вы отправляете почту через сервер, проверьте, включена ли функция отправки электронной почты на вашем сервере.
16

Вы используете 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";
}
  • 2
    Мне также пришлось использовать: require ("phpmailer / class.smtp.php");
13

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

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

  • 0
    это фактически сделало форму отправкой - мой вопрос теперь будет ... как мне показать пользователя, набранного в электронном письме, теперь, когда я заменил его заголовком ...
  • 0
    это предотвратит почту от спама. Я видел, если мы отправляем почту более 10, используя этот метод, который вы использовали в своем коде Gmail отправлять это письмо в спам.
Показать ещё 1 комментарий
12

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

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

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

9

В основном функция 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();
}
?>
  • 0
    Это хорошая идея, чтобы сохранить SMTP-пользователя и пароль в виде открытого текста на сервере?
  • 0
    @Juri, вероятно, нет ... Боже, я не могу понять, как заставить работать функцию почты:. (
9

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

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

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

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

7

Для тех, кто находит это в будущем, я бы не рекомендовал использовать 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 вам необходимо настроить все заголовки, вложения и т.д. С помощью библиотеки у вас есть специальная функция для этого. Это также означает, что функция выполняет все сложные элементы (например, заголовки).

7

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

?>
7

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

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

  • 1
    fsockopen () [function.fsockopen]: php_network_getaddresses: getaddrinfo не удалось: такой хост не известен. - Если я сталкиваюсь с этой ошибкой, то в чем причина и что нужно сделать?
  • 1
    «Работает для меня» - это просто анекдотичная информация, но на самом деле не так уж много объяснений. Пароль порта и smtp будет вводить в заблуждение для большинства пользователей.
5

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

<?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);
?> 
  • 7
    Как правило, ответы гораздо полезнее, если они включают в себя объяснение того, для чего предназначен код, и почему это решает проблему, не представляя других.
5
$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>";
}
3

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

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

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

sudo apt-get install sendmail

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

  • 0
    Это слишком грубо, чтобы быть полезным. Простая установка MTA редко позволяет получить к нему доступ. А полное руководство по настройке sendmail / postfix / qmail было бы здесь не по теме.
  • 0
    Этот комментарий относится к моему ответу? Потому что этого не случилось со мной, и я не решил это точно так же. Существуют различные возможные ответы на этот вопрос, и я был одним из них после того, как попробовал все вышеперечисленное в прошлом, мой ответ решил проблему для меня, поэтому я предложил его здесь в качестве другого потенциального решения.
Показать ещё 1 комментарий
3

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

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

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

Для тех, кто не хочет использовать внешние почтовые программы и хочет отправлять почту() на выделенный 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
2

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

1

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

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

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

  • 0
    Это слишком странно, и больше никому не поможет. Пожалуйста, используйте ссылку [удалить] под своим ответом.
1

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

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

1

Вы можете использовать функции 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>

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

0

Вы можете использовать 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
  • 4
    Важно отметить: это просто оболочка функции mail() . Добавляет только конструкцию сообщения и некоторые уловки.
0

Если вы используете этот код на локальном сервере (т.е. ваш компьютер для целей разработки), он не отправит электронное письмо получателю. Что произойдет, он создаст файл .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);
?>

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

-1
<?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>'; 
        }
    }
?>
-3

Почему вы не используете 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);
?>

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

Изображение 758

-4

преобразуйте каждый $_POST['$myVar']; перед отправкой в строку с помощью php-функции.

Вы можете использовать операторы кастинга:

$myText = (string)$myVar;

В разделе Strings PHP-руководства содержится более подробная информация о строчном кастинге и преобразовании, включая специальную обработку для булевых и нулевых значений. или здесь: (convert-variable-string-php)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню