问题:PHP邮件功能无法完成电子邮件的发送

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com';
    $to = 'contact@yoursite.com';
    $subject = 'Customer Inquiry';
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";

    if ($_POST['submit']) {
        if (mail ($to, $subject, $body, $from)) {
            echo '<p>Your message has been sent!</p>';
        } else {
            echo '<p>Something went wrong, go back and try again!</p>';
        }
    }
?>

我尝试创建一个简单的邮件表单。表单本身在我的index.html页面上,但是它提交到单独的"感谢您提交"页面,即thankyou.php,上面的PHP代码是嵌入式。该代码可以完美提交,但从不发送电子邮件。我该如何解决?

标签:php,html,email

回答1:

尽管此答案的某些部分仅适用于mail()函数本身的使用,但许多故障排除步骤也可以应用于任何PHP邮件系统。 / em>

您的脚本似乎没有发送电子邮件的原因有多种。除非存在明显的语法错误,否则很难诊断这些问题。如果没有这种情况,则需要仔细阅读以下清单,以查找可能遇到的任何潜在陷阱。

确保已启用错误报告并设置为报告所有错误

错误报告对于根除代码中的错误和PHP遇到的常规错误至关重要。需要启用错误报告以接收这些错误。将以下代码放在PHP文件顶部(或主配置文件中)将启用错误报告。

error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");

请参见如何获取有用的错误邮件中的PHP代码?此答案,以获取有关此内容的更多详细信息。

确保已调用mail()函数

这似乎很愚蠢,但是一个常见的错误是忘记将mail()函数实际放置在您的代码中。确保它在那里并且没有被注释掉。

确保正确调用mail()函数

布尔邮件(字符串$ to,字符串$ subject,字符串$ message [,字符串$ additional_headers [,字符串$ additional_parameters]]))

邮件功能需要三个必需的参数,还可以选择第四个和第五个参数。如果您对mail()的调用没有至少三个参数,它将失败。

如果您对mail()的调用没有正确顺序的正确参数,也会失败。

检查服务器的邮件日志

您的Web服务器应该记录所有通过它发送电子邮件的尝试。这些日志的位置会有所不同(您可能需要询问服务器管理员,它们位于何处),但是通常可以在用户的​​根目录中的logs下找到它们。服务器中报告的错误消息(如果有)与您尝试发送电子邮件有关。

检查端口连接失败

端口阻止是一个非常普遍的问题,大多数开发人员在集成其代码以使用SMTP传递电子邮件时都会遇到。并且,这可以在服务器邮件日志中轻松找到(如上所述,邮件日志的服务器位置可能因服务器而异)。如果您在共享托管服务器上,则默认情况下端口25和587仍处于阻止状态。此阻止是由您的托管服务提供商有意完成的。即使对于某些专用服务器也是如此。当这些端口被阻止时,请尝试使用端口2525进行连接。如果您发现该端口也被阻止,则唯一的解决方案是与您的主机提供商联系以解除对这些端口的阻止。

大多数托管服务提供商会阻止这些电子邮件端口,以保护其网络免于发送垃圾邮件。

使用端口25或587进行普通/ TLS连接,使用端口465进行SSL连接。对于大多数用户,建议使用端口587以避免某些托管服务提供商设置的速率限制。

不要使用错误抑制运算符

错误抑制运算符 @是PHP表达式的前缀,该表达式可能生成的任何错误消息都将被忽略。在某些情况下,有必要使用此运算符,但发送邮件不是其中之一。

如果您的代码包含@mail(...),则您可能隐藏了重要的错误消息,这些消息将帮助您进行调试。删除@,然后查看是否报告了任何错误。

仅当您进行检查时,才建议使用 error_get_last() 之后针对具体故障。

检查mail()返回值

mail() 函数:

如果已成功接受邮件发送,则返回TRUE,否则返回FALSE。重要的是要注意,仅仅是因为邮件已被接受送达,并不意味着邮件实际上会到达预期的目的地。

注意这一点很重要,因为:

  • 如果您收到FALSE返回值,则表明错误在于服务器接受您的邮件。这可能不是编码问题,而是服务器配置问题。您需要与系统管理员联系,以了解发生这种情况的原因。
  • 如果您收到TRUE返回值,则并不意味着一定会发送您的电子邮件。这只是意味着电子邮件已被PHP成功发送到服务器上的相应处理程序。在PHP的控制范围之外,还有更多故障点可能导致电子邮件无法发送。

所以FALSE将帮助您指出正确的方向,而TRUE确实 不一定意味着您的电子邮件已成功发送。这一点很重要!

确保您的托管服务提供商允许您发送电子邮件并且不限制邮件发送

许多共享的虚拟主机,尤其是免费的虚拟主机提供商,要么不允许从其服务器发送电子邮件,要么限制在任何给定时间段内可以发送的邮件数量。这是由于他们努力限制垃圾邮件发送者利用便宜的服务。

如果您认为主机有电子邮件限制或阻止发送电子邮件,请查看其常见问题解答以查看他们是否列出了任何此类限制。否则,您可能需要寻求他们的支持,以验证在发送电子邮件方面是否存在任何限制。

检查垃圾邮件文件夹;防止将电子邮件标记为垃圾邮件

通常由于各种原因,通过PHP(和其他服务器端编程语言)发送的电子邮件最终都位于收件人的垃圾邮件文件夹中。在对代码进行故障排除之前,请务必在此处进行检查。

为避免通过PHP发送的邮件被发送到收件人的垃圾邮件文件夹,您可以在PHP代码中进行多种操作,否则,可以最大限度地减少将电子邮件标记为垃圾邮件的可能性。 Michiel de Mare 的好提示包括:

  • 使用电子邮件身份验证方法,例如 SPF DKIM 来证明您的电子邮件和您的域名属于同一个人,并防止欺骗您的域名。 SPF网站包含一个向导,用于为您的站点生成DNS信息。
  • 检查您的反向DNS ,以确保邮件服务器的IP地址指向用于发送邮件的域名。
  • 确保您使用的IP地址为不在黑名单上 < / li>
  • 确保回复地址是有效的现有地址。
  • 在"收件人"字段中使用收件人的全名,而不只是电子邮件地址(例如"JohnSmith" )。
  • 监视您的滥用帐户,例如abuse@yourdomain.com和postmaster@yourdomain.com。这意味着-确保这些帐户存在,阅读发送给他们的内容,并对投诉采取行动。
  • 最后,使其确实容易退订。否则,您的用户将通过按垃圾邮件按钮来退订,这将影响您的声誉。

有关此主题的更多信息,请参见如何确保以编程方式发送的电子邮件不会自动标记为垃圾邮件?

确保提供了所有邮件标题

如果某些垃圾邮件软件缺少常见的标头,例如"发件人"和"回复至",则会拒绝邮件:

$headers = array("From: from@example.com",
    "Reply-To: replyto@example.com",
    "X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);

确保邮件标题没有语法错误

无效的标题与没有标题一样糟糕。一个错误的字符可能就是使您的电子邮件出轨的全部方法。仔细检查以确保语法正确,因为PHP会为您捕获这些错误。

$headers = array("From from@example.com", // missing colon
    "Reply To: replyto@example.com",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);

不要使用伪造的发件人:发件人

尽管邮件必须具有"发件人:"发件人,但您可能不只是使用 any 值。尤其是用户提供的发件人地址是一种阻止邮件的可靠方法:

$headers = array("From: $_POST[contactform_sender_email]"); // No!

原因:您的网络或发送邮件服务器未列入SPF / DKIM白名单,因此假装对@hotmail或@gmail地址负责。它甚至可能会悄无声息地丢弃未为其配置的发件人:发件人域的邮件。

确保收件人的值正确

有时候,问题很简单,例如给电子邮件收件人的值不正确。这可能是由于使用了错误的变量所致。

$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to

另一种测试方法是将收件人值硬编码到mail()函数调用中:

mail('user@example.com', $subject, $message, $headers); 

这可以应用于所有mail()参数。

发送到多个帐户

为帮助排除电子邮件帐户问题,请将您的电子邮件发送到位于不同电子邮件提供商的多个电子邮件帐户 。如果您的电子邮件没有到达用户的Gmail帐户,请将相同的电子邮件发送到Yahoo帐户,Hotmail帐户和常规的POP3帐户(例如ISP提供的电子邮件帐户)。

如果电子邮件到达所有或其他一些电子邮件帐户,则说明您的代码正在发送电子邮件,但电子邮件帐户提供商可能出于某种原因阻止了它们。如果电子邮件没有到达任何电子邮件帐户,则问题很可能与您的代码有关。

确保代码与表单方法匹配

如果将表单方法设置为POST,请确保使用$_POST查找表单值。如果已将其设置为GET或根本没有设置,请确保使用$_GET查找表单值。

确保您的表单action值指向正确的位置

确保您的表单action属性包含一个指向您的PHP邮件代码的值。

<form action="send_email.php" method="POST">

确保Web主机支持发送电子邮件

某些Web托管提供商不允许或启用通过其服务器发送电子邮件。造成这种情况的原因可能有所不同,但是如果他们禁用了邮件发送功能,则需要使用另一种方法,该方法使用第三方来为您发送这些电子邮件。

给他们的技术支持的电子邮件(在访问他们的在线支持或FAQ之后)应阐明您的服务器上是否有电子邮件功能。

确保已配置localhost邮件服务器

如果要使用WAMP,MAMP或XAMPP在本地工作站上进行开发,则工作站上可能未安装电子邮件服务器。没有一个,PHP默认情况下无法发送邮件。

您可以通过安装基本邮件服务器来克服此问题。对于Windows,您可以使用免费的 Mercury Mail

您还可以使用SMTP发送电子邮件。请参见 这个好答案。 > Vikas Dwivedi 学习如何做。

启用PHP的自定义mail.log

除了您的MTA和PHP的日志文件外,您还可以启用 http://php.net/manual/en/mail.configuration.php 了解详情。 (最好在php.ini.user.ini.htaccess中启用这些选项。)

通过邮件测试服务进行检查

您可以使用各种传递和垃圾邮件检查服务来测试MTA / Web服务器的设置。通常,您将邮件探测发送至:他们的地址,然后获取传递报告以及稍后的更具体的故障或分析:

使用其他邮件程序

PHP内置的mail()函数很方便,通常可以完成工作,但是有其缺点。幸运的是,有一些替代方案可以提供更大的功能和灵活性,包括处理上面概述的许多问题:

所有这些都可以与专业的SMTP服务器/服务提供商结合使用。 (因为在电子邮件设置/可配置性方面,典型的08/15共享Web托管计划会失败或失败。)

回答2:

在邮件功能中添加邮件头:

$header = "From: noreply@example.com\r\n";
$header.= "MIME-Version: 1.0\r\n";
$header.= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$header.= "X-Priority: 1\r\n";

$status = mail($to, $subject, $message, $header);

if($status)
{
    echo '<p>Your mail has been sent!</p>';
} else {
    echo '<p>Something went wrong. Please try again!</p>';
}

回答3:

  1. 始终尝试在邮件功能中发送标头。
  2. 如果您要通过localhost发送邮件,请执行SMTP设置以发送邮件。
  3. 如果要通过服务器发送邮件,请检查服务器上的电子邮件发送功能是否已启用。

回答4:

如果您使用SMTP配置发送电子邮件,请尝试改用 PHPMailer 。您可以从 https://github.com/PHPMailer/PHPMailer 下载该库。

我创建了以这种方式发送的电子邮件:

function send_mail($email, $recipient_name, $message='')
{
    require("phpmailer/class.phpmailer.php");

    $mail = new PHPMailer();

    $mail->CharSet = "utf-8";
    $mail->IsSMTP();                                      // Set mailer to use SMTP
    $mail->Host = "mail.example.com";  // Specify main and backup server
    $mail->SMTPAuth = true;     // Turn on SMTP authentication
    $mail->Username = "myusername";  // SMTP username
    $mail->Password = "p@ssw0rd"; // SMTP password

    $mail->From = "me@walalang.com";
    $mail->FromName = "System-Ad";
    $mail->AddAddress($email, $recipient_name);

    $mail->WordWrap = 50;                                 // Set word wrap to 50 characters
    $mail->IsHTML(true);                                  // Set email format to HTML (true) or plain text (false)

    $mail->Subject = "This is a Sampleenter code here Email";
    $mail->Body    = $message;
    $mail->AltBody = "This is the body in plain text for non-HTML mail clients";
    $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
    $mail->addAttachment('files/file.xlsx');

    if(!$mail->Send())
    {
       echo "Message could not be sent. <p>";
       echo "Mailer Error: " . $mail->ErrorInfo;
       exit;
    }

    echo "Message has been sent";
}

回答5:

只需在发送邮件之前添加一些标题:

<?php 
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = 'contact@yoursite.com'; 
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html\r\n";
$headers .= 'From: from@example.com' . "\r\n" .
'Reply-To: reply@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

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

还有一件事。 mail()函数在localhost中不起作用。将您的代码上传到服务器并尝试。

回答6:

它通过执行以下操作在000webhost上为我工作:

$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: ". $from. "\r\n";
$headers .= "Reply-To: ". $from. "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$headers .= "X-Priority: 1" . "\r\n";

在发送电子邮件时直接输入电子邮件地址:

mail('email@gmail.com', $subject, $message, $headers)

使用'',而不是""

此代码有效,但收到电子邮件的时间为半小时。

回答7:

大多数mail()函数在共享托管中被禁用。更好的选择是使用SMTP。最好的选择是Gmail或SendGrid。


SMTPconfig.php

<?php 
    $SmtpServer="smtp.*.*";
    $SmtpPort="2525"; //default
    $SmtpUser="***";
    $SmtpPass="***";
?>

SMTPmail.php

<?php
class SMTPClient
{

    function SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body)
    {

        $this->SmtpServer = $SmtpServer;
        $this->SmtpUser = base64_encode ($SmtpUser);
        $this->SmtpPass = base64_encode ($SmtpPass);
        $this->from = $from;
        $this->to = $to;
        $this->subject = $subject;
        $this->body = $body;

        if ($SmtpPort == "") 
        {
            $this->PortSMTP = 25;
        }
        else
        {
            $this->PortSMTP = $SmtpPort;
        }
    }

    function SendMail ()
    {
        $newLine = "\r\n";
        $headers = "MIME-Version: 1.0" . $newLine;  
        $headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;  

        if ($SMTPIN = fsockopen ($this->SmtpServer, $this->PortSMTP)) 
        {
            fputs ($SMTPIN, "EHLO ".$HTTP_HOST."\r\n"); 
            $talk["hello"] = fgets ( $SMTPIN, 1024 ); 
            fputs($SMTPIN, "auth login\r\n");
            $talk["res"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpUser."\r\n");
            $talk["user"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpPass."\r\n");
            $talk["pass"]=fgets($SMTPIN,256);
            fputs ($SMTPIN, "MAIL FROM: <".$this->from.">\r\n"); 
            $talk["From"] = fgets ( $SMTPIN, 1024 ); 
            fputs ($SMTPIN, "RCPT TO: <".$this->to.">\r\n"); 
            $talk["To"] = fgets ($SMTPIN, 1024); 
            fputs($SMTPIN, "DATA\r\n");
            $talk["data"]=fgets( $SMTPIN,1024 );
            fputs($SMTPIN, "To: <".$this->to.">\r\nFrom: <".$this->from.">\r\n".$headers."\n\nSubject:".$this->subject."\r\n\r\n\r\n".$this->body."\r\n.\r\n");
            $talk["send"]=fgets($SMTPIN,256);
            //CLOSE CONNECTION AND EXIT ... 
            fputs ($SMTPIN, "QUIT\r\n"); 
            fclose($SMTPIN); 
            // 
        } 
        return $talk;
    } 
}
?>

contact_email.php

<?php 
include('SMTPconfig.php');
include('SMTPmail.php');
if($_SERVER["REQUEST_METHOD"] == "POST")
{
    $to = "";
    $from = $_POST['email'];
    $subject = "Enquiry";
    $body = $_POST['name'].'</br>'.$_POST['companyName'].'</br>'.$_POST['tel'].'</br>'.'<hr />'.$_POST['message'];
    $SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
    $SMTPChat = $SMTPMail->SendMail();
}
?>

回答8:

如果仅使用mail()函数,则需要完成配置文件。

您需要打开邮件扩展,并设置SMTPsmtp_port等,最重要的是,您的用户名和密码。否则,将无法发送邮件。另外,您可以使用PHPMail类进行发送。

回答9:

分别或同时尝试这两件事:

  1. 删除if($_POST['submit']){}
  2. $删除$

回答10:

我认为这应该可以解决问题。我只是添加了if(isset,然后将串联添加到正文中的变量中以将PHP与HTML分开。

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = 'contact@yoursite.com'; 
    $subject = 'Customer Inquiry';
    $body = "From:" .$name."\r\n E-Mail:" .$email."\r\n Message:\r\n" .$message;

if (isset($_POST['submit'])) 
{
    if (mail ($to, $subject, $body, $from)) 
    { 
        echo '<p>Your message has been sent!</p>';
    } 
    else 
    { 
        echo '<p>Something went wrong, go back and try again!</p>'; 
    }
}

?>

回答11:

对于发现此问题的任何人,我不建议使用mail。有一些与此相关的答案,但没有为什么

PHP的mail函数不仅不透明,而且完全依赖于 MTA < / a>使用(例如 Sendmail )进行工作。 mail仅会 告诉您MTA是否无法接受(即,您尝试发送时Sendmail处于关闭状态)。它无法告诉您邮件是否成功,因为它已被传递。因此(例如 John Conde的答案详细信息),您现在可以摆弄MTA的日志,并希望它告诉您有关修复它的失败的足够信息。如果您在共享主机上,或者无法访问MTA日志,那么您就不走运了。遗憾的是,大多数Linux原始安装的默认设置都是以这种方式处理的。

邮件库( PHPMailer ,Zend Framework 2+等)的作用与邮件。他们直接打开一个到接收邮件服务器的套接字,然后直接通过该套接字发送SMTP邮件命令。换句话说,该类充当其自己的MTA(请注意,您可以告诉库使用mail最终发送邮件,但我强烈建议您不要这样做)。

这意味着您可以直接查看来自接收服务器的响应(例如,在PHPMailer中,您可以打开调试输出)。无需再猜测邮件是否发送失败或原因。

如果您使用的是SMTP(即正在调用isSMTP()),则可以使用SMTPDebug属性获得SMTP会话的详细记录。 / p>

通过在脚本中包含以下行来设置此选项:

$mail->SMTPDebug = 2;

您还将受益于更好的界面。使用mail,您必须设置所有标头,附件等。使用库,您将具有专用的功能。这也意味着该函数正在执行所有棘手的部分(如标头)。

回答12:

$name = $_POST['name'];
$email = $_POST['email'];
$reciver = '/* Reciver Email address */';
if (filter_var($reciver, FILTER_VALIDATE_EMAIL)) {
    $subject = $name;
    // To send HTML mail, the Content-type header must be set.
    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= 'From:' . $email. "\r\n"; // Sender's Email
    //$headers .= 'Cc:' . $email. "\r\n"; // Carbon copy to Sender
    $template = '<div style="padding:50px; color:white;">Hello ,<br/>'
        . '<br/><br/>'
        . 'Name:' .$name.'<br/>'
        . 'Email:' .$email.'<br/>'
        . '<br/>'
        . '</div>';
    $sendmessage = "<div style=\"background-color:#7E7E7E; color:white;\">" . $template . "</div>";
    // Message lines should not exceed 70 characters (PHP rule), so wrap it.
    $sendmessage = wordwrap($sendmessage, 70);
    // Send mail by PHP Mail Function.
    mail($reciver, $subject, $sendmessage, $headers);
    echo "Your Query has been received, We will contact you soon.";
} else {
    echo "<span>* invalid email *</span>";
}

回答13:

您可以通过 CodeIgniter 使用配置电子邮件。例如,使用 SMTP (简单方法):

$config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'mail.domain.com', // Your SMTP host
        'smtp_port' => 26, // Default port for SMTP
        'smtp_user' => 'name@domain.com',
        'smtp_pass' => 'password',
        'mailtype' => 'html',
        'charset' => 'iso-8859-1',
        'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('name@domain.com', 'Title');
$this->email->to('emaildestination@domain.com');
$this->email->subject('Header');
$this->email->message($message);

if($this->email->send()) 
{
   // Conditional true
}

对我有用!

回答14:

尝试

if ($_POST['submit']) {
    $success= mail($to, $subject, $body, $from);
    if($success)
    { 
        echo '
        <p>Your message has been sent!</p>
        ';
    } else { 
        echo '
        <p>Something went wrong, go back and try again!</p>
        '; 
    }
}

回答15:

问题可能出在邮件服务器的配置上。为了避免此类问题,或者您不必担心邮件服务器问题,建议您使用 PHPMailer

这是一个具有发送邮件所需的一切的插件,您唯一需要考虑的就是启用SMTP端口(端口:25和465)。

require_once 'PHPMailer/PHPMailer.php';
require_once '/servicios/PHPMailer/SMTP.php';
require_once '/servicios/PHPMailer/Exception.php';

$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
    //Server settings
    $mail->SMTPDebug = 0;
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = 'correo@gmail.com';
    $mail->Password = 'contrasenia';
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;

    // Recipients
    $mail->setFrom('correo@gmail.com', 'my name');
    $mail->addAddress('destination@correo.com');

    // Attachments
    $mail->addAttachment('optional file');         // Add files, is optional

    // Content
    $mail->isHTML(true);// Set email format to HTML
    $mail->Subject = utf8_decode("subject");
    $mail->Body    = utf8_decode("mail content");
    $mail->AltBody = '';
    $mail->send();
}
catch (Exception $e) {
    $error = $mail->ErrorInfo;
}

回答16:

确保在服务器中安装了Sendmail。

如果您已检查代码并确认那里没有问题,请转至/ var / mail并检查该文件夹是否为空。

如果为空,则需要执行以下操作:

sudo apt-get install sendmail

如果您使用的是Ubuntu服务器。

回答17:

首先,您可能为mail()函数使用了太多参数...您最多可以包含五个mail(收件人,主题,消息,标题,参数);

$from变量而言,如果您使用的是Linux cPanel 。它自动来自您的cPanel用户名和IP地址。

$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = 'contact@yoursite.com';
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

还要确保您的mail()函数中的变量顺序正确。

按此顺序的mail($to,$subject,$message等),否则有可能无法正常工作。

回答18:

如果您在使用PHP发送邮件时遇到麻烦,请考虑使用 PHPMailer < / a>或"> SwiftMailer

我通常在需要使用PHP发送邮件时使用SwiftMailer。


基本用法:

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('jane.doe@gmail.com' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('frank.stevens@gmail.com' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Your message has been sent!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "error",
        "message" => 'Oops! Something went wrong!'
    ], JSON_PRETTY_PRINT);
}

有关如何操作的更多信息,请参见"> 官方文档 使用SwiftMailer。

回答19:

适用于那些不想使用外部邮件程序并希望在专用Linux服务器上进行mail()操作的人。

PHP的发送方式,在[邮件功能]部分的php.ini中进行了描述。

参数sendmail-path描述了sendmail的调用方式。默认值为sendmail-t-i,因此,如果您在Linux控制台中得到了一个有效的sendmail-t-i ,则可以完成。您还可以添加mail.log进行调试,并确保确实调用了mail()。

不同的MTA可以实现sendmail。他们只是在该名称上建立了指向其二进制文件的符号链接。例如,在 Debian 中,默认值为后缀。将您的MTA配置为发送邮件并使用sendmail-v-t-i 从控制台对其进行测试。文件message.txt应该包含邮件的所有标头和正文,信封的目标地址将从To:标头中获取。示例:

From: myapp@example.com
To: mymail@example.com
Subject: Test mail via sendmail.

Text body.

我更喜欢将 ssmtp 用作MTA,因为它很简单并且不需要在打开的端口上运行守护程序。 ssmtp仅适合从 localhost 发送邮件。它还可以通过您的公共邮件服务帐户发送经过身份验证的电子邮件。安装ssmtp并编辑配置文件/etc/ssmtp/ssmtp.conf。为了也能够接收到Unix帐户的本地系统邮件(例如,从cron作业向root发出警报),请配置/etc/ssmtp/revaliases文件。

这是我在Yandex邮件上的帐户配置:

root=mymail@example.com
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
AuthUser=abcde@yandex.ru
AuthPass=password

回答20:

这只会影响一小部分用户,但我希望为一小部分用户提供文档。由于这个问题,这个少数的成员花了6个小时来对可用的PHP邮件脚本进行故障排除。

如果您要去www.AceITLab.com上运行XAMPP的大学,您应该知道我们的教授没有告诉我们的内容:AceITLab防火墙(不是Windows防火墙)阻止了XAMPP中的MercuryMail。您将不得不使用备用邮件客户端,梨正在为我们工作。您必须发送到安全设置较低的Gmail帐户。

是的,我知道,这对于现实世界的电子邮件完全没有用。但是,从我所看到的情况来看,学术环境和现实世界通常没有什么共同之处。

回答21:

如果您是在本地服务器(即用于开发目的的计算机)上运行此代码,则不会将电子邮件发送给收件人。它将在名为mailoutput的文件夹中创建一个.txt文件。

如果您使用的是免费托管服务,例如000webhosthostinger,这些服务提供商将禁用mail()功能为防止意外使用电子邮件欺骗,垃圾邮件等。我更希望您与他们联系,以查看它们是否支持此功能。

如果您确定服务提供商支持mail()函数,则可以查看此PHP手册以获取更多参考,

PHP邮件()

要检查您的托管服务是否支持mail()函数,请尝试运行以下代码(记住要更改收件人电子邮件地址)

<?php
    $to      = 'nobody@example.com';
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: webmaster@example.com' . "\r\n" .
        'Reply-To: webmaster@example.com' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

    mail($to, $subject, $message, $headers);
?>

回答22:

Sendmail 安装,用于Debian 10.0.0(" Buster ')实际上微不足道!

php.ini

[mail function]
sendmail_path=/usr/sbin/sendmail -t -i
; (Other directives are mostly windows)

标准 sendmail 软件包安装(允许"发送"):

su -                                        # Install as user 'root'
dpkg --list                                 # Is install necessary?
apt-get install sendmail sendmail-cf m4     # Note multiple package selection
sendmailconfig                              # Respond all 'Y' for new install

其他有用的命令:

which sendmail                              # /usr/sbin/sendmail
which sendmailconfig                        # /usr/sbin/sendmailconfig
man sendmail                                # Documentation
systemctl restart sendmail                  # As and when required

验证(发送能力)

echo "Subject: sendmail test" | sendmail -v <yourEmail>@gmail.com

以上过程大约花费了5分钟。然后我浪费了5个小时... 别忘了检查您的垃圾邮件文件夹

回答23:

您可以使用libmail: http:// lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=zh_CN

include "libmail.php";
$m = new Mail(); // Create the mail
$m->From($_POST['form']);
$m->To($_POST['to']);
$m->Subject($_POST['subject']);
$m->Body($_POST['body']);
$m->Cc($_POST['cc']);
$m->Priority(4);
// Attach a file of type 'image/gif' to be displayed in the message if possible
$m->Attach("/home/leo/toto.gif", "image/gif", "inline");
$m->Send(); // Send the mail
echo "Mail was sent:"
echo $m->Get(); // Show the mail source

回答24:

您可以通过以下方式查看错误:

error_reporting(E_ALL);

我的示例代码是:

<?php
    use PHPMailer\PHPMailer\PHPMailer;
    require 'PHPMailer.php';
    require 'SMTP.php';
    require 'Exception.php';

    $name = $_POST['name'];
    $mailid = $_POST['mail'];
    $mail = new PHPMailer;
    $mail->IsSMTP();
    $mail->SMTPDebug = 0;                   // Set mailer to use SMTP
    $mail->Host = 'smtp.gmail.com';         // Specify main and backup server
    $mail->Port = 587;                      // Set the SMTP port
    $mail->SMTPAuth = true;                 // Enable SMTP authentication
    $mail->Username = 'someone@gmail.com';  // SMTP username
    $mail->Password = 'password';           // SMTP password
    $mail->SMTPSecure = 'tls';              // Enable encryption, 'ssl' also accepted

    $mail->From = 'someone@gmail.com';
    $mail->FromName = 'name';
    $mail->AddAddress($mailid, $name);       // Name is optional
    $mail->IsHTML(true);                     // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'Here is your message' ;
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
    if (!$mail->Send()) {
       echo 'Message could not be sent.';
       echo 'Mailer Error: ' . $mail->ErrorInfo;
       exit;
    }
    echo 'Message has been sent';
?>

回答25:

有几种可能性:

  1. 您正面临服务器问题。该服务器没有任何邮件服务器。因此,您的邮件无法正常工作,因为您的代码正常并且邮件可以使用类型。

  2. 您没有获得过帐值。尝试使用静态值的代码。

  3. 使用SMTP邮件发送邮件...

回答26:

如果您的sendmail系统可以正常工作,则必须按如下所示修改您的代码:

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];

    $header ="
Content-Type: text/html; charset=UTF-8\r\n
MIME-Version: 1.0\r\n
From: \"$name\" <$email>\r\n
Reply-To: no-reply@yoursite.com\r\n
X-Mailer: yoursite.com mailer\r\n
";

    $to = '"Contact" <contact@yoursite.com>'; 
    $subject = 'Customer Inquiry';
    $body =<<<EOB
<!DOCTYPE html>
<html>
    <body>
        $message
    </body>
</html>
EOB;

    if ($_POST['submit']) {
        if (mail ($to, $subject, $body, $header) !== false) { 
            echo '<p>Your message has been sent!</p>';
        } else { 
            echo '<p>Something went wrong, go back and try again!</p>'; 
        }
    }
?>

这使您能够发送基于HTML的电子邮件。

值得注意的是:

  1. 我们构建了一个标题多行字符串(每行用\ r \ n分隔);
  2. 我们添加了Content-type来表示我们返回HTML,以便您编写更好的电子邮件(可以像在HTML页面中一样向邮件中添加所需的HTML代码,包括CSS)。

注意:<< 语法要求最后一个EOB标记从行首开始,并且在分号后没有空格或任何字符。

回到顶部