问题描述
当用户填写了一个 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 中发送电子邮件的代码是什么?
最佳解决方法
编辑 (#1)
如果我理解正确,您希望将所有内容都放在一个页面中,并从同一页面执行。
您可以使用以下代码从单个页面发送邮件,例如 index.php
或 contact.php
这个和我原来答案的唯一区别是<form action="" method="post">
,其中动作已经留空。
最好在 PHP 处理程序中使用 header('Location: thank_you.php');
代替 echo
,然后再将用户重定向到另一个页面。
将下面的整个代码复制到一个文件中。
<?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:" . "nn" . $_POST['message'];
$message2 = "Here is a copy of your message " . $first_name . "nn" . $_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:" . "nn" . $_POST['message'];
$message2 = "Here is a copy of your message " . $first_name . "nn" . $_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
您必须使用 action 属性指定将处理提交的数据的服务的 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:
次佳解决方法
PHP 脚本连接到 SMTP 服务器并在 Windows 7 上发送电子邮件
在 Windows 中发送 PHP 的电子邮件是一个有雷人和头痛的雷区。我会尝试通过一个实例,让我在 Windows 7 和 PHP 5.2.3(IIS)Internet Information Services Web 服务器下工作。
我假设你不想使用任何包含电子邮件发送功能的 CodeIgniter 或 Symfony 的 pre-built 框架。我们将从独立的 PHP 文件发送电子邮件。我从 codeigniter hood(在系统/库下) 获取了这个代码,并修改了它,所以你可以放在这个 Email.php 文件中,它应该只是工作。
这应该适用于较新版本的 PHP 。但你永远不会知道
步骤 1,您需要使用 SMTP 服务器的用户名/密码:
我正在使用 smtp.ihostexchange.net
的 smtp 服务器,该服务器已经为我创建并设置了。如果你没有这个,你不能继续。您应该可以使用 email client like thunderbird, evolution, Microsoft Outlook 来指定您的 smtp 服务器,然后才能通过该邮件发送电子邮件。
步骤 2,创建 Hello World 电子邮件文件:
我假设你正在使用 IIS 。所以在 C:inetpubwwwroot
下创建一个名为 index.php 的文件,并将这段代码放在那里:
<?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";
?>
您应该能够通过浏览浏览器到 localhost /index.php 来访问此 index.php,因为 Email.php 丢失,所以会发出错误。但请确保您至少可以从浏览器运行它。
步骤 3,创建名为 Email.php
的文件:
在 C:inetpubwwwroot
下创建一个名为 Email.php 的新文件。
将此 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
<534edd7c92761@summitbroadband.com> Queued mail for delivery
lang:email_sent
done
步骤 6,检查你的电子邮件和垃圾邮件文件夹:
访问 user_to_receive_email@gmail.com 的电子邮件帐户,您应该已收到一封电子邮件。它应该在 5 或 10 秒内到达。如果没有,请检查页面上返回的错误。如果这不行,请尝试在谷歌上的键盘上揉搓你的脸,吟诵:「在杂货店工作不是那么糟糕。
第三种解决方法
如果还没有,请查看您的 php.ini
,并确保 [mail function]
设置下的参数设置正确以激活电子邮件服务。您可以使用 PHPMailer 库并按照说明进行操作。
第四种方法
您还可以使用 mandrill 应用程序在 php 中发送邮件。您将从 https://mandrillapp.com/api/docs/index.php.html 获取 API,您可以在其中找到有关发送的电子邮件和其他详细信息的完整详细信息。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。