Отправить письмо с PHP из html формы на submit с тем же script
Я хочу отправить электронное письмо с PHP, когда пользователь закончил заполнять форму HTML, а затем отправил электронную почту из формы. Я хочу сделать это из того же script, который отображает веб-страницу с формой.
Я нашел этот код, но почта не отправляет.
<?php
if (isset($_POST['submit'])) {
$to = $_POST['email'];
$subject = $_POST['name'];
$message = getRequestURI();
$from = "[email protected]";
$headers = "From:" . $from;
if (mail($to, $subject, $message, $headers)) {
echo "Mail Sent.";
}
else {
echo "failed";
}
}
?>
Что такое код для отправки электронной почты на PHP?
Ответы
Ответ 1
EDIT (# 1)
Если я правильно понимаю, вы хотите иметь все на одной странице и выполнять ее с той же страницы.
Вы можете использовать следующий код для отправки почты с одной страницы, например index.php
или contact.php
Единственное различие между этим и моим первоначальным ответом - <form action="" method="post">
, где действие осталось пустым.
Лучше использовать header('Location: thank_you.php');
вместо echo
в обработчике PHP, чтобы впоследствии перенаправить пользователя на другую страницу.
Скопируйте весь код ниже в один файл.
<?php
if(isset($_POST['submit'])){
$to = "[email protected]"; // this is your Email address
$from = $_POST['email']; // this is the sender 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 protected]"; // this is your Email address
$from = $_POST['email']; // this is the sender 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 one or the other.
}
?>
Отправить в формате HTML:
Если вы хотите отправить почту как HTML и для обоих экземпляров, вам нужно будет создать два разных набора заголовков HTML с разными именами переменных.
Прочитайте руководство по mail()
, чтобы узнать, как отправлять электронные письма как HTML:
Сноска:
Вы должны указать URL-адрес службы, которая будет обрабатывать представленные данные, используя атрибут действия.
Как указано в 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
и т.д.
Проконсультируйтесь со следующим Q & A на стеке, если отправка почты не удалась:
Ответ 2
PHP script для подключения к SMTP-серверу и отправки электронной почты в Windows 7
Отправка электронной почты с PHP в Windows - это немного минное поле с gotchas и царапинами головы. Я попытаюсь провести вас через один экземпляр, где я получил его для работы с Windows 7 и PHP 5.2.3 под (IIS) веб-сервером Internet Information Services.
Я предполагаю, что вы не хотите использовать какие-либо заранее созданные рамки, такие как CodeIgniter или Symfony, которые содержат возможности отправки электронной почты. Мы отправим электронное письмо из автономного файла PHP. Я приобрел этот код из-под codeigniter hood (под system/libraries) и изменил его, чтобы вы могли просто заглянуть в этот файл Email.php, и он должен просто работать.
Это должно работать с более новыми версиями PHP. Но вы никогда не знаете.
Шаг 1, вам нужно имя пользователя/пароль с SMTP-сервером:
Я использую smtp-сервер из smtp.ihostexchange.net
, который уже создан и настроен для меня. Если у вас этого нет, вы не можете продолжить. Вы должны иметь возможность использовать почтовый клиент, такой как thunderbird, evolution, Microsoft Outlook, чтобы указать ваш smtp-сервер, а затем сможете отправлять электронные письма туда,
Шаг 2. Создайте свой файл электронной почты Hello World:
Я предполагаю, что вы используете IIS. Поэтому создайте файл под индексом index.php под C:\inetpub\wwwroot
и разместите там этот код:
<?php
include("Email.php");
$c = new CI_Email();
$c->from("[email protected]");
$c->to("[email protected]");
$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
. Я настроил его так, что он автоматически работает с smtp.ihostexchange.net
, но ваш smtp-сервер может быть другим.
Например:
- Установите параметр smtp_port в порт вашего SMTP-сервера.
- Задайте параметр smtp_crypto для вашего сервера smtp.
- Установите $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
<[email protected]> Queued mail for delivery
lang:email_sent
done
Шаг 6, проверьте электронную почту и папку со спамом:
Посетите учетную запись электронной почты для [email protected], и вы должны получить электронное письмо. Он должен прибыть в течение 5 или 10 секунд. Если вы этого не сделаете, проверьте ошибки, возвращенные на странице. Если это не сработает, попробуйте размять лицо на клавиатуре в Google, повторяя: "Работа в продуктовом магазине не так уж плоха".
Ответ 3
Если вы еще этого не сделали, посмотрите на свой php.ini
и убедитесь, что параметры под [mail function]
установлены правильно, чтобы активировать службу электронной почты. После использования PHPMailer и следуйте инструкциям.
Ответ 4
Вы также можете использовать приложение mandrill для отправки почты в php. Вы получите API из https://mandrillapp.com/api/docs/index.php.html, где вы сможете найти полную информацию о отправляемых письмах и других деталях.
Ответ 5
Вот настройки почты PHP, которые я использую:
//Mail sending function
$subject = $_POST['name'];
$to = $_POST['email'];
$from = "[email protected]";
//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.";
Ответ 6
Вам нужно добавить action
в форму:
<form name='form1' method='post' action='<?php echo($_SERVER['PHP_SELF']);'>
<!-- All your input for the form here -->
</form>
Затем поместите ваш фрагмент в верхнюю часть документа, чтобы отправить почту. Что делает echo($_SERVER['PHP_SELF']);
, так это то, что он отправляет вашу информацию в верхнюю часть вашего script, чтобы вы могли ее использовать.
Ответ 7
Вам нужен сервер SMPT для
... mail($to,$subject,$message,$headers);
для работы.
Вы можете попробовать SMTP-серверы с легким весом, такие как xmailer
Ответ 8
Я думаю, что одна ошибка в исходном коде могла быть такой:
$message = echo getRequestURI();
вместо:
$message = getRequestURI();
(С тех пор этот код был отредактирован.)