81

当用户填写完 HTML 表单然后通过电子邮件发送表单中的信息时,我想用 PHP 发送电子邮件。我想从显示具有表单的网页的同一脚本中执行此操作。

我找到了这段代码,但邮件没有发送。

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

4

8 回答 8

171

编辑(#1)

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

您可以使用以下代码从单个页面发送邮件,例如index.phpcontact.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> 

原始答案


我不太确定问题是什么,但我的印象是邮件的副本将发送给填写表格的人。

这是 HTML 表单和 PHP 处理程序的测试/工作副本。这使用 PHPmail()函数。

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。

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文件扩展名等。


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

于 2013-08-22T13:36:56.940 回答
5

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

在 Windows 中从 PHP 发送电子邮件有点像一个雷区,有很多陷阱和令人头疼的问题。我将尝试向您介绍一个实例,我让它在 (IIS) Internet 信息服务网络服务器下的 Windows 7 和 PHP 5.2.3 上运行。

我假设您不想使用任何包含电子邮件发送功能的预构建框架,例如 CodeIgniter 或 Symfony。我们将从一个独立的 PHP 文件发送一封电子邮件。我从 codeigniter 引擎盖下(在系统/库下)获取了此代码并对其进行了修改,以便您可以放入此 Email.php 文件,它应该可以正常工作。

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

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

我正在使用smtp.ihostexchange.net已经为我创建和设置的 smtp 服务器。如果你没有这个,你就不能继续。您应该能够使用Thunderbird、evolution、Microsoft Outlook 等电子邮件客户端来指定您的 smtp 服务器,然后能够通过那里发送电子邮件。

第 2 步,创建您的 Hello World 电子邮件文件:

我假设您正在使用 IIS。所以在下面创建一个名为 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";
?>

您应该可以通过在浏览器中导航到 localhost/index.php 来访问这个 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 服务器可能会有所不同。

例如:

  1. 将 smtp_port 设置为 smtp 服务器的端口。
  2. 将 smtp_crypto 设置为您的 smtp 服务器所需的设置。
  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 秒内到达。如果没有,请检查页面上返回的错误。如果这不起作用,请尝试在谷歌的键盘上捣碎你的脸,同时高呼:“在杂货店工作还不错。”

于 2014-04-16T20:35:44.543 回答
4

如果您还没有,请查看您的php.ini并确保设置下的参数[mail function]设置正确以激活电子邮件服务。之后您可以使用PHPMailer库并按照说明进行操作。

于 2013-08-22T13:03:13.547 回答
3

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

于 2014-09-25T05:36:56.857 回答
2

您需要在action表单中添加一个,例如:

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

然后将您的代码段放在文档顶部并发送邮件。它的作用是将您echo($_SERVER['PHP_SELF']);的信息发送到脚本的顶部,以便您可以使用它。

于 2013-08-22T11:53:29.470 回答
1

您需要一个 SMPT 服务器才能

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

去工作。

你可以试试像 xmailer 这样的轻量级 SMTP 服务器

于 2013-08-22T11:46:43.583 回答
1

以下是我使用的 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.";
于 2013-08-22T11:47:15.220 回答
-2

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

$message = echo getRequestURI();

代替:

$message = getRequestURI();

(不过,代码已经过编辑。)

于 2015-12-09T08:50:20.740 回答