Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP邮件函数无法完成电子邮件的发送_Php_Html_Email - Fatal编程技术网

PHP邮件函数无法完成电子邮件的发送

PHP邮件函数无法完成电子邮件的发送,php,html,email,Php,Html,Email,我试着创建一个简单的邮件表单。表单本身位于my index.html页面上,但它会提交到一个单独的感谢您的提交页面Thankyu.php,上面的php代码就嵌入在这个页面中。 代码提交得很完美,但从不发送电子邮件。如何解决此问题?尽管此答案的某些部分仅适用于邮件功能本身的使用,但这些故障排除步骤中的许多步骤都可以应用于任何PHP邮件系统 您的脚本不发送电子邮件的原因有很多。除非有明显的语法错误,否则很难诊断这些问题。如果没有,你需要浏览下面的检查表,找出你可能遇到的任何潜在陷阱 确保已启用错误报

我试着创建一个简单的邮件表单。表单本身位于my index.html页面上,但它会提交到一个单独的感谢您的提交页面Thankyu.php,上面的php代码就嵌入在这个页面中。 代码提交得很完美,但从不发送电子邮件。如何解决此问题?

尽管此答案的某些部分仅适用于邮件功能本身的使用,但这些故障排除步骤中的许多步骤都可以应用于任何PHP邮件系统

您的脚本不发送电子邮件的原因有很多。除非有明显的语法错误,否则很难诊断这些问题。如果没有,你需要浏览下面的检查表,找出你可能遇到的任何潜在陷阱

确保已启用错误报告并设置为报告所有错误 错误报告对于根除代码中的错误和PHP遇到的一般错误至关重要。需要启用错误报告才能接收这些错误。将以下代码放在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>';
        }
    }
?>
有关此操作的更多详细信息,请参阅

确保调用了mail函数 这可能看起来很愚蠢,但一个常见的错误是忘记在代码中实际放置邮件函数。确保它在那里并且没有被注释掉

确保正确调用了mail函数 bool邮件字符串$to,字符串$subject,字符串$message[,字符串$additional_headers[,字符串$additional_parameters]]

mail函数接受三个必需的参数,还可以选择第四个和第五个参数。如果您的邮件呼叫没有至少三个参数,它将失败

如果您的邮件呼叫没有正确的参数和正确的顺序,它也将失败

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

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

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

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

不要使用错误抑制操作符 当在PHP中的表达式前面加上@时,将忽略该表达式可能生成的任何错误消息。在某些情况下,需要使用此操作员,但发送邮件不是其中之一

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

只有当你事后纠正具体的错误时,这才是明智的

检查邮件返回值 职能:

$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>";
}
如果邮件已成功接受传递,则返回TRUE,否则返回FALSE。重要的是要注意,仅仅因为邮件被接受交付,并不意味着邮件将实际到达预定目的地

这一点值得注意,因为:

如果收到错误的返回值,您知道错误在于服务器接受您的邮件。这可能不是编码问题,而是服务器配置问题。您需要与系统管理员联系以了解发生这种情况的原因。 如果你收到一个真实的返回值,并不意味着你的电子邮件一定会被发送。这仅仅意味着该电子邮件已通过PHP成功发送到服务器上相应的处理程序。在PHP的控制之外,还有更多的故障点会导致电子邮件无法发送。 因此,FALSE将帮助您找到正确的方向,而TRUE不一定意味着您的电子邮件发送成功。这一点值得注意

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

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

检查垃圾邮件文件夹;防止电子邮件被标记为垃圾邮件 通常,由于各种原因,通过PHP和其他服务器端编程语言发送的电子邮件最终会被放在收件人的垃圾邮件文件夹中。在对代码进行故障排除之前,请始终检查该位置

为了避免通过PHP发送的邮件被发送到收件人的垃圾邮件文件夹中,您可以通过PHP代码和其他方式执行各种操作,以最大限度地减少邮件被标记为垃圾邮件的可能性。好的建议包括:

使用电子邮件身份验证方法,如和,以证明您的电子邮件和您的域名属于同一类,并防止欺骗您的域名。SPF网站包含一个向导,用于生成站点的DNS信息。 您需要确保邮件服务器的IP地址指向用于发送邮件的域名。 确保您使用的IP地址是 确保回复地址是有效的现有地址。 在收件人字段中使用收件人的全名和真实姓名,而不仅仅是电子邮件地址,例如John Smith。 监控您的滥用帐户,例如abuse@yourdomain.com和postmaster@yourdomain.com. 这意味着——确保这些账户存在,阅读发送给他们的信息,并对投诉采取行动。 最后,让退订变得非常容易。否则,您的用户将通过按垃圾邮件按钮取消订阅,这将影响您的声誉。 有关此主题的详细信息,请参阅

确保提供了所有邮件标题 某些垃圾邮件软件如果缺少常见的邮件头,例如“发件人”和“回复收件人”,则会拒绝邮件:

error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
确保邮件标题没有语法错误 无效的头与没有头一样糟糕。一个不正确的字符可能就是使你的电子邮件脱轨的全部原因。仔细检查以确保语法正确,因为PHP不会为您捕获这些错误

$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);
不要使用“发件人”的仿制品 虽然邮件必须有From:sender,但您不能只使用任何值。尤其是用户提供的发件人地址是阻止邮件的可靠方法:

$headers = array("From from@example.com", // missing colon
    "Reply To: replyto@example.com",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);
原因:您的web或发送邮件服务器未被列入SPF/DKIM白名单,以假装对@hotmail或@gmail地址负责。它甚至可以静默地删除发件人域中未配置的邮件

确保收件人值正确 有时,问题很简单,比如电子邮件收件人的值不正确。这可能是由于使用了不正确的变量

$headers = array("From: $_POST[contactform_sender_email]"); // No!
另一种测试方法是将收件人值硬编码到邮件函数调用中:

$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to
这可以应用于所有邮件参数

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

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

确保代码与表单方法匹配 如果已将表单方法设置为POST,请确保使用$\u POST查找表单值。如果已将其设置为GET或根本未设置,请确保使用$\u GET查找表单值

确保表单操作值指向正确的位置 确保表单操作属性包含指向PHP邮件代码的值

mail('user@example.com', $subject, $message, $headers); 
有关详细信息,请参阅。最好在php.ini或.user.ini或.htaccess中启用这些选项

通过邮件测试服务进行检查 您可以利用各种传递和垃圾邮件检查服务来测试MTA/Web服务器设置。通常情况下,您会将邮件探测发送到:他们的地址,然后获得交付报告和更具体的故障或分析:

免费/简单 免费的/$$$ 报名/$$$ 专业的/$$$ 仅限免费/MX检查 各种: 使用不同的邮件 PHP的内置邮件功能非常方便,通常可以完成任务,但它确实很有用。幸运的是,有一些替代方案提供了更大的能力和灵活性,包括处理上述许多问题:

最受欢迎的是: 同样的特点: 甚至更年长的人。 所有这些都可以与专业的SMTP服务器/服务提供商结合使用。因为典型的08/15共享网络托管计划在它运行时是命中或未命中的
es到电子邮件设置/配置。

如果您使用SMTP配置发送电子邮件,请尝试改用。您可以从下载库

我通过以下方式创建了我的电子邮件:

ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);

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

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";
}
还有一件事。邮件功能在localhost中不起作用。将代码上载到服务器并重试。

如果只使用邮件功能,则需要完成配置文件


您需要打开邮件扩展,并设置SMTP端口等,最重要的是,您的用户名和密码。没有这一点,邮件就无法发送。此外,还可以使用PHPMail类发送

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

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

这对我有用

我认为这应该能奏效。我刚刚添加了一个ifisset,并在主体中添加了连接变量,以将PHP与HTML分开

$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
}

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

删除if$_POST['submit']{} 从我的肚子里拿走美元
有几种可能性:

您正面临服务器问题。服务器没有任何邮件服务器。因此,您的邮件无法工作,因为您的代码很好,邮件正在使用类型

你没有得到公布的价值。尝试使用静态值编写代码

使用SMTP邮件发送邮件

始终尝试在邮件功能中发送标题。 如果您是通过本地主机发送邮件,请执行发送邮件的SMTP设置。 如果您通过服务器发送邮件,请检查服务器上是否启用了电子邮件发送功能。 试试这个

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

?>

在邮件功能中添加邮件标题:

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

通过执行以下操作,它在000webhost上对我有效:

$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>';
}
发送电子邮件时直接输入电子邮件地址:

$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";
使用和不使用


这段代码可以工作,但电子邮件的接收延迟了半小时。

首先,邮件功能的参数可能太多。。。 您最多可以有五个,mailto,subject,message,header,parameters

就$from变量而言,如果您使用Linux,它应该自动来自您的Web主机。它自动来自您的cPanel用户名和IP地址

mail('email@gmail.com', $subject, $message, $headers)
还要确保mail函数中变量的顺序正确


邮件$to,$主体,$报文等,否则有可能不起作用。

如果你在用PHP发送邮件时遇到麻烦,请考虑一个类似的选项。 每当我需要用PHP发送邮件时,我通常使用SwiftMailer

基本用法:
有关如何使用SwiftMailer的更多信息,请参阅。

对于任何认为这一点正在发展的人,我不建议使用mail。有一些答案涉及到这一点,但不是它的原因

PHP的邮件功能不仅是不透明的,它完全依赖于您使用的任何东西,即完成工作。只有MTA无法接受邮件时,邮件才会告诉您,即当您尝试发送邮件时,Sendmail已关闭。它无法告诉您邮件是否成功,因为它已将邮件发送出去。就细节而言,你现在可以修改MTA的日志,希望它能告诉你足够的关于修复失败的信息。如果您在共享主机上,或者没有访问MTA日志的权限,那么您就倒霉了。不幸的是,大多数Linux的普通安装默认都是这样处理的

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

这意味着您可以在PHPMailer中直接看到接收服务器的响应,例如,您可以。不再猜测邮件是否发送失败或原因

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

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

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);
}
您还可以从更好的界面中获益。对于mail,您必须设置所有的标题、附件等。通过一个库,您有一个专门的功能来实现这一点。这还意味着该功能正在完成所有棘手的部分,如标题。

在共享主机中,邮件功能通常被禁用。 更好的选择是使用SMTP。最好的选择是Gmail或SendGrid

SMTPconfig.php

SMTPmail.php

联系_email.php


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

如果您使用的是免费hosing服务,如000webhost或hostinger,这些服务提供商将禁用邮件功能,以防止意外使用电子邮件欺骗、垃圾邮件等。我希望您 与他们联系,查看他们是否支持此功能

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

要检查您的主机服务是否支持邮件功能,请尝试运行以下代码记住更改收件人电子邮件地址:


这只会影响一小部分用户,但我希望为这一小部分用户记录。由于这个问题,这一小部分人花了6个小时对一个正常工作的PHP邮件脚本进行故障排除

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

是的,我知道,这对现实世界的电子邮件是完全无用的。然而,据我所见,学术环境和现实世界往往没有什么共同之处

适用于那些不想使用外部邮件程序并希望在专用Linux服务器上发送邮件的用户

PHP如何发送邮件的方式在PHP.ini中的[mail function]部分进行了描述

参数sendmail path描述如何调用sendmail。默认值是sendmail-t-i,因此,如果您在Linux控制台中获得一个正常工作的sendmail-t-i 不同的MTA可以实现sendmail。他们只是在这个名字上做一个符号链接到他们的二进制文件。例如,在默认情况下是。配置MTA以发送邮件,并使用sendmail-v-t-i
<?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);
?>
我更喜欢将ssmtp用作MTA,因为它很简单,不需要运行具有打开端口的守护程序。ssmtp仅适用于从发送邮件。它还可以通过您在公共邮件服务上的帐户发送经过身份验证的电子邮件。安装ssmtp并编辑配置文件/etc/ssmtp/ssmtp.conf。还可以从cron作业(例如configure/etc/ssmtp/revaliases文件)接收本地系统邮件到Unix帐户的通知到root用户

以下是我在Yandex mail上的帐户配置:

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

Text body.
确保服务器中已安装Sendmail

如果您已经检查了代码并确认没有错误,请转到/var/mail并检查该文件夹是否为空

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

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

如果您在Ubuntu服务器上。

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

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

sudo apt-get install sendmail

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

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;
}
我的示例代码是:

error_reporting(E_ALL);

如果sendmail系统正常工作,则必须按如下方式修改代码:

<?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';
?>
这使您能够发送基于HTML的电子邮件

值得注意的是:

我们构建了一个标题多行字符串,每行用分隔符分隔\r\n; 我们添加了内容类型来表示我们返回HTML,这样你们就可以编写更好的电子邮件,你们可以像在HTML页面中一样,在你们的邮件中添加任何你们想要的HTML代码,包括CSS。 注意:Debian 10.0.0“Buster”的安装实际上是微不足道的

php.ini

允许“发送”的标准sendmail软件包安装:

[mail function]
sendmail_path=/usr/sbin/sendmail -t -i
; (Other directives are mostly windows)
其他有用的命令:

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

上述过程耗时约5分钟。然后我浪费了5个小时。。。别忘了检查你的垃圾邮件文件夹

如果你一直使用Hostgator上的应用程序,这就是解决我问题的方法。非常感谢发布详细解决方案的人。如果某一天链接脱机,您将看到以下摘要:

在服务器中查找sendmail路径。检查它的一种简单方法是在只有您才能访问的页面中临时编写以下代码,以读取生成的信息:。打开此页面,并查找sendmail路径。然后,不要忘记删除此代码! 问题和解决方法:如果sendmail路径只显示-t-i,那么编辑服务器的php.ini并添加以下行:sendmail\u path=/usr/sbin/sendmail-t-i;
但是,在能够使用PHP邮件功能发送邮件之后,我了解到它发送的不是经过身份验证的电子邮件,这又造成了另一个问题。这些电子邮件都落在我的Hotmail的垃圾邮件箱里,有些电子邮件从未发送过,我想这与它们没有经过身份验证有关。这就是为什么我决定用SMTP从邮件切换到PHPMailer的原因。

要从gmail SMTP发送电子邮件并使用php邮件功能,首先必须在本地设置sendmail
机器,设置后,这意味着您已经设置了本地smtp服务器,然后您将能够从您在sendmail smtp帐户中设置的帐户发送电子邮件。在我的情况下,我按照的说明进行了设置,并且能够设置帐户,

from:$邮件地址在$headers的这部分可能有问题:

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


如果是这种情况,请尝试使用在您试图发送邮件的系统中已创建的电子邮件帐户。

您的程序是否在本地计算机或live host1中。你确定它不会进入你的垃圾邮件吗?2.你的邮箱上配置了sendmail吗?它在一个实时主机上,它不会进入我的垃圾邮件中。我不确定在我的邮箱上配置sendmail是什么意思,所以我假设没有。尝试在没有$from的情况下发送。这实际上使表单提交-我现在的问题是..如何显示用户键入的电子邮件,现在,我已经将其替换为标题…它将阻止垃圾邮件文件夹中的邮件。我已经看到,如果我们使用您在代码中使用的方法发送邮件超过10封,gmail会将此邮件发送到垃圾邮件;它看起来不像一个完整有效的电子邮件地址,没有本地部分。您已替换了From标题并添加了其他标题。或者更确切地说,在您的示例中,上面的$是多余的。畸形可能是OPs最初的问题写得好John。我只想补充一件事:如果可能的话,检查发送邮件服务器的邮件服务器日志,无论它是本地托管的还是远程托管的,通常可以揭示问题的原因。这些日志应该显示1发送邮件服务器是否从PHP脚本接收到消息,如果是,2接收MX是否接受发送邮件服务器的传递。@mti2935这太有用了,我很惊讶我错过了。我很快会补充的我会从不使用邮件开始,它做得很差,比任何其他邮件库都更难调试。000webhost上的同一个网站在netai.net域上成功且快速地发送电子邮件,但在site88.net上,我在控制台中获得了与邮件成功发送相同的网站,但我没有收到任何邮件。同样在comuf.com域中,我也遇到了一个错误。同一主机上的同一个网站只在netai.net域上工作,net16.net工作。我的问题被标记为这个问题的重复,但我仍然无法理解。有什么建议吗?fsockopen[function.fsockopen]:php\u network\u getaddresses:getaddrinfo失败:没有已知的主机。-如果我遇到这个错误,那么原因是什么,需要做些什么?对我来说,这只是一些轶事,但并没有太多的解释。端口和smtp密码会误导大多数用户。什么是配置电子邮件?你有参考资料吗?我还必须使用:requirephpmailer/class.smtp.php;在服务器上以明文形式保存smtp用户和密码是一个好主意吗?@Juri可能不是。。。天哪,我不知道如何让邮件功能正常工作:。这太奇怪了,而且确实对其他人没有帮助。请使用答案下方的[delete]链接。在此上下文中,pear是什么?你是说PHP软件库吗?还是别的什么?例如,peer?你真的是指珍贵的小东西吗?这是你的愿望吗?为什么?那太粗糙了,没用了。仅仅安装一个MTA将很少允许访问它。完整的sendmail/postfix/qmail安装指南在这里是离题的。这是我的回答吗?因为这并没有发生在我身上,我也没有用同样的方法解决它。这个问题有多种可能的答案,我的答案就是其中之一。在过去尝试了上述所有方法后,我的答案为我解决了问题,所以我在这里提供了另一种可能的解决方案。是的,当然。这是许多可能的答案之一。但是,这仍然是一种方法。将其推广到您需要的MTA中,例如…-这里有一些链接的安装指南…可能更实用,但是。SMTPDebug=0没有帮助。普通密码也不适用于GMail。这个答案在这里没有太大作用。IANA已将端口465替换为端口587。这是默认的邮件提交端口。当电子邮件客户端或传出服务器提交要由适当的邮件服务器路由的电子邮件时,它应始终使用SMTP端口587作为默认端口。看见一个明智的建议:如果你没有完全意识到你在做什么,不要打开你计算机上的端口!嗯,是真的。。。
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';
?>
<?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>'; 
        }
    }
?>
[mail function]
sendmail_path=/usr/sbin/sendmail -t -i
; (Other directives are mostly windows)
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
From: \"$name\" <$email>