PHP Mail 表单不在 Linux 服务器上发送电子邮件

Posted

技术标签:

【中文标题】PHP Mail 表单不在 Linux 服务器上发送电子邮件【英文标题】:PHP Mail form not sending emails on Linux server 【发布时间】:2013-04-28 15:55:00 【问题描述】:

这是我的代码和我的表单......它就像电子邮件已发送,但它从未到达。

我想知道可能出了什么问题...有人吗?

该网站托管在 Linux 服务器上,我真的不知道服务器是否会因为某种不兼容而阻止电子邮件......我真的不知道它可能是什么。

<?php
if($_POST)

//check if its an ajax request, exit if not
if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') 
    die();
 

$to_Email       = "myemail@gmail.com"; //Replace with recipient email address
$subject        = 'Ah!! My email from Somebody out there...'; //Subject line for emails

//check $_POST vars are set, exit if any missing
if(!isset($_POST["userName"]) || !isset($_POST["userEmail"]) || !isset($_POST["userPhone"]) || !isset($_POST["userMessage"]))

    die();


//Sanitize input data using PHP filter_var().
$user_Name        = filter_var($_POST["userName"], FILTER_SANITIZE_STRING);
$user_Email       = filter_var($_POST["userEmail"], FILTER_SANITIZE_EMAIL);
$user_Phone       = filter_var($_POST["userPhone"], FILTER_SANITIZE_STRING);
$user_Message     = filter_var($_POST["userMessage"], FILTER_SANITIZE_STRING);

//additional php validation
if(strlen($user_Name)<4) // If length is less than 4 it will throw an HTTP error.

    header('HTTP/1.1 500 Name is too short or empty!');
    exit();

if(!filter_var($user_Email, FILTER_VALIDATE_EMAIL)) //email validation

    header('HTTP/1.1 500 Please enter a valid email!');
    exit();

if(!is_numeric($user_Phone)) //check entered data is numbers

    header('HTTP/1.1 500 Only numbers allowed in phone field');
    exit();

if(strlen($user_Message)<5) //check emtpy message

    header('HTTP/1.1 500 Too short message! Please enter something.');
    exit();


//proceed with PHP email.
$headers = 'From: '.$user_Email.'' . "rn" .
'Reply-To: '.$user_Email.'' . "rn" .
'X-Mailer: PHP/' . phpversion();

@$sentMail = mail($to_Email, $subject, $user_Message .'  -'.$user_Name, $headers);

if(!$sentMail)

    header('HTTP/1.1 500 Couldnot send mail! Sorry..');
    exit();
else
    echo 'Hi '.$user_Name .', Thank you for your email! ';
    echo 'Your email has already arrived in my Inbox, all I need to do is Check it.';

 
?> 

这是我的表格:

<fieldset id="contact_form">
<legend>My Contact Form</legend>
    <div id="result"></div>
    <input type="text" name="name" id="inputt" placeholder="Enter Your Name" />


   <input type="text" name="email" id="inputt" placeholder="Enter Your Email" />


    <input type="text" name="phone" id="inputt" placeholder="Phone Number" />


    <textarea name="message" id="message" placeholder="Enter Your Name"></textarea>


   <button class="submit_btn" id="submit_btn">Submit</button>

</fieldset>

【问题讨论】:

服务器上的邮件日志说什么?大多数 Linux 发行版在 /var/log/mail.log/var/log/maillog 下都有它 2013 年 5 月 4 日星期六 05:54:58] [错误] [客户端 189.62.216.81] sendmail:选项需要一个参数 -- r,引用者:zerodesign.com.br [5 月 4 日星期六 05:54: 58 2013] [错误] [client 189.62.216.81] sendmail:选项需要一个参数--r,referer:zerodesign.com.br 【参考方案1】:

您的$headers 错误,您附加了"rn" 而不是"\r\n"。试试这个:

$headers = 'From: '.$user_Email. "\r\n" .
'Reply-To: '.$user_Email. "\r\n" .
'X-Mailer: PHP/' . phpversion();

【讨论】:

【参考方案2】:

根据您在邮件日志中的评论,您需要调整 php.ini 以将 --r 参数包含到您的 sendmail_path

默认情况下通常是:

sendmail_path = /usr/sbin/sendmail -t -i

显然您正在使用另一个也需要 --r 参数的参数。将它附加到您的 sendmail_path 应该会有很长的路要走。

【讨论】:

对不起,我不知道该怎么做,请你解释一下好吗? 我在ftp上找到了php.ini,现在该怎么办? 所有全局 PHP 设置都保存在一个名为 php.ini 的文件中,通常位于 Linux 安装的 /etc 文件夹中。在那里,应该设置上面的行,但很可能带有其他参数。检查它的设置以及可能需要 -r 标志的内容。有关参数的完整列表,请参阅 linux.about.com/od/commands/l/blcmdl8_sendmai.htm。

以上是关于PHP Mail 表单不在 Linux 服务器上发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

使用 mail() PHP 脚本的 jQuery AJAX 表单发送电子邮件,但来自 HTML 表单的 POST 数据未定义

通过电子邮件发送带有 PHP 和 HTML 错误消息“Cannot POST mail.php”的表单

如何指定PHP应该使用外部邮件服务器发送mail()?

PHP 表单 - 3(PHP 表单 - 必需字段)

22PHP 表单 - 必需字段

php发送表单无法正常工作[关闭]