2016-12-30 2 views
0

Я пытаюсь запустить форму электронной почты, которая берет текст из форм ввода пользователя и отправляет их на нужное вам электронное письмо (рассматривается как $ myemail в php ниже).Почему этот код электронной почты не работает?

<form method="post" name="contact_form" action="Contact.php"> 
     Your Name: <input type="text" required name="name"> 
     Email Address: <input type="text" required name="email"> 
     Message: <textarea required name="message"></textarea> 
     <input type="submit" value="Submit"> 
</form> 

<?php 
$errors = ''; 
$myemail = 'enterDesiredEmail'; 

if(empty($_POST['name']) || empty($_POST['email']) || empty($_POST['message'])) { 
     $errors .= "\n Error: all fields are required"; 
} 

$name = null; 
$email_address = null; 
$message = null; 

$name = $_POST["name"]; 
$email_address = $_POST["email"]; 
$message = $_POST["message"]; 

if (!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i",$email_address)) { 
     $errors .= "\n Error: Invalid email address"; 
} 

if(empty($errors)) { 
    $to = $myemail; 
    $email_subject = "Contact form submission: $name"; 
    $email_body = "You have received a new message. ". 
    " Here are the details:\n Name: $name \n ". 
    "Email: $email_address\n Message \n $message"; 
    $headers = "From: $myemail\n"; 
    $headers .= "Reply-To: $email_address"; 
    mail($to,$email_subject,$email_body,$headers); 
} 
?> 

Я выплюнул вышеуказанный код на веб-страницу и загрузил файл на свой сервер. При доступе к веб-странице в Интернете, заполнении содержимого формы и нажатии sbmit, страница обновляется с входами и текстовыми полями, как и ожидалось. Когда я проверил сообщение электронной почты, которое я установил, сообщение не было получено. Что я могу сделать, чтобы исправить этот код, чтобы на самом деле адрес электронной почты получал сообщение?

Большое спасибо.

+2

Команда mail требует, чтобы был настроен sendmail или какой-либо другой почтовый сервер. –

+0

Попробуйте добавить тип в свой заголовок, чтобы сервер знал, как обрабатывать сценарий. По типу я имею в виду, если это html-адрес электронной почты или просто текст. Во-вторых, создайте экземпляр переменной для функции почты. Он возвращает true, если почта была отправлена, а false - в противном случае. Например $ send = mail (....): if ($ sent) do stuff .... надеюсь, это поможет –

+1

Вам нужно поместить '\ r \ n' между полями заголовка, а не просто' \ n'. – Barmar

ответ

1

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

1)Use Error Logging.

2) Убедитесь, что на вашем сервере установлена ​​действительная настройка почтового сервера. Как указано в комментариях Джейсона К.

3) Используйте почтовую библиотеку, такую ​​как PHPMailer. Это оборачивается огромным количеством головной боли.

4) Проверьте ваши письма действительны с the correct code, principly использования filter_var, а не тупые регулярных выражений.

Также проверьте электронную почту: Санированная (FILTER_SANITIZE_EMAIL).

5) Если не используется или настройке библиотеки, такие как PHPMailer или SwiftMailer то нужно, чтобы проверить mail headers are exactly correct.

БОНУС
Там, кажется, некоторые conflictingaccounts, что использовать для электронных окончаний строк [включая заголовки], но я хотел бы предложить PHP_EOL или \r\n (то же самое на серверах Linux). \n не подходит. Как говорится в комментариях Бармара.

Удача

1

Вам необходимо интерполировать переменную $ фактической электронной почты внутри двойных кавычек из:
$headers = "From: $myemail\n"; к $headers = "From: ${myemail}"."\r\n";
Если вы укажите дополнительные заголовки, как From, Cc и Bcc.
Дополнительные заголовки должны быть разделены CRLF (\ r \ n).

Это пример из PHP документа:

`<?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

Нет разницы между '' From: $ myemail \ n "и' "From: $ {myemail} \ n" '. Вам нужны только фигурные скобки для сложных переменных. – Barmar

1

Вам следует попробовать использовать библиотеку, такую ​​как PHPMailer. Функция mail() иногда недостаточно гибкая, чтобы в большинстве случаев добиться того, что вам нужно. Также для функции mail() требуется локальный почтовый сервер. Кроме того, PHPMailer предлагает множество дополнений, таких как возможность установки вложений или возможность отправлять HTML-письма вашим пользователям. Использование такой библиотеки также означает, что вы отправляете электронные письма почти все время, прошедшие с момента тестирования и использования многими людьми.

Вы можете найти учебник для использования PHPMailer здесь: https://www.sitepoint.com/sending-emails-php-phpmailer/

Примера кода, взятого с сайта с помощью PHPMailer:

<?php 

require_once "vendor/autoload.php"; 

//PHPMailer Object 
$mail = new PHPMailer; 

//From email address and name 
$mail->From = "[email protected]"; 
$mail->FromName = "Full Name"; 

//To address and name 
$mail->addAddress("[email protected]", "Recepient Name"); 
$mail->addAddress("[email protected]"); //Recipient name is optional 

//Address to which recipient will reply 
$mail->addReplyTo("[email protected]", "Reply"); 

//CC and BCC 
$mail->addCC("[email protected]"); 
$mail->addBCC("[email protected]"); 

//Send HTML or Plain Text email 
$mail->isHTML(true); 

$mail->Subject = "Subject Text"; 
$mail->Body = "<i>Mail body in HTML</i>"; 
$mail->AltBody = "This is the plain text version of the email content"; 

if(!$mail->send()) 
{ 
    echo "Mailer Error: " . $mail->ErrorInfo; 
} 
else 
{ 
    echo "Message has been sent successfully"; 
} 

?> 
Смежные вопросы