Отправить письмо с PHP из html-формы на submit с тем же скриптом

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

Я нашел этот код, но почта не отправляет.

<?php if (isset($_POST['submit'])) { $to = $_POST['email']; $subject = $_POST['name']; $message = getRequestURI(); $from = "zenphoto@example.com"; $headers = "From:" . $from; if (mail($to, $subject, $message, $headers)) { echo "Mail Sent."; } else { echo "failed"; } } ?> 

Каков код для отправки электронной почты на PHP?

EDIT (# 1)

Если я правильно понимаю, вы хотите иметь все на одной странице и выполнять ее с той же страницы.

Вы можете использовать следующий код для отправки почты с одной страницы, например index.php или contact.php

Единственное различие между этим и моим первоначальным ответом – это <form action="" method="post"> где действие осталось пустым.

Лучше использовать header('Location: thank_you.php'); вместо echo в обработчике PHP для перенаправления пользователя на другую страницу впоследствии.

Скопируйте весь код ниже в один файл.

 <?php if(isset($_POST['submit'])){ $to = "email@example.com"; // this is your Email address $from = $_POST['email']; // this is the sender's Email address $first_name = $_POST['first_name']; $last_name = $_POST['last_name']; $subject = "Form submission"; $subject2 = "Copy of your form submission"; $message = $first_name . " " . $last_name . " wrote the following:" . "\n\n" . $_POST['message']; $message2 = "Here is a copy of your message " . $first_name . "\n\n" . $_POST['message']; $headers = "From:" . $from; $headers2 = "From:" . $to; mail($to,$subject,$message,$headers); mail($from,$subject2,$message2,$headers2); // sends a copy of the message to the sender echo "Mail Sent. Thank you " . $first_name . ", we will contact you shortly."; // You can also use header('Location: thank_you.php'); to redirect to another page. } ?> <!DOCTYPE html> <head> <title>Form submission</title> </head> <body> <form action="" method="post"> First Name: <input type="text" name="first_name"><br> Last Name: <input type="text" name="last_name"><br> Email: <input type="text" name="email"><br> Message:<br><textarea rows="5" name="message" cols="30"></textarea><br> <input type="submit" name="submit" value="Submit"> </form> </body> </html> при <?php if(isset($_POST['submit'])){ $to = "email@example.com"; // this is your Email address $from = $_POST['email']; // this is the sender's Email address $first_name = $_POST['first_name']; $last_name = $_POST['last_name']; $subject = "Form submission"; $subject2 = "Copy of your form submission"; $message = $first_name . " " . $last_name . " wrote the following:" . "\n\n" . $_POST['message']; $message2 = "Here is a copy of your message " . $first_name . "\n\n" . $_POST['message']; $headers = "From:" . $from; $headers2 = "From:" . $to; mail($to,$subject,$message,$headers); mail($from,$subject2,$message2,$headers2); // sends a copy of the message to the sender echo "Mail Sent. Thank you " . $first_name . ", we will contact you shortly."; // You can also use header('Location: thank_you.php'); to redirect to another page. } ?> <!DOCTYPE html> <head> <title>Form submission</title> </head> <body> <form action="" method="post"> First Name: <input type="text" name="first_name"><br> Last Name: <input type="text" name="last_name"><br> Email: <input type="text" name="email"><br> Message:<br><textarea rows="5" name="message" cols="30"></textarea><br> <input type="submit" name="submit" value="Submit"> </form> </body> </html> 

Оригинальный ответ


Я не был уверен в том, каков был вопрос, но создается впечатление, что копия сообщения должна быть отправлена ​​лицу, заполнившему форму.

Вот тестовая / рабочая копия HTML-формы и обработчик PHP. Это использует функцию PHP mail() .

Обработчик PHP также отправит копию сообщения лицу, заполнившему форму.

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

Например: // $subject2 = "Copy of your form submission"; не будет выполняться.

HTML ФОРМА:

 <!DOCTYPE html> <head> <title>Form submission</title> </head> <body> <form action="mail_handler.php" method="post"> First Name: <input type="text" name="first_name"><br> Last Name: <input type="text" name="last_name"><br> Email: <input type="text" name="email"><br> Message:<br><textarea rows="5" name="message" cols="30"></textarea><br> <input type="submit" name="submit" value="Submit"> </form> </body> </html> 

Обработчик PHP (mail_handler.php)

(Использует информацию из формы HTML и отправляет электронную почту)

 <?php if(isset($_POST['submit'])){ $to = "email@example.com"; // this is your Email address $from = $_POST['email']; // this is the sender's Email address $first_name = $_POST['first_name']; $last_name = $_POST['last_name']; $subject = "Form submission"; $subject2 = "Copy of your form submission"; $message = $first_name . " " . $last_name . " wrote the following:" . "\n\n" . $_POST['message']; $message2 = "Here is a copy of your message " . $first_name . "\n\n" . $_POST['message']; $headers = "From:" . $from; $headers2 = "From:" . $to; mail($to,$subject,$message,$headers); mail($from,$subject2,$message2,$headers2); // sends a copy of the message to the sender echo "Mail Sent. Thank you " . $first_name . ", we will contact you shortly."; // You can also use header('Location: thank_you.php'); to redirect to another page. // You cannot use header and echo together. It's one or the other. } ?> при <?php if(isset($_POST['submit'])){ $to = "email@example.com"; // this is your Email address $from = $_POST['email']; // this is the sender's Email address $first_name = $_POST['first_name']; $last_name = $_POST['last_name']; $subject = "Form submission"; $subject2 = "Copy of your form submission"; $message = $first_name . " " . $last_name . " wrote the following:" . "\n\n" . $_POST['message']; $message2 = "Here is a copy of your message " . $first_name . "\n\n" . $_POST['message']; $headers = "From:" . $from; $headers2 = "From:" . $to; mail($to,$subject,$message,$headers); mail($from,$subject2,$message2,$headers2); // sends a copy of the message to the sender echo "Mail Sent. Thank you " . $first_name . ", we will contact you shortly."; // You can also use header('Location: thank_you.php'); to redirect to another page. // You cannot use header and echo together. It's one or the other. } ?> 

Отправить в формате HTML:

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

Прочтите руководство по mail() чтобы узнать, как отправлять электронные письма в формате HTML:


Примечания:

  • Что касается HTML5

Вы должны указать URL-адрес службы, которая будет обрабатывать представленные данные, используя атрибут action.

Как указано в https://www.w3.org/TR/html5/forms.html в разделе 4.10.1.3 Настройка формы для связи с сервером . Для получения полной информации обратитесь к странице.

Следовательно, action="" не будет работать в HTML5.

Правильный синтаксис:

  • action="handler.xxx" или
  • action="http://www.example.com/handler.xxx" .

Обратите внимание, что xxx будет расширением типа файла, используемого для обработки процесса. Это может быть расширение .php , .cgi , .pl , .jsp и т. Д.


Проконсультируйтесь со следующими вопросами и ответами, если отправка почты не удалась:

  • Форма электронной почты PHP не завершает отправку электронной почты

PHP-скрипт для подключения к SMTP-серверу и отправки электронной почты в Windows 7

Отправка электронной почты с PHP в Windows – это немного минное поле с ошибками и царапинами головы. Я попытаюсь провести вас через один экземпляр, где я получил его для работы с Windows 7 и PHP 5.2.3 под (IIS) веб-сервером Internet Information Services.

Я предполагаю, что вы не хотите использовать какую-либо заранее созданную инфраструктуру, такую ​​как CodeIgniter или Symfony, которая содержит возможности отправки электронной почты. Мы отправим электронное письмо из автономного файла PHP. Я приобрел этот код из-под оболочки codeigniter (под системой / библиотеки) и изменил его, чтобы вы могли просто заглянуть в этот файл Email.php, и он должен просто работать.

Это должно работать с более новыми версиями PHP. Но ты никогда не знаешь.

Шаг 1. Вам нужно имя пользователя / пароль с SMTP-сервером:

Я использую SMTP-сервер из smtp.ihostexchange.net который уже создан и настроен для меня. Если у вас этого нет, вы не можете продолжить. Вы должны иметь возможность использовать почтовый клиент, такой как thunderbird, evolution, Microsoft Outlook , чтобы указать ваш smtp-сервер, а затем сможете отправлять электронные письма туда.

Шаг 2. Создайте свой файл электронной почты Hello World:

Я предполагаю, что вы используете IIS. Поэтому создайте файл под C:\inetpub\wwwroot index.php под C:\inetpub\wwwroot и поместите здесь этот код:

 <?php include("Email.php"); $c = new CI_Email(); $c->from("FromUserName@foobar.com"); $c->to("user_to_receive_email@gmail.com"); $c->subject("Celestial Temple"); $c->message("Dominion reinforcements on the way."); $c->send(); echo "done"; ?> в <?php include("Email.php"); $c = new CI_Email(); $c->from("FromUserName@foobar.com"); $c->to("user_to_receive_email@gmail.com"); $c->subject("Celestial Temple"); $c->message("Dominion reinforcements on the way."); $c->send(); echo "done"; ?> 

Вы должны иметь возможность посетить этот index.php, перейдя в localhost / index.php в браузере, это приведет к ошибкам, потому что отсутствует Email.php. Но убедитесь, что вы можете хотя бы запустить его из браузера.

Шаг 3. Создайте файл с именем Email.php :

Создайте новый файл с именем Email.php в папке C:\inetpub\wwwroot .

Скопируйте / вставьте этот PHP-код в Email.php:

https://github.com/sentientmachine/standalone_php_script_send_email/blob/master/Email.php

Поскольку существует много типов smtp-серверов, вам придется вручную Email.php настройки в верхней части Email.php . Я настроил его так, что он автоматически работает с smtp.ihostexchange.net , но ваш smtp-сервер может отличаться.

Например:

  1. Установите параметр smtp_port в порт вашего SMTP-сервера.
  2. Установите для параметра smtp_crypto значение, которое требуется вашему SMT-серверу.
  3. Установите $ newline и $ crlf, чтобы он совместим с вашим сервером smtp. Если вы ошибаетесь, сервер smtp может игнорировать ваш запрос без ошибок. Я использую \ r \ n, для вас возможно \n требуется.

Связанный код слишком длинный для вставки в качестве ответа stackoverflow. Если вы хотите отредактировать его, оставьте комментарий здесь или через github, и я его поменю.

Шаг 4, убедитесь, что ваш php.ini имеет расширение ssl:

Найдите файл PHP.ini и раскомментируйте

 ;extension=php_openssl.dll 

Так выглядит:

 extension=php_openssl.dll 

Шаг 5: Запустите файл index.php, который вы только что создали в браузере:

Вы должны получить следующий результат:

 220 smtp.ihostexchange.net Microsoft ESMTP MAIL Service ready at Wed, 16 Apr 2014 15:43:58 -0400 250 2.6.0 <534edd7c92761@summitbroadband.com> Queued mail for delivery lang:email_sent done 

Шаг 6, проверьте электронную почту и папку со спамом:

Посетите учетную запись электронной почты для user_to_receive_email@gmail.com, и вы должны получить электронное письмо. Он должен прибыть в течение 5 или 10 секунд. Если вы этого не сделаете, проверьте ошибки, возвращенные на странице. Если это не сработает, попробуйте размять лицо на клавиатуре на Google, повторяя: «Работа в продуктовом магазине не так уж плоха».

Если вы еще этого не сделали, посмотрите на свой php.ini и убедитесь, что параметры в настройках [mail function] установлены правильно, чтобы активировать службу электронной почты. После использования библиотеки PHPMailer и следуйте инструкциям.

Вы также можете использовать приложение mandrill для отправки почты в php. Вы получите API от https://mandrillapp.com/api/docs/index.php.html, где вы сможете найти полную информацию о отправляемых письмах и других деталях.

Вам нужно добавить action в форму:

  <form name='form1' method='post' action='<?php echo($_SERVER['PHP_SELF']);'> <!-- All your input for the form here --> </form> 

Затем поместите свой фрагмент в верхнюю часть документа, чтобы отправить почту. Что такое echo($_SERVER['PHP_SELF']); что он отправляет вашу информацию в начало вашего скрипта, чтобы вы могли его использовать.

Вот настройки почты PHP, которые я использую:

 //Mail sending function $subject = $_POST['name']; $to = $_POST['email']; $from = "zenphoto@example.com"; //data $msg = "Your MSG <br>\n"; //Headers $headers = "MIME-Version: 1.0\r\n"; $headers .= "Content-type: text/html; charset=UTF-8\r\n"; $headers .= "From: <".$from. ">" ; mail($to,$subject,$msg,$headers); echo "Mail Sent."; при //Mail sending function $subject = $_POST['name']; $to = $_POST['email']; $from = "zenphoto@example.com"; //data $msg = "Your MSG <br>\n"; //Headers $headers = "MIME-Version: 1.0\r\n"; $headers .= "Content-type: text/html; charset=UTF-8\r\n"; $headers .= "From: <".$from. ">" ; mail($to,$subject,$msg,$headers); echo "Mail Sent."; 

Вам нужен SMPT-сервер, чтобы

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

работать.

Вы можете попробовать SMTP-серверы с легким весом, такие как xmailer

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

 $message = echo getRequestURI(); 

вместо:

 $message = getRequestURI(); 

(С тех пор этот код был отредактирован.)