【问题标题】:Send email with PHP from html form on submit with the same script在使用相同脚本提交时从 html 表单发送带有 PHP 的电子邮件
【发布时间】:2017-06-13 19:55:07
【问题描述】:

当用户填写完 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 吗?
  • 我不明白你想做什么。是否要将邮件副本发送给填写表格的人?

标签: php html email


【解决方案1】:

编辑(#1)

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

您可以使用以下代码从单个页面发送邮件,例如index.phpcontact.php

这个和我原来的答案之间的唯一区别是&lt;form action="" method="post"&gt;,其中操作被留空。

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


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

【讨论】:

  • 如果我有一个生成该页面的 php 脚本(如 index.php),我是否可以在 HTML 表单上使用这个 mail_handler.php 代码??
  • @fusi0n 你的意思是让表单和处理程序在同一个页面中,而不是使用 2 个文件?
  • @CalculatingMachine 我的猜测是这是一个 JS 问题,而 JS 并不是我非常擅长的,尤其是在事件触发方面。我能建议的最好的方法是查看您的控制台,和/或发布问题。我相信你会找到能够提供帮助的人,干杯
  • @MilchePatern 谢谢。我回来后会修改我的答案。我必须像现在一样离开 - 哈哈干杯
  • @MilchePatern 我已对答案进行了编辑,为了保留最初给出的答案,已将其包含在 脚注: 下。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    我假设您不想使用任何包含电子邮件发送功能的预构建框架,例如 CodeIgniter 或 Symfony。我们将从一个独立的 PHP 文件发送一封电子邮件。我从 codeigniter 引擎盖下(在 system/libraries 下)获取了此代码并对其进行了修改,因此您可以直接放入此 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 而出现错误。但请确保您至少可以从浏览器中运行它。

    第三步,创建一个名为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

    链接代码太长,无法粘贴为stackoverflow答案,如果要编辑它,请在此处或通过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
    

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

    访问 user_to_receive_email@gmail.com 的电子邮件帐户,您应该会收到一封电子邮件。它应该在 5 或 10 秒内到达。如果没有,请检查页面上返回的错误。如果这不起作用,请尝试在谷歌的键盘上捣碎你的脸,同时高呼:“在杂货店工作还不错。”

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        然后把你的sn-p放在文件的顶部发送邮件。 echo($_SERVER['PHP_SELF']); 所做的是将您的信息发送到脚本的顶部,以便您可以使用它。

        【讨论】:

        • 不正确 - 如果表单上没有 action 属性,则假定为同一页面。
        【解决方案6】:

        您需要一个 SMPT 服务器才能使用

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

        上班。

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

            $message = echo getRequestURI();
            

            代替:

            $message = getRequestURI();
            

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

            【讨论】:

              猜你喜欢
              • 2015-11-18
              • 2016-08-01
              • 1970-01-01
              • 1970-01-01
              • 2019-02-13
              相关资源
              最近更新 更多