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

时间:2013-08-22 11:33:36

标签: php html email

当用户填写完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发送电子邮件的代码是什么?

8 个答案:

答案 0 :(得分:127)

编辑(#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 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.
    }
?>

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


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

答案 1 :(得分:4)

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

在Windows中发送来自PHP的电子邮件是一个带有陷阱和头痛的雷区。我将尝试引导您完成一个实例,我将其用于(IIS)Internet Information Services Web服务器下的Windows 7和PHP 5.2.3。

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

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

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

我正在使用smtp.ihostexchange.net中的smtp服务器,它已经为我创建并设置了。如果你没有这个,你就无法继续。您应该能够使用email client like thunderbird, evolution, Microsoft Outlook来指定您的smtp服务器,然后能够通过那里发送电子邮件。

第2步,创建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
  4. 链接代码太长而不能粘贴为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秒内到达。如果不这样做,请检查页面上返回的错误。如果这不起作用,请尝试在谷歌的键盘上捣碎你的脸,同时念诵:“在杂货店工作并不是那么糟糕。”

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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

答案 4 :(得分: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.";

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:0)

您需要一个SMTP服务器才能

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

工作。

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

答案 7 :(得分:-1)

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

loadStuff

而不是:

$message = echo getRequestURI();

(此后代码已被编辑。)