PHPMailer通过本地域发送电子邮件,但是通过常规电子邮件发送

时间:2014-01-24 07:32:35

标签: php email phpmailer

我正在尝试为客户设置PHPMailer。他有自己的邮件服务器位于某个IP地址。当被要求向我提供通过系统发送电子邮件的信息时,他提供了以下内容:

Host: xx.xxx.x.x
Port: 25
Domain: mydomain.local
Username: myemail@mydomain.local
Password: <myemailpassword>
From: myemail@anotherdomain.xx

(他确认用于外部电子邮件发送)

我尝试通过将参数设置为上面的确切命名来设置PHPMailer。

$mail->IsSMTP();                      
$mail->SMTPDebug  = 1;                
$mail->SMTPAuth   = true;            
$mail->SMTPSecure = "ssl";          
$mail->Host       = "xx.xxx.x.x";
$mail->Port       = 25;              
$mail->Username   = "myemail@mydomain.local";  
$mail->Password   = <myemailpassword>;         

$mail->SetFrom('myemail@anotherdomain.xx', 'Webname');
$mail->[...]

我收到以下错误:

Failed to connect to server (0)

所以我尝试通过telnet发送电子邮件,以检查它是客户的电子邮件服务器还是PHPMailer设置:

 telnet xx.xxx.x.x 25

通过,我已连接到服务器。

 helo mydomain.local

我收到'你好'作为答复。这让我相信这可能是错误的PHPMailer设置。

我也尝试不使用SMTP:

$mail->Host       = "ssl://xx.xxx.x.x";
$mail->Port       = 25;              
$mail->Username   = "myemail@mydomain.local";  
$mail->Password   = "password";         

$mail->SetFrom('myemail@anotherdomain.xx', 'Webname');
$mail->[...]

再也没有去。我错了吗?我之前只熟悉设置PHPMailer才能使用Gmail,所以我对可能出现的问题感到茫然,因为我使用的是“个人”电子邮件服务器。

2 个答案:

答案 0 :(得分:2)

感谢Loadparts的帮助。

我仍然不确定问题是什么,但它似乎已经解决了。它可能来自电子邮件服务器端,因为编码明智,我没有改变任何东西。这是我使用的最终代码。

    $mail = new PHPMailer(true); 

    $mail->IsSMTP(); 
    $mail->SMTPAuth   = true; 
    $mail->Port       = 25; 
    $mail->Host       = "xx.xxx.x.x"; // SMTP server
    $mail->Username   = "myemail@mydomain.local";  
    $mail->Password   = <myemailpassword>;

    $mail->From       = "myemail@anotherdomain.xx";
    $mail->FromName   = <Web_Name>;
    $mail->AddAddress("email@domain.com");

    $mail->Subject  = <Subject>;
    $mail->AltBody    = <Alt_Body>
    $mail->WordWrap   = 80; 

    $body             = "test message";
    $mail->MsgHTML($body);
    $mail->IsHTML(true);

    $mail->Send();

答案 1 :(得分:1)

我使用的测试功能,我知道在使用PHPMailer时可以100%测试电子邮件服务器。

我不确定你为什么遇到问题,但是尝试使用我的功能(我知道它很麻烦,但它可以解决问题)。只需将所有XXXX替换为您的信息,并确保在同一文件夹中同时包含class.phpmailer.php和class.smtp.php。

<?php
error_reporting(E_ALL);

$toemail = 'XXXX';
$toname = 'XXXX';
$subject = 'Testing Email Sending...';
$bodyhtml = '<H1>yeah</h1>';
$bodytext = 'heres Hoping it works';
$fromemail = 'XXXX';
$fromname = 'XXXX';

var_dump(sendemail($toemail,$toname,$subject,$bodyhtml,$bodytext,$fromemail,$fromname));


function sendemail($toemail,$toname,$subject,$bodyhtml,$bodytext,$fromemail,$fromname)
{
    require_once("class.phpmailer.php");

    $mail = new phpmailer();
    $mail->IsSMTP();
    $mail->From     = $fromemail;
    $mail->FromName = $fromname;

    $mail->Host     = "XXXX";  
    $mail->SMTPAuth = true;     // turn on SMTP authentication
    $mail->Username = "XXXX";  // SMTP username
    $mail->Password = "XXXX"; // SMTP password
    $mail->Port="25";


    $mail->SMTPDebug=true;


    if(strlen($bodyhtml)>0) {
        $mail->Body  = $bodyhtml;
        $mail->IsHTML(true);
        }
    else if(strlen($bodytext)>0){ 
            $mail->Body = $bodytext;
    }

    if(strlen($bodytext)>0 && strlen($bodyhtml)>0){ 
        $mail->AltBody = $bodytext;
    }

    $mail->AddReplyto($fromemail,$fromname);
    $mail->Subject  =  $subject;

    // Check if multiple recipients
    if(preg_match("/;/",$toemail))
    {
        $tmp_email=preg_split("/;/",$toemail);
        $tmp_contact=preg_split("/;/",$toname);
        $mail->AddAddress($tmp_email[0], $tmp_contact[0]);
//      echo "<!-- multi email:".$tmp_email[0]." contact:".$tmp_contact[0]." -->\n";
        for($j=1;$j<count($tmp_email);$j++)
        {
            if(preg_match("/\@/",$tmp_email[$j]))
            {   $mail->AddCC($tmp_email[$j], $tmp_contact[$j]);
//              echo "<!-- multi email cc:".$tmp_email[$j]." contact:".$tmp_contact[$j]." -->\n";
            }
        }
    }
    else{ 
        $mail->AddAddress($toemail, $toname);
    }

    $error= false;
    if($mail->Send()){    
        $error =true;
    }

    // Clear all addresses and attachments for next loop
    $mail->ClearAddresses();
    return $error;

}

如果这不起作用,我的第一次尝试将使用端口80 - 通常不会被阻止,然后您可以努力让SSL工作。

PS:因为它是本地域,您可能需要考虑将域添加到/ etc / hosts以确保。

最好的运气!