Функция PHP mail не завершает отправку электронной почты
<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = 'contact@yoursite.com';
$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 встроен. Код отправляет отлично, но никогда не отправляет электронное письмо. пожалуйста помоги.
38 ответов
Хотя есть части этого ответа, которые относятся только к использованию 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" <john@blacksmiths-international.com>
).- Следите за своими учетными записями о злоупотреблениях, такими как abuse@yourdomain.com и postmaster@yourdomain.com. Это означает - убедитесь, что эти учетные записи существуют, прочитайте то, что им отправлено, и действуйте по жалобам.
- Наконец, сделайте так, чтобы отписаться от подписки было действительно легко. В противном случае ваши пользователи откажутся от подписки, нажав кнопку спама, и это повлияет на вашу репутацию.
См. Как убедиться, что электронная почта, которую вы отправляете программно, не помечается как спам? больше на эту тему.
Убедитесь, что все заголовки почты поставлены
Некоторые спам-программы отклоняют почту, если в ней отсутствуют общие заголовки, такие как "От" и "Ответить":
$headers = array("From: from@example.com",
"Reply-To: replyto@example.com",
"X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);
Убедитесь, что заголовки почты не имеют синтаксических ошибок
Недопустимые заголовки так же плохи, как и отсутствие заголовков. Один неверный символ может быть все, что нужно, чтобы сорвать вашу электронную почту. Перепроверьте, чтобы убедиться, что ваш синтаксис правильный, так как PHP не поймает эти ошибки за вас.
$headers = array("From from@example.com", // missing colon
"Reply To: replyto@example.com", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
);
Убедитесь в правильности значения получателя
Иногда проблема так же проста, как неправильное значение для получателя письма. Это может быть связано с использованием неверной переменной.
$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to
Другой способ проверить это - жестко закодировать значение получателя в mail()
вызов функции:
mail('user@example.com', $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 для отправки ваших писем. Посмотрите этот замечательный ответ от Vikas 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/ веб-сервера. Как правило, вы отправляете почтовое исследование на адрес: их адрес, затем получаете отчет о доставке и более конкретные ошибки или анализы позже:
- http://mail-tester.com/ (бесплатно / просто)
- https://glockapps.com/ (бесплатно /$$$)
- senforensics.com (регистрация /$$$)
- https://mailtrap.io/ (pro/$$$)
- https://www.ultratools.com/tools/emailTest (бесплатно / только проверки MX)
- Разное: http://www.verticalresponse.com/blog/7-email-testing-delivery-tools/
Используйте другой почтовик
PHP встроен в mail()
Функция удобна и часто выполняет свою работу, но у нее есть свои недостатки. К счастью, есть альтернативы, которые предлагают большую мощность и гибкость, включая решение многих проблем, описанных выше:
- Самое популярное существо: PHPMailer
- Аналогичным образом можно отметить SwiftMailer
- Или даже более старая PEAR:: Mail.
Все это можно сочетать с профессиональным SMTP-сервером / поставщиком услуг. (Потому что типичные планы совместного хостинга 08/15 ударились или пропали, когда речь заходит о настройке / настройке электронной почты.)
Добавить почтовый заголовок в функцию почты
$header = "From: noreply@example.com\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>';
}
- Всегда пытайтесь отправлять заголовки в функции почты.
- Если вы отправляете почту через localhost, тогда выполните настройки smtp для отправки почты.
- Если вы отправляете почту через сервер, убедитесь, что на вашем сервере включена функция отправки электронной почты.
Вы используете конфигурацию 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 = "me@walalang.com";
$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";
}
Просто добавьте несколько заголовков перед отправкой почты:
<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = 'contact@yoursite.com';
$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: from@example.com' . "\r\n" .
'Reply-To: reply@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
И еще кое-что. mail()
функция не работает в localhost. Загрузите свой код на сервер и попробуйте.
У меня на 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@gmail.com', $subject, $message, $headers)
использование ''
и не ""
Этот код работает, но письмо было получено с задержкой в полчаса
В основном 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();
}
?>
Если вы используете только mail()
функция, вам нужно завершить конфигурационный файл.
Вам нужно открыть почтовое расширение и установить SMTP smtp_port
и так далее, и самое главное, ваше имя пользователя и ваш пароль. Без этого почта не может быть отправлена. Также вы можете использовать класс PHPMail для отправки.
Попробуйте эти две ветви отдельно и вместе:
- удалить
if($_POST['submit']){}
- Удалить
$from
(только мой живот)
Для тех, кто считает, что это идет вперед, я бы не рекомендовал использовать mail
, Есть некоторые ответы, которые касаются этого, но не причина этого.
РНР mail
Функция не только непрозрачна, она полностью зависит от того, какой MTA вы используете (например, Sendmail) для выполнения работы. mail
только сообщит вам, если MTA не смог его принять (т.е. Sendmail был недоступен, когда вы пытались отправить). Он не может сказать вам, была ли почта успешной, потому что она была передана. Таким образом (как подробности ответа Джона Конде), вы теперь возитесь с журналами MTA и надеетесь, что он достаточно расскажет вам о невозможности его исправить. Если вы используете общий хост или у вас нет доступа к журналам MTA, вам не повезло. К сожалению, по умолчанию для большинства ванильных установок для Linux это так.
Почтовая библиотека ( PHPMailer, Zend Framework 2+ и т. Д.) Делает что-то очень отличное от mail
, Они открывают сокет непосредственно на принимающий почтовый сервер, а затем отправляют SMTP-команды прямо через этот сокет. Другими словами, класс действует как собственный MTA (обратите внимание, что вы можете указать библиотекам использовать mail
в конечном итоге отправить письмо, но я настоятельно рекомендую вам не делать этого).
Для вас это означает, что вы можете сразу увидеть ответы от принимающего сервера (например, в PHPMailer вы можете включить отладочный вывод). Больше не нужно гадать, не удалось ли отправить письмо или почему.
Если вы используете SMTP (т.е. вы звоните
isSMTP()
), вы можете получить подробную стенограмму разговора SMTP, используяSMTPDebug
имущество.Установите эту опцию, включив такую строку в ваш скрипт:
$mail->SMTPDebug = 2;
Вы также получаете преимущество лучшего интерфейса. С mail
Вы должны настроить все свои заголовки, вложения и т. д. С библиотекой у вас есть специальная функция для этого. Это также означает, что функция выполняет все сложные части (например, заголовки).
Я думаю, что это должно сработать. Я только что добавил if(isset
и добавил конкатенацию к переменным в теле, чтобы отделить PHP от HTML.
<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = 'contact@yoursite.com';
$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>';
}
}
?>
Вы можете использовать конфигурационную электронную почту по codeigniter, например, используя smtp (простой способ):
$config = Array(
'protocol' => 'smtp',
'smtp_host' => 'mail.domain.com', //your smtp host
'smtp_port' => 26, //default port smtp
'smtp_user' => 'name@domain.com',
'smtp_pass' => 'password',
'mailtype' => 'html',
'charset' => 'iso-8859-1',
'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('name@domain.com', 'Title');
$this->email->to('emaildestination@domain.com');
$this->email->subject('Header');
$this->email->message($message);
if($this->email->send())
{
//conditional true
}
Это работает для меня!
$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>";
}
Попробуй это
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>
';
}
}
Возможно, проблема заключается в конфигурации почтового сервера, чтобы избежать проблем такого типа, или вам не нужно беспокоиться о проблеме с почтовым сервером, я рекомендую вам использовать 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 = 'correo@gmail.com';
$mail->Password = 'contrasenia';
$mail->SMTPSecure = 'ssl';
$mail->Port = 465;
//Recipients
$mail->setFrom('correo@gmail.com', 'my name');
$mail->addAddress('destination@correo.com');
//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;
}
Прежде всего,
У вас может быть много параметров для функции mail()... У вас может быть 5 макс. 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 = 'contact@yoursite.com';
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";
Также убедитесь, что у вас есть правильный порядок переменных в вашей функции mail(). mail($to,$subject,$message,etc.)
в таком порядке, иначе есть шанс, что это не сработает. Позвольте мне знать, если это помогает...
Попробуй это
<?php
$to = "somebody@example.com, somebodyelse@example.com";
$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: <webmaster@example.com>' . "\r\n";
$headers .= 'Cc: myboss@example.com' . "\r\n";
mail($to,$subject,$message,$headers);
?>
Если у вас возникли проблемы с отправкой писем с помощью 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('jane.doe@gmail.com' => 'Jane Doe'))
// The to address(es)
->setTo(array('frank.stevens@gmail.com' => '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.
Убедитесь, что на вашем сервере установлен Sendmail.
Если вы проверили свой код и убедились, что в этом нет ничего плохого, перейдите в / var / mail и проверьте, пуста ли эта папка.
Если он пуст, вам нужно будет сделать:
sudo apt-get install sendmail
если вы находитесь на сервере Ubuntu.
Это повлияет только на небольшую группу пользователей, но я бы хотел, чтобы это было задокументировано для этой небольшой группы пользователей. Этот участник этой маленькой кучки потратил 6 часов на устранение неполадок в рабочем почтовом скрипте PHP из-за этой проблемы.
Если вы собираетесь в университет, в котором работает XAMPP с сайта www.AceITLab.com, вы должны знать, что наш профессор не сказал нам: брандмауэр AceITLab (не брандмауэр Windows) блокирует MercuryMail в XAMPP. Вам придется использовать альтернативный почтовый клиент, груша работает на нас. Вам придется отправить на учетную запись Gmail с низкими настройками безопасности.
Да, я знаю, это совершенно бесполезно для реальной электронной почты. Однако из того, что я видел, академические условия и реальный мир часто имеют мало общего.
Для тех, кто не хочет использовать внешние почтовые программы и хочет использовать mail() на выделенном сервере Linux.
Способ, как php mails, описан в php.ini
в разделе [mail function]
, параметр sendmail-path
описывает, как вызывается sendmail Значение по умолчанию sendmail -t -i
так что если вы получаете работу sendmail -t -i < message.txt
в консоли Linux - все будет готово. Вы также можете добавить mail.log
отладить и убедиться, что mail() действительно вызывается.
Различные MTA могут реализовать sendmail
, они просто делают символическую ссылку на свои двоичные файлы на это имя. Например, в Debian по умолчанию используется постфикс. Настройте свой MTA для отправки почты и протестируйте его с консоли с помощью sendmail -v -t -i < message.txt
, файл message.txt
должен содержать все заголовки сообщения и тело, адрес получателя для конверта будет взят из To:
заголовок. Пример:
From: myapp@example.com
To: mymail@example.com
Subject: Test mail via sendmail.
Text body.
Я предпочитаю использовать ssmtp в качестве MTA, потому что он прост и не требует запуска демона с открытыми портами. ssmtp подходит только для отправки почты с локального хоста, он также может отправлять аутентифицированную электронную почту через вашу учетную запись в общедоступной почтовой службе. Установите ssmtp и отредактируйте конфигурацию /etc/ssmtp/ssmtp.conf
, Чтобы иметь возможность также получать локальную системную почту в учетные записи Unix (например, оповещения для root от заданий cron), настройте /etc/ssmtp/revaliases
файл.
Вот мой конфиг для моей учетной записи на яндекс почте:
root=mymail@example.com
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
AuthUser=abcde@yandex.ru
AuthPass=password
Установка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 часов...
НЕ ЗАБУДЬТЕ ПРОВЕРИТЬ СВОЮ ПАПКУ СПАМА!!!!
Если вы запускаете этот код на локальном сервере (т.е. на вашем компьютере в целях разработки), он не отправит электронное письмо получателю. Что произойдет, это создаст .txt
файл в папке с именем mailoutput
,
В случае, если вы используете бесплатную услугу шланга, как 000webhost
или же hostinger
эти поставщики услуг отключают mail()
функция для предотвращения непреднамеренного использования подделки электронной почты, спама и т. д. Я предпочитаю, чтобы вы связались с ними, чтобы узнать, поддерживают ли они эту функцию.
Если вы уверены, что поставщик услуг поддерживает функцию mail(), вы можете проверить это руководство по PHP для дальнейшего использования, PHP mail()
Чтобы проверить, поддерживает ли ваш хостинг функцию mail(), попробуйте запустить этот код (не забудьте изменить адрес электронной почты получателя)
<?php
$to = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
'Reply-To: webmaster@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
?>
Надеюсь, это помогло.
Вы можете использовать
PHPMailer
и он отлично работает, вот пример кода:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/phpmailer/phpmailer/src/Exception.php';
require 'vendor/phpmailer/phpmailer/src/PHPMailer.php';
require 'vendor/phpmailer/phpmailer/src/SMTP.php';
$editor = $_POST["editor"];
$subject = $_POST["subject"];
$to = $_POST["to"];
try {
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Mailer = "smtp";
$mail->SMTPDebug = 1;
$mail->SMTPAuth = TRUE;
$mail->SMTPSecure = "tls";
$mail->Port = 587;
$mail->Host = "smtp.gmail.com";//using smtp server
$mail->Username = "XXXXXXXXXX@gmail.com";//the email which will send the email
$mail->Password = "XXXXXXXXXX";//the password
$mail->IsHTML(true);
$mail->AddAddress($to, "recipient-name");
$mail->SetFrom("XXXXXXXXXX@gmail.com", "from-name");
$mail->AddReplyTo("XXXXXXXXXX@gmail.com", "reply-to-name");
$mail->Subject = $subject;
$mail->MsgHTML($editor);
if (!$mail->Send()) {
echo "Error while sending Email.";
var_dump($mail);
} else {
echo "Email sent successfully";
}
}
} catch (Exception $e) {
echo $e->getMessage();
}
Это может быть проблема с адресом электронной почты «От:» в этой части $ заголовков:
From: \"$name\" <$email>
Чтобы попробовать, отправьте электронное письмо без заголовков, например:
mail('user@example.com', $subject, $message);
В этом случае попробуйте использовать учетную запись электронной почты, которая уже создана в системе, из которой вы пытаетесь отправлять почту.
Вы можете использовать функции empty() и isset(). Если вы хотите, чтобы он работал с разными файлами, просто измените action='yourphp.php'
на HTML, который я даю вам, и store the PHP script
к этому 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 = 'contact@yoursite.com';
$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>
С уважением!
Вы можете увидеть свои ошибки по
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 = 'someone@gmail.com'; // SMTP username
$mail->Password = 'password'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable encryption, 'ssl' also accepted
$mail->From = 'someone@gmail.com';
$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';
?>
У меня была эта проблема, и я обнаружил, что удаление заголовков помогло мне получить почту. Итак, это:
$headers = "MIME-Version: 1.0;\r\n";
$headers .= "Content-type: text/plain; charset=utf-8;\r\n";
$headers .= "To: ".$recipient."\r\n";
$headers .= "From: ".__SITE_TITLE."\r\n";
$headers .= "Reply-To: ".$sender."\r\n";
стало так:
$headers = "From: ".__SITE_TITLE."\r\n";
$headers .= "Reply-To: ".$sender."\r\n";
Нет необходимости в заголовке To:.
Почтовые клиенты довольно хорошо распознают URL-адреса и переписывают их как гиперссылки. Поэтому я не стал писать HTML и указывать text/html в заголовке типа контента. Я просто добавил новые строки с \r\n в теле сообщения. Я понимаю, что это не подход пуристов к кодированию, но он работает для того, для чего мне это нужно.
Если вы застряли в приложении, размещенном на Hostgator, это решило мою проблему. Большое спасибо парню, который опубликовал подробное решение. Если в один прекрасный день ссылка отключится, вы увидите сводку:
- Найдите путь sendmail на своем сервере. Простой способ проверить это - временно написать следующий код на странице, доступ к которой будет иметь только вы, для чтения сгенерированной информации:
<?php phpinfo(); ?>
. Откройте эту страницу и найдитеsendmail path
. (Тогда не забудьте удалить этот код!) - Проблема и решение: если ваш путь sendmail говорит только
-t -i
, затем отредактируйте свой серверphp.ini
и добавьте следующую строку:sendmail_path = /usr/sbin/sendmail -t -i;
Но после возможности отправлять почту с помощью PHP mail()
я узнал, что он отправляет не аутентифицированное электронное письмо, что создало еще одну проблему. Все электронные письма падали в ящик нежелательной почты моего Hotmail, а некоторые электронные письма так и не были доставлены, что, я думаю, связано с тем, что они не аутентифицированы. Вот почему я решил отказаться отmail()
к PHPMailer
в конце концов, с SMTP.
Есть много способов, которые могут потерпеть неудачу, но в моем случае это было так:
Я установил на свой сервер, но локальный MTA не настроен и не работает. Если я напишу в командной строке, я получу ошибку "
Если вы получаете что-то подобное, значит, у вас не установлен/настроен MTA, и вам могут помочь следующие сведения:
Если вы получили вышеуказанную ошибку, вы можете установить локальный MTA, и тогда все должно работать, но в моем случае я не хочу запускать локальный MTA, потому что я хочу ретранслировать почту на другой почтовый сервер (прошедший проверку подлинности), используя .
возвращал FALSE, но без сообщения об ошибке, и не было никаких ошибок ни в моем php.log, ни в каком-либо другом журнале, он просто потерпел неудачу.
Я настроил следующее, чтобы переопределить использование и использовать вместо него (который использует совместимые параметры):
sendmail_path = /usr/bin/msmtp
Однако изменение этого параметра не помогло, хотя я могу запускать вручную и отправлять электронные письма.
Мне кажется, что PHP игнорирует, когда вы меняете его на что-то другое, и продолжает выполнять .
Единственный способ начать работу без установленного локального MTA был:
- В
закомментировать - Создайте символическую ссылку на
так: ln /usr/bin/msmtp /usr/sbin/sendmail
Как только я это сделал,
Я пока не могу это доказать, но интуитивно чувствую, что в PHP есть ошибка, связанная с