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


73

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


您可以显示完整的代码,包括HTML吗?
阿马尔·穆拉利

我不明白你想做什么。您是否要将邮件副本发送给填写表格的人?
Funk 40 Niner,2013年

Answers:


155

编辑(#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.html4.10.1.3所述,配置表单以与服务器进行通信。有关完整的信息,请参阅页面。

因此,action=""将无法在HTML5中使用。

正确的语法为:

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

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


如果发送邮件失败,请在堆栈上咨询以下问答:


如果我有生成该页面的php脚本(例如index.php),有没有办法可以在HTML表单上使用此mail_handler.php代码?
fusi0n

1
@ fusi0n您的意思是在同一页面中包含表单和处理程序,而不是使用2个文件吗?
Funk 40 Niner 2013年

1
@CalculatingMachine我的猜测是这是一个JS问题,而JS不是我非常擅长的事情,尤其是在事件触发方面。我能建议的最好方法是看您的控制台,然后发布问题。我确定您会找到可以帮助的人,为他们喝彩
Funk Forty Niner

1
@MilchePatern谢谢你。我回来时会修改答案。我要离开像现在-笑干杯
芬克四十Niner

1
@MilchePatern我对答案进行了编辑,为了保留最初给出的答案,该内容已包含在Footnotes中:
Funk 40 Niner

4

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


4

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

在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服务器。如果没有,则无法继续。您应该能够使用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秒内到达。如果没有,请检查页面上返回的错误。如果这样不起作用,请尝试在Google键盘上将您的脸糊化,同时高喊:“在杂货店工作还不错。”




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']);做的是,它会将您的信息,你的脚本的顶部,这样你可以使用它。


1
不正确-如果action表单上没有属性,则假定使用同一页面。
Blazemonger,2014年

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.";

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.