【问题标题】:Why won't this PHP mail script work?为什么这个 PHP 邮件脚本不起作用?
【发布时间】:2015-01-01 03:06:18
【问题描述】:

我不太了解 PHP,我正在尝试获取一个非常简单的 PHP 脚本来发送电子邮件。单击提交时,我收到了谢谢消息,但没有电子邮件。

<?php $name = $_POST['name'];
$email = $_POST['email'];
$web = $_POST['web'];
$message = $_POST['message'];
$formcontent="From: $name \n Website: $web \n Message: $message";
$recipient = "myemail@example.com"; // I do have my email here
$subject = "Contact Form";
$mailheader = "From: $email \r\n";
mail($recipient, $subject, $formcontent, $mailheader) or die("Error!");
echo "Thank You!";
    ?>

这里是html表单:

<form action="mail.php" method="post" class="form">  

    <p class="name">  
      <label for="name">Name</label>
        <input type="text" name="name" id="name" />  

    </p>  

    <p class="email">  
      <label for="email">E-mail</label> 
        <input type="text" name="email" id="email" />  

    </p>  

    <p class="web">  
      <label for="web">Website</label> 
        <input type="text" name="web" id="web" />  

    </p>  

    <p class="text">  
      <label for="web">Comments</label> 
        <textarea name="message"></textarea>  
    </p>  

    <p class="submit">  
        <input type="submit" value="Send" />  
    </p>        
</form> 

【问题讨论】:

  • 使用错误处理程序找出 mail 错误是什么。或者您可以使用已经构建的类,如 PHPMailer
  • 收不到 PHP mail() 的原因有很多,比如你的开发环境没有运行 SMTP 服务器,它进入垃圾邮件(这很常见)你的 ISP 阻止出站消息,等等。你有 SMTP 服务器吗?你能看懂它的日志吗?
  • 真的,建议使用PHPMailer之类的东西,而不是mail()
  • 你是如何运行脚本的?如果您通过自己的 Internet 连接在自己的计算机上运行它,请注意某些 ISP 会阻止外发电子邮件。
  • 是的,我知道它可能无法在本地运行,所以它在 Web 服务器上。那么我应该用 PHPmailer() 替换 mail() 吗?除此之外,它看起来还可以吗?感谢您的快速回复。

标签: php email


【解决方案1】:

嗯...看起来不错。试试:

mail('youremail@hotmail.com', 'aSubject', 'aMessage');

所有参数不是变量,而是带单引号的实际字符串

应该会在接下来的 5 分钟内出现在您的普通/垃圾邮件邮件中。


如果这不起作用,则意味着脚本没有执行,因此将 mail.php 更改为:

echo 'hi';

确保脚本路径正确。那会找出问题所在,干杯。

【讨论】:

  • 对我来说看起来也不错,实际上我在自己的服务器上复制了这个脚本,并且邮件完美发送,只是掉进了我的垃圾邮件箱
  • 改成mail('youremail@hotmail.com', 'aSubject', 'aMessage');我确实收到了,但发件人是@dreamhost.com
  • 添加"From: apples@hotmail.com \r\n" 作为第四个参数(同样,这是一个字符串而不是变量)。如果您收到电子邮件,则表示表单提交有问题:)
  • 由于某种原因,当我单击提交解析错误时出现此错误:语法错误,第 7 行 /home/user/mywebsite.com/some-folder/mail.php 中的意外 T_STRING
  • 你的代码是完美的(刚刚在 gmail 中测试过)。您尝试使用的 Web 服务器一定有问题。 http://www.w3schools.com/php/php_mail.asp 是最简单的教程。抱歉,我帮不上忙 =/
【解决方案2】:

我建议你为此简单地使用 PHPMAILER 类,这样你就可以休息一下了。

https://code.google.com/a/apache-extras.org/p/phpmailer/

这将很有帮助,因此您无需开始为编辑大量代码而烦恼,因为这会浪费您的时间用于其他工作。

检查示例文件夹中的文件以获取 SMTP 示例,并使用 SMTP 高级或基本。使用 SMTP 高级,您将能够抛出并捕获您的错误。这可以帮助您知道哪里有错误,直到所有错误都得到解决。请参阅 SMTP 基本代码的示例代码。

require_once('../class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

$mail             = new PHPMailer();

$body             = file_get_contents('contents.html');
$body             = preg_replace('/[\]/','',$body);

$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host       = "mail.yourdomain.com"; // SMTP server
$mail->SMTPDebug  = 2;                     // enables SMTP debug information (for testing)
                                           // 1 = errors and messages
                                           // 2 = messages only
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Host       = "mail.yourdomain.com"; // sets the SMTP server
$mail->Port       = 26;                    // set the SMTP port for the GMAIL server
$mail->Username   = "yourname@yourdomain"; // SMTP account username
$mail->Password   = "yourpassword";        // SMTP account password

$mail->SetFrom('name@yourdomain.com', 'First Last');

$mail->AddReplyTo("name@yourdomain.com","First Last");

$mail->Subject    = "PHPMailer Test Subject via smtp, basic with authentication";

$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test

$mail->MsgHTML($body);

$address = "whoto@otherdomain.com";
$mail->AddAddress($address, "John Doe");

$mail->AddAttachment("images/phpmailer.gif");      // attachment
$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment

if(!$mail->Send()) {
  echo "Mailer Error: " . $mail->ErrorInfo;
} else {
  echo "Message sent!";
}

当您完成测试并希望现在停止输出 SMTP 缓冲区消息时,请找到显示的这一行

$mail->SMTPDebug = 2;

替换成

$mail->SMTPDebug = false;
$mail->do_debug = 0;

那你就可以走了。必要时提出问题。

【讨论】:

  • 好的,谢谢,我现在正在尝试。因此,在我下载并安装 PHPmailer 后,将这个基本示例代码放在我的 mail.php 文件中,并在正确的位置填写我的信息,接下来我会做什么?我不确定我看到它如何与我的表单字段进行通信。谢谢
  • 这是我希望你做的,尽管它包含在你的下载文件中。在下载文件的根文件夹中,您会看到 class.smtp.php 和 class.phpmailer.php。这两个文件是必需的。在您要处理表单的页面中,确保 require_once('../class.phpmailer.php');指向它所在的实际位置。我建议您将 class.smtp.php 和 class.phpmailer.php 以及用于处理表单的脚本都放在同一个文件夹中,因此您只需要将类文件作为 require_once('class.phpmailer.php');。试试看。
  • 我认为我已经正确设置了所有内容。在 mail() 脚本中,我可以看到 $email = $_POST['email']; $email 变量被赋值为输入字段中名称为 email 但在 PHPmailer 脚本中如何将这些表单值放入 mail.php?我要在脚本中添加什么来做到这一点?我希望这是有道理的。抱歉,这对我来说是全新的。
  • 根据您的问题,上面的表格是否是联系表格,以便我知道谁在发送和谁在接收,以便我可以为您配置应该工作的内容?
  • 是的,这是一个联系表格。在研究了一段时间的代码后,我对它有了更好的理解,但它仍然不适合我。我不断收到正文为空的错误。
【解决方案3】:

首先,您应该知道您的代码会使用 POST 进行标头注入。 您应该使用 filter_var() (http://php.net/manual/fr/function.filter-var.php) 来确保 $email 值是无害的。

那么,有几个原因会阻止 PHP 发送您的邮件。

mail() 函数使用您服务器的 MTA(例如 sendmail、postfix...):您需要正确安装/配置它才能发送邮件。

您的 ISP 也可以阻止 25 端口(以防止垃圾邮件)。

或者,您可以使用 php pear 的 Mail 和 Net_SMTP 类通过 SMTP 发送电子邮件。这些类以方便的方式处理编码、附加文件等。

【讨论】:

    【解决方案4】:

    我不是后端开发人员,所以我对 php 了解不多,但这段代码对我有用,所以试试吧。

    <p><span>Name</span><input class="contact" type="text" name="your_name" value="" /></p>
                <p><span>Email Address</span><input class="contact" type="text" name="your_email" value="" /></p>
    			<p><span>Message</span><textarea class="contact textarea" rows="8" cols="50" name="your_message"></textarea></p>
                 
                <p style="padding-top: 15px"><span>&nbsp;</span><input class="submit" type="submit" name="contact_submitted" value="Send" /></p>
                <?php
                $your_name = $_POST['your_name'];
                $your_email = $_POST[your_email];
                $your_message = $_POST['your_message'];
                $recipient = "youremailhere@domain.com";
                $subject = "New Message About BikeExcel";
                
                mail($recipient , $subject, $your_message, "From " . $your_email);
                echo "Your Message Has Been Sent";
                ?>

    因此,您无需将电子邮件放入邮件字符串中,而是创建一个变量来定义您的电子邮件。这也将使您的代码看起来不错,这将使您在投资组合中看起来不错。我希望这会有所帮助!!!!

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 2018-10-25
      • 1970-01-01
      • 2015-06-16
      • 2011-03-25
      • 2020-12-14
      • 2015-01-30
      • 2013-10-20
      • 2014-09-24
      相关资源
      最近更新 更多