PHPMailer是一個非常棒的開源郵件類,,使用也非常簡單,,但是對于虛擬主機來說,,往往要受到各種限制,。最近在虛擬主機上使用PHPMailer就遇到一個“SMTP Error: Could not connect to SMTP host”錯誤。下面介紹幾種常遇故障及解決辦法:
PHPMailer是一個非常棒的開源郵件類,,使用也非常簡單,,但是對于虛擬主機來說,往往要受到各種限制,。剛才我在虛擬主機上使用PHPMailer就遇到一個“SMTP Error: Could not connect to SMTP host”錯誤,。下面介紹幾種故障的解決辦法,有些是因為服務(wù)器php函數(shù)不支持的原因,,有些是因為網(wǎng)絡(luò)問題,,還有則是SMTP服務(wù)器規(guī)則的原因,。
服務(wù)器php函數(shù)不支持的原因,主要是因為PHPMailer通過smtp發(fā)送郵件需要用到fsockopen函數(shù),,可以以下方法解決
這個錯誤說明虛擬主機不支持PHPMailer默認(rèn)調(diào)用的fsockopen函數(shù),,找到class.smtp.php文件,搜索fsockopen,,就找到了這樣一段代碼:
// connect to the smtp server
$this->smtp_conn = @fsockopen($host,// the host of the server
$port,// the port to use
$errno, // error number if any
$errstr, // error message if any
$tval); // give up after ? secs
方法1:將fsockopen函數(shù)替換成pfsockopen函數(shù)
因為pfsockopen的參數(shù)與fsockopen基本一致,,所以只需要將@fsockopen替換成@pfsockopen就可以了。
方法2:使用stream_socket_client函數(shù)
一般fsockopen()被禁,,pfsockopen也有可能被禁,,所以這里介紹另一個函數(shù)stream_socket_client(),。
stream_socket_client的參數(shù)與fsockopen有所不同,,所以代碼要修改為:
$this->smtp_conn = stream_socket_client("tcp://".$host.":".$port, $errno, $errstr, $tval);
服務(wù)器網(wǎng)絡(luò)原因是指網(wǎng)絡(luò)開了IPV6話,沒有指定網(wǎng)絡(luò),,會默認(rèn)通通IPV6來連接,,但SMTP是IPV4所以報錯了,
解決辦法可以參考以下幾種:
1.跳過DNS解析,,直接給出IP地址,。
2.強制進(jìn)行IPv4 DNS解析。
3.禁用IPv6,。
還有個比較難搞的就是SMTP服務(wù)器的問題,,比如像在class.phpmailer.PHP有個函數(shù)判斷是否支持smtp的,
在有些版本是小寫有些是大寫的,,像goolge支持大小寫,,但是像QQ,163的對大小寫有比較嚴(yán)格的要求,,并且只支持大寫,,如果是大寫,是會報錯的,。
解決辦法如下:
在 class.phpmailer.PHP 中,,將
function IsSMTP() {
$this->Mailer = 'smtp';
}
改成:
function IsSMTP() {
$this->Mailer = 'SMTP';
}
就這么多了,暫時是解決了問題,,