2017-05-25 321 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"; 
    } 
} 
相關問題