【问题标题】:PHPMailer Send an email through a Local Domain but from a regular EmailPHPMailer 通过本地域但从普通电子邮件发送电子邮件
【发布时间】:2014-01-27 16:28:36
【问题描述】:

我正在尝试为客户设置 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,所以我不知道可能是什么问题,因为我使用的是“个人”电子邮件服务器。

【问题讨论】:

    标签: php email phpmailer


    【解决方案1】:

    感谢 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();
    

    【讨论】:

      【解决方案2】:

      我使用一个我知道在使用 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 以确保确定。

      祝你好运!

      【讨论】:

      • 感谢您的回复。这就是我得到的:SMTP -&gt; ERROR: Failed to connect to server: (0) SMTP Error: Could not connect to SMTP host. bool(false)。我尝试使用端口 80 并将其添加到主机,但仍然出现该错误。
      • 您是否尝试过使用另一个 SMTP 服务器来排除任何防火墙或连接问题?其他人有这个问题并在这里自己解决了:stackoverflow.com/questions/17672960/…
      • 是的,我在同一台机器上用 smtp.gmail.com 设置了 PHPMailer,它工作正常。我也关闭防火墙只是为了测试,它仍然给出同样的错误。当我执行telnet xx.xxx.x.x 25 连接时,这不意味着我也应该可以通过 PHPMailer 访问它吗?我也启用了 ssl。
      • 您是否使用与 Apache 相同的用户进行远程登录?权限可能是个问题。您是否尝试过在 php 代码 shell_exec("telnet xx.xx.xx.xx 25") 中运行 Telnet 命令?我会尝试模拟您的 telnet 以查看 PHP 是否可以访问您的服务器。
      • 我使用管理员远程登录并以管理员身份登录。我正在同一会话中尝试两者。我试过这段代码:$out= shell_exec("telnet xx.xxx.x.x 25"); echo $out;,它返回一个空字符串。
      猜你喜欢
      • 2021-03-23
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 2011-12-19
      • 1970-01-01
      • 2011-04-06
      相关资源
      最近更新 更多