2017-05-25 109 views
0

我在发送邮件时遇到此错误。PHPMailer无法发送邮件 - 以下发件人地址失败

Message could not be sent.Mailer Error: The following From address failed: [email protected] : MAIL FROM command failed,Temporary system failure. Please try again later. ,451,4.3.0SMTP server error: MAIL FROM command failed Detail: Temporary system failure. Please try again later. SMTP code: 451 Additional SMTP info: 4.3.0SMTP server error: MAIL FROM command failed Detail: Temporary system failure. Please try again later. SMTP code: 451 Additional SMTP info: 4.3.0 

这是我的代码:

require 'phpmailer/PHPMailerAutoload.php'; 

$html = "<b>Hello world!</b>"; 
$email = "[email protected]"; 
$mail = new PHPMailer; 
$mail->isSMTP(); 
$mail->setFrom('[email protected]'); 
$mail->addAddress($email); 
$mail->isHTML(true); 

$mail->Subject = 'Sample Subject'; 
$mail->Body = $html; 

if(!$mail->send()) { 
    echo 'Message could not be sent.'; 
    echo 'Mailer Error: ' . $mail->ErrorInfo; 
} else { 
    echo 'Email sent'; 
} 

我还试图消除$mail->isSMTP();和我收到回送消息Email sent与问题是,当我检查我的收件箱和垃圾邮件文件夹,因为我把我的个人电子邮件作为电子邮件的收件人,电子邮件不在那里。这是服务器问题吗?

我也检查了/var/log/mail.err,我可以看到一个错误日志,说这个collect: Cannot write ./dfv4PAGY73013302 (bfcommit, uid=0, gid=119): No such file or directory - 那是什么?

我已经撞了我的头2天了,但我不知道是什么问题。我在我的服务器中安装了一个新的LAMP堆栈,还配置了postfix(只是说这可能会帮助你得到一个想法)。

这似乎是什么问题?

您的帮助将不胜感激!谢谢!

+0

嗯......也可能你的SMTP服务r未正确配置。也许它不能写入假脱机目录中的文件... – axiac

+0

@axiac如何在spool目录中写入文件?对于这个愚蠢的问题抱歉:\ – PinoyStackOverflower

+0

SMTP服务器将它处理的电子邮件的内容保存到工作目录中。看起来你不能在那个目录下写文件,因为它不存在。此目录的确切路径是在SMTP服务器的配置中的某处指定的。我从来没有配置过'postfix' :-( – axiac

回答

1

你的代码没问题。它的工作原理和证明是您从SMTP服务器收到错误消息的事实。问题是它处理的数据。

正确配置的SMTP服务器不接受中继电子邮件。 From:地址或To:,Cc:或中的至少一个地址必须由其托管,以便接受要处理的电子邮件。

作为From:使用由您用于发送的SMTP服务器托管的真实电子邮件地址。例如,如果您使用smtp.gmail.com,则必须使用您的Gmail地址作为From:(在这种情况下也是SMTP认证)。

您的代码没有指定SMTP服务器;在这种情况下,PHPMailer使用localhost,这很可能会将电子邮件转发到ISP的SMTP服务器(或者如果此代码在公司的Intranet中运行,则是您公司的SMTP服务器)。使用您的ISP提供的电子邮件地址(或者您的工作电子邮件地址,如果代码适用于您的工作)为From:,它应该可以工作。

+0

谢谢你的回答。实际上,当我尝试删除'$ mail-> isSMTP();'因为我不想设置smtp,我收到消息“Email Sent” ,但是当我检查我的邮件收件箱和垃圾邮件文件夹时,电子邮件不存在,这是服务器问题吗?再次感谢 – PinoyStackOverflower

+0

如果您删除'$ mail-> isSMTP()',PHPMailer默认为'$ mail-> isMail ()',这意味着它使用PHP函数'mail()'发送邮件。默认情况下,PHP配置为使用本地sendmail程序(在macOS和Linux上)或Windows上的localhost SMTP服务器。默认的配置可能会以多种方式失败,并使其工作更加困难(因为它涉及系统配置,在某些情况下,您无法修改)。在PHP代码中使用SMTP服务器(如您所做的)更容易。但是,错误信息清楚地表明问题在于您使用的电子邮件地址为From:' – axiac

+1

具有讽刺意味的是,不会调用isSMT P'会做你想要的相反。 'mail()'要求你配置一个本地邮件服务器; 'isSMTP'没有。在没有指定'Host'的情况下使用SMTP将尝试使用localhost,并且在您的情况下您有本地服务器正在运行,但未配置,因此会出现错误消息。通过不同的服务器发送或修复您的本地邮件服务器。 – Synchro

0

更新您的PHPMailer。在通过TLS SMTP连接时,似乎较早版本的PHPMailer不支持自签名证书。

我花了两天的时间试图解决这个问题,最后我更新了PHPMailer,问题不复存在!

我的电子邮件服务器正在Debian 9上运行iRedMail软件包。

下载最新的PHPMailer的拉链并解压到PHPMailer的文件夹在当前文件夹,并做到:

use PHPMailer\PHPMailer\PHPMailer; 
use PHPMailer\PHPMailer\SMTP; 
use PHPMailer\PHPMailer\Exception; 
require 'PHPMailer/src/PHPMailer.php'; 
require 'PHPMailer/src/SMTP.php'; 
require 'PHPMailer/src/Exception.php'; 
$mail = new PHPMailer(); 
$mail->IsSMTP(); 
$mail->SMTPOptions = ['ssl'=> ['allow_self_signed' => true]]; 
$mail->SMTPSecure = 'tls'; 
//etc etc...... 
0

尝试用SSL套接字在PHP(例如使用TLS/SSL):

// Show errors 
ini_set('display_errors', 1); 
ini_set('display_startup_errors', 1); 
error_reporting(E_ALL); 
// Your hostname 
$helloHostname = "localhost"; 

// Emails 
$toEmail = "[email protected]"; 
$fromEmail = "[email protected]"; 

// Set mx hostname from dns for recipient !!! 
$hostnameMX = "mxhost.boo.xx";  

$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'verify_peer', false); 
stream_context_set_option($ctx, 'ssl', 'verify_peer_name', false); 
try{ 
    // echo $socket = stream_socket_client('ssl://smtp.gmail.com:587', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx); 
    echo $socket = stream_socket_client('tcp://'.$hostnameMX.':25', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx); 
    if (!$socket) { 
     print "Failed to connect $err $errstr\n"; 
     return; 
    }else{ 
     // Http 
     // fwrite($socket, "GET/HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n"); 
     // Smtp 
     echo fread($socket,8192); 
     echo fwrite($socket, "EHLO ".$helloHostname."\r\n"); 
     echo fread($socket,8192); 

     // Start tls connection 
     echo fwrite($socket, "STARTTLS\r\n"); 
     echo fread($socket,8192); 

     echo stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT); 

     // Send ehlo 
     echo fwrite($socket, "EHLO ".$helloHostname."\r\n"); 
     echo fread($socket,8192); 

     echo fwrite($socket, "MAIL FROM: <".$fromEmail.">\r\n"); 
     echo fread($socket,8192); 

     echo fwrite($socket, "rcpt to: <".$toEmail.">\r\n"); 
     echo fread($socket,8192); 

     echo fwrite($socket, "DATA\n"); 
     echo fread($socket,8192); 

     echo fwrite($socket, "Date: ".time()."\r\nTo: <".$toEmail.">\r\nFrom:<".$fromEmail.">\r\nSubject:Hello from php socket tls\r\n.\r\n"); 
     echo fread($socket,8192); 

     echo fwrite($socket, "quit \n"); 
     echo fread($socket,8192); 

     /* Turn off encryption for the rest */ 
     // stream_socket_enable_crypto($fp, false); 

     fclose($socket); 
    } 
}catch(Exception $e){ 
    echo $e; 
} 

如果你需要从DNS的主机名收件人的电子邮件域:

function getMX($hostname = "boo.xx", $show = 0){ 
    if(dns_get_mx($hostname, $mxhosts, $weights)) { 
     $i = 0; 
     $mxList = NULL; 
     foreach($mxhosts as $key => $host) { 
      if($show == 1) echo "Hostname: $host (Weight: {$weights[$key]}) <br>"; 
      $ip = gethostbyname($host); 
      if($show == 1) echo "IP " . $ip . "\n<br>"; 
      if($show == 1) echo "IP " . gethostbyaddr($ip) . "\n<br>"; 
      $mxList[$i]['host'] = $host; 
      $mxList[$i]['ip'] = $ip; 
      $mxList[$i]['weight'] = $weights[$key]; 
      $i++; 
     } 
     return $mxList; 
    } else { 
     echo "Could not find any MX records for $hostname\n"; 
    } 
}