使用相同的脚本从 html 表单发送电子邮件

我想用 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 发送电子邮件的代码是什么?

763176 次浏览

您需要一个 SMPT 服务器以便

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

去工作。

您可以尝试轻量级的 SMTP 服务器,比如 xmailer

下面是我使用的 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.";

您需要在表单中添加一个 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.ini,并确保在 [mail function]设置下的参数设置正确,以激活电子邮件服务。之后可以使用 PHPMailer库并按照说明进行操作。

编辑(# 1)

如果我理解正确,您希望将所有内容放在一个页面中,并从同一个页面执行它。

您可以使用以下代码从单个页面发送邮件,例如 index.phpcontact.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:" . "\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 处理程序还会将消息的副本发送给填写表单的人。

如果您不打算使用它,可以在一行代码前面使用两个正斜杠 //

例如: // $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.
}
?>

以 HTML 格式发送:

如果您希望将邮件作为 HTML 发送,并且对于这两个实例,那么您将需要创建两组不同的 HTML 头文件,它们具有不同的变量名。

阅读 mail()手册,学习如何以 HTML 格式发送电子邮件:


脚注:

  • 关于 HTML5

您必须使用 action 属性指定将处理提交数据的服务的 URL。

正如在 4.10.1.3配置表单以与服务器通信下面的 https://www.w3.org/TR/html5/forms.html所概述的那样。要获得完整的信息,请参考页面。

因此,action=""将不能在 HTML5中工作。

正确的语法应该是:

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

请注意,xxx将是用于处理进程的文件类型的扩展名。这可能是 .php.cgi.pl.jsp文件扩展名等。


如果发送邮件失败,请参考 Stack 上的问答:

连接到 SMTP 服务器并在 Windows7上发送电子邮件的 PHP 脚本

在 Windows 中从 PHP 发送电子邮件有点像雷区,让人摸不着头脑。我将尝试带您通过一个实例,其中我让它在 Windows7和 PHP5.2.3(IIS) Internet 信息服务网络服务器下工作。

我假设您不想使用任何包含电子邮件发送功能的预构建框架,如 CodeIgniter 或 Symfony。我们将从一个独立的 PHP 文件发送电子邮件。我从 codeigniter 兜帽下(在系统/库下)获得了这段代码,并对其进行了修改,这样您就可以直接放入这个 Email.php 文件,它应该就可以工作了。

这应该适用于 PHP 的新版本,但是你永远不会知道。

步骤1,您需要一个 SMTP 服务器的用户名/密码:

我正在使用来自 smtp.ihostexchange.net的 smtp 服务器,它已经为我创建和设置好了。如果你没有这个,你就不能继续。您应该能够使用 电子邮件客户端如雷鸟,进化,微软 Outlook,指定 smtp 服务器,然后能够通过它发送电子邮件。

第二步,创建你的 Hello World 电子邮件文件:

我猜你在用 IIS。因此,在 C:\inetpub\wwwroot下面创建一个名为 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:\inetpub\wwwroot下创建一个名为 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 服务器可能有所不同。

例如:

  1. 将 smtp _ port 设置为 smtp 服务器的端口。
  2. 将 smtp _ crypto 设置为 smtp 服务器所需的值。
  3. 设置 $newline 和 $crlf,使其与 smtp 服务器所使用的兼容。如果选择错误,smtp 服务器可能会忽略您的请求而不出错。我用 r n,对你来说可能需要 \n

链接的代码太长,无法粘贴成堆栈溢出的答案,如果你想编辑它,在这里或通过 github 留下一个注释,我会改变它。

步骤4,确保 php.ini 启用了 ssl 扩展:

查找 PHP.ini 文件并取消注释

;extension=php_openssl.dll

看起来是这样的:

extension=php_openssl.dll

第五步,运行刚才在浏览器中创建的 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

第六步,检查你的电子邮件和垃圾邮件文件夹:

访问 user _ to _ access _ email@gmail.com 的电子邮件帐户,您应该已经收到了一封电子邮件。应该在5到10秒内到达。如果没有,请检查页面上返回的错误。如果这还不行,那就试试在谷歌上把你的脸按在键盘上,同时高喊: “在杂货店工作也不是那么糟糕。”

您还可以使用 Mandrill 应用程序在 php 中发送邮件。您将从 https://mandrillapp.com/api/docs/index.php.html获得 API,在那里您可以找到有关发送的电子邮件和其他详细信息的完整细节。

我认为原始代码中的一个错误可能是:

$message = echo getRequestURI();

而不是:

$message = getRequestURI();

(不过代码已经被编辑过了。)