PHP 邮件功能不能完成电子邮件的发送

共24个回答, 标签: php html email
Your message has been sent!';
        } else {
            echo 'Something went wrong, go back and try again!';
        }
    }
?>

我尝试过创建一个简单的邮件表单。表单本身在我 index.html 的页面上, 但提交给一个单独的 "谢谢你的提交" 页面, thankyou.php 上面的 php 代码是嵌入的。代码提交完美, 但从不发送电子邮件。请帮帮我。

第1个答案

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

您的脚本似乎没有发送电子邮件的原因有很多。除非出现明显的语法错误, 否则很难诊断这些事情。如果没有一个, 你需要运行下面的清单, 以找到任何潜在的陷阱, 你可能会遇到。

确保启用了错误报告, 并将其设置为报告所有错误

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

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

有关这方面的更多详细信息, 请参阅此堆栈溢出答案

确保调用该 mail() 函数

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

确保 mail() 正确调用该函数

邮件 (字符串 $to、字符串 $subject、字符串 $message [、字符串 $additional _ 小时候 [、字符串 $additional 参数]])

邮件函数采用三个必需的参数, 并可选择第四个和第五个参数。如果您的调用 mail() 没有至少三个参数, 它将失败。

如果您的调用 mail() 没有正确的参数按正确的顺序进行, 它也将失败。

检查服务器的邮件日志

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

检查端口连接失败

端口块是大多数开发人员在集成代码以使用 SMTP 传递电子邮件时面临的一个非常常见的问题。而且, 这可以很容易地在服务器邮件日志中跟踪 (邮件日志服务器的位置可能因服务器而异, 如上文所述)。如果您在共享托管服务器上, 端口 25 和 587 在默认情况下仍处于阻止状态。此块是由您的托管提供商故意完成的。即使对于某些专用服务器也是如此。当这些端口被阻止时, 请尝试使用端口 2525 进行连接。如果您发现该端口也被阻止, 则唯一的解决方案是与您的托管提供商联系以取消阻止这些端口。

大多数托管提供商阻止这些电子邮件端口, 以保护其网络不发送任何垃圾邮件。

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

不要使用错误抑制运算符

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

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

只有当你[](https://stackoverflow.com/quest href=)

第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 'Your mail has been sent!';
} else {
    echo 'Something went wrong, Please try again!';
}
第3个答案
  1. 始终尝试在邮件功能中发送标头。
  2. 如果您通过本地主机发送邮件, 请执行 smtp 设置以发送邮件。
  3. 如果要通过服务器发送邮件, 请检查服务器上是否启用了电子邮件发送功能。
第4个答案

您是否使用 SMTP 配置发送电子邮件? 请尝试改用 phmailer。你可以从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())
    {
第5个答案

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

还有一件事该 mail() 函数在本地主机中不工作。将代码上传到服务器, 然后尝试。

第6个答案

它在 2000 网站主机上为我工作, 通过执行以下操作:

$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


Smtmail. php

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);
            <".$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;
    }
}
?>

联系电子邮件. php

'.$_POST['companyName'].''.$_POST['tel'].''.''.$_POST['message'];
    $SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
    $SMTPChat = $SMTPMail->SendMail();
}
?>
第8个答案

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

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

第9个答案

单独和一起尝试这两个问题:

  1. 删除if($_POST['submit']){}
  2. 删除 $from (只是我的肠胃)
第10个答案

对于任何发现这一点的人来说, 我不建议使用 mail 。有一些答案涉及到这一点, 但不是原因

PHP 的 mail 功能不仅是不透明的, 它完全依赖于您使用的任何 MTA (即 sendmail) 来完成这项工作 mail 。它不能告诉你邮件是否成功, 因为它已经发出了。因此 (如约翰·康德的答案细节), 你现在可以摆弄 MTA 的日志, 希望它能足够告诉你解决它的失败。如果您使用的是共享主机或无法访问 MTA 日志, 则说明您运气不佳。遗憾的是, 大多数用于 Linux 的香草安装的默认值都是这样处理的。

邮件库 (phpmailer、Zend framework 2 + 等) 做了一些截然不同 mail 的事情。他们所做的是直接向接收邮件服务器打开套接字, 然后直接通过该套接字发送 SMTP 邮件命令。换句话说, 该类充当自己的 MTA (请注意, 您可以告诉库使用 mail 最终发送邮件, 但我强烈建议您不要这样做)。

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

如果您使用的是 SMTP (即您正在调用 isSMTP() ), 则可以使用该属性获取 SMTP 对话的详细记录 SMTPDebug

通过在脚本中包含这样的行来设置此选项:

$mail->SMTPDebug = 2;

您还可以获得更好的界面的好处。mail使用您必须设置所有的标头、附件等。有了一个库, 你就有了一个专门的函数来做到这一点。这也意味着函数正在做所有棘手的部分 (如标头)。

第11个答案

我想这应该能起到作用。我只是在 if(isset 正文中的变量中添加了一个并添加了连接, 以将 php 与 html 分开。

Your message has been sent!';
    }
    else
    {
        echo 'Something went wrong, go back and try again!';
    }
}

?>
第12个答案

您可以使用配置电子邮件的代码点火器, 例如使用 smtp (简单的方法):

$config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'mail.domain.com', //your smtp host
        'smtp_port' => 26, //default port 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
}

这对我很管用!

第13个答案
$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 = 'Hello ,'
        . ''
        . 'Name:' .$name.''
        . 'Email:' .$email.''
        . ''
        . '';
    $sendmessage = "" . $template . "";
    // 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 "* invalid email *";
}
第14个答案

试试这个



       HTML email


      This email contains HTML Tags!


         Firstname
         Lastname


          John
          Doe



    " ;="" always="" set="" content-type="" when="" sending="" html="" email="" $headers="MIME-Version: 1.0" .="" "\r\n";="" $headers="" .="Content-type:text/html;charset=UTF-8" .="" "\r\n";="" more="" headers="" $headers="" .='From: ' .="" "\r\n";="" $headers="" .='Cc: myboss@example.com' .="" "\r\n";="" mail($to,$subject,$message,$headers);=""?>
第15个答案

试试这个

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

如果您在使用 PHP 发送邮件时遇到问题, 请考虑另一种方法, 如phpmailerSwiftmailer

每当我需要用 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('New messageHere goes the rest of my message', '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 的详细信息, 请参阅官方文档

第17个答案

请确保您的服务器上安装了 Sendmail。

如果您已检查了代码并验证没有任何问题, 请转到/var/mail 并检查该文件夹是否为空。

如果它是空的, 则需要执行以下操作:

sudo apt-get install sendmail

如果你在 Ubuntu 服务器上。

第18个答案

也许问题是邮件服务器的配置, 为了避免这种类型的问题, 或者你不必担心邮件服务器的问题, 我建议你使用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;
     }
第19个答案

对于那些不希望使用外部邮件, 并希望在专用 linux 服务器上发送邮件 () 的用户。

方法, 如何 php 邮件, 在部分中描述 php.ini [mail function] 。 参数 sendmail-path 描述如何调用发送邮件。默认值是 sendmail -t -i , 所以如果你 sendmail -t -i <> 在 linux 控制台工作--你就完了。您还可以添加 mail.log 到调试, 并确保邮件 () 是真正调用的。

不同的 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 仅适用于从本地主机发送邮件, 它还可以通过公共邮件服务上的帐户发送经过身份验证的电子邮件。安装 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个答案

首先

您可能需要为邮件 () 函数的许多参数..。 你最多可以有 5 个。mail(to,subject,message,headers,parameters);$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($to,$subject,$message,etc.)在这个顺序, 否则有它不工作的机会。 让我知道这是否有帮助.....。

第21个答案

这只会影响到少数用户, 但我希望它记录在那一小部分用户中。 由于此问题, 该小少数人的成员花了 6 个小时对工作的 PHP 邮件脚本进行故障排除。

如果你要去一所从 www.AceITLab.com 经营 XAMPP 的大学, 你应该知道我们的教授没有告诉我们什么: AceITLab 防火墙 (而不是 Windows 防火墙) 阻止 XAMPP 中的 MercuryMail。 你将不得不使用另一个邮件客户端, 梨为我们工作。 您必须发送到安全设置较低的 Gmail 帐户。

是的, 我知道, 这是完全无用的现实世界的电子邮件。 然而, 从我所看到的情况来看, 学术环境和现实世界往往没有什么宝贵的共同点。

第22个答案

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

在这种情况下, 如果您使用的是免费软管服务 000webhost , hostinger 例如, 这些服务提供商禁用该 mail() 功能, 以防止意外使用电子邮件欺骗、垃圾邮件等。我希望你与他们联系, 看看他们是否支持此功能。

如果您确定服务提供商支持邮件 () 功能, 您可以查看本 PHP 手册以供进一步参考, Php 邮件 ()

要检查您的托管服务支持邮件 () 功能, 请尝试运行此代码 (请记住更改收件人电子邮件地址)

希望这有所帮助。

第23个答案

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

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);

我的示例代码是

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';
?>

相关问题

mysql _ 拿给数组 ()/mysql_fetch_assoc ()/mysql_fetch_row ()/mysql_num_rows 等希望参数1是资源或结果 参考-此错误在 PHP 中意味着什么? 如何在 PHP 中分析和处理 HTML\ xml? RegEx 匹配打开的标记, 但 XHTML 独立标记除外 PHP 邮件功能不能完成电子邮件的发送 如何从最后一行中的元素中删除边框? 为什么我尝试用 c # 发送邮件时会出错? 如何使用交换剂发送带有 "不转发" 标志的电子邮件