>  기사  >  백엔드 개발  >  PHPMailer가 이메일을 보낼 수 없는 이유는 무엇입니까?

PHPMailer가 이메일을 보낼 수 없는 이유는 무엇입니까?

WBOY
WBOY원래의
2016-08-08 09:33:181464검색

PHPMailer는 이메일을 보내는 데 유용한 PHP 클래스입니다. smtp 서버를 사용한 메일 전송을 지원하며 Sendmail, qmail, Postfix, Imail, Exchange, Mercury, Courier 및 기타 메일 서버도 지원합니다. SMTP 서버는 확인 및 다중 SMTP 전송도 지원합니다(그러나 그것이 무엇에 사용되는지는 잘 모르겠습니다). 이메일 전송에는 여러 TO, CC, BCC 및 REPLY-TO가 포함될 수 있으며 텍스트 및 HTML 이메일 형식을 모두 지원하고 자동으로 줄바꿈할 수 있습니다. , 다양한 형식의 첨부 파일 및 사진, 사용자 정의 이메일 헤더 및 기타 기본 이메일 기능을 지원합니다.
PHP에는 하나의 메일 기능만 포함되어 있기 때문에 PHPMailer는 PHPMailer를 크게 향상시켰고 많은 사람들의 요구를 충족시킬 수 있다고 믿습니다. 하하. 여기에는 주로 메일 전송 기능을 구현하는 class.phpmailer.php와 smtp 구현을 위한 class.smtp.php의 두 가지 클래스 파일이 포함됩니다. 그런 다음 다양한 오류 출력을 얻을 수 있는 파일과 매우 자세한 문서가 있습니다.

PHPMailer는 SMTP 서버에 연결할 수 없으며 SMTP 대소문자 변경과 관련이 없습니다.

(2011-10-22 12:17:35)

재판▼

标签:

php

phpmailer

杂谈

分类: 默认分类

라벨: PHP PHP메일러 잡담 카테고리: 기본 카테고리

PHPmailer가 이메일을 보낼 수 없으며 오류 메시지가 표시됩니다. 오류: SMTP 호스트에 연결할 수 없습니다

블로그에는 "PHPMailer::SMTP 서버에 연결할 수 없음" "PHPMailer가 SMTP 서버에 연결할 수 없는 두 가지 일반적인 이유"라는 두 가지 이전 기사가 있습니다.
하나는 재인쇄용이고 다른 하나는 메모용이지만 결국 모든 사람이 문제를 해결할 수 있는 것은 아닙니다.
친구들이 나에게 도움을 요청하는 편지를 보냈고, 나도 불안했다. 나중에 해결됐지만 그래도 알 수 없어서 마음을 진정시키고 다시 살펴봤습니다

PHPMailer가 SMTP 서버에 연결할 수 없습니다. 이유는 무엇입니까? 먼저 코드로 확인하세요.

function Get_host($host){ //도메인 이름 확인
$Get_host=gethostbyname($host);
echo "$host 연결을 시도 중입니다 ...
rn ";
if(!$Get_host){
$str= "파싱 실패 (1)


";
}elseif($Get_host==$호스트){
$str= "파싱 실패(2): 잘못된 호스트 이름
";
}그밖에{
echo "도메인 이름은 $Get_host...
rn으로 확인되었습니다.";
Open_host($host);}
에코 $str;
}

함수 Open_host($host){ //호스트에 연결

if(function_exists('fsockopen')){
$fp = fsockopen($host,25,&$errno,&$errstr,60);
elseif(function_exists('pfsockopen')){
echo "서버가 Fsockopen을 지원하지 않습니다. pFsockopen 기능을 사용해 보세요...
rn";
$fp = pfsockopen($host,25,&$errno,&$errstr,60) }
그 외
exit('서버가 Fsockopen 기능을 지원하지 않습니다');

if(!$fp){
echo "코드 이름: $errno,
n오류 원인: $errstr
";
}그밖에{
echo "SMTP 서버 연결 OK!
rn";
fwrite($fp, "");
$out0= fgets($fp, 128);
#에코 $out0;
if (strncmp($out0,"220",3)==0){ // 3글자 내용 판별
echo '220 SMTP 서버 응답이 정상입니다
';
}그밖에{
echo '서버측 오류
';}
}
}
//SMTP 서버 주소
$site = array("smtp.163.com","smtp.sina.cn","smtp.sina.com","smtp.qqq.com","smtp.126.com");

//재배치 스크립트
#$host="smtp.163.com";
#echo Get_host($host);


($i=0; $i<=4; $i++)
{
$host= $site[$i];
echo Get_host($host);
}



PHPmailer는 메일 전송을 위한 훌륭한 PHP 클래스입니다. 오류 처리는 잘못된 인증 및 빈 수신자에 대한 오류 프롬프트와 같은 SMTP 서버 세션 중 문제에 중점을 둡니다. connect to SMTP 호스트" 한 마디로 해결되지 않은 많은 문제를 낳았습니다. 더욱 우스꽝스러운 것은 유용하지만 불합리한 방법이 세상에 퍼지게 되었다는 것입니다. 정해진 운명이 있어요.

알았어, 더 이상 말도 안되는 소리는 하지 마.
SMTP 호스트에 연결할 수 없는 이유를 이해하려면 서비스에 연결하는 단계를 이해해야 합니다
완전하고 효과적인 SMTP 편지 전송 프로세스에는 도메인 이름 확인, SMTP 서버 연결, 신원 확인, 수신자 및 편지 내용 확인 및 전송이 포함되어야 합니다.

위의 PHP 코드는 이러한 단계를 분리하여 이유를 찾아낸 후 방법을 찾는 것입니다. 에코된 결과는 다음과 같습니다.

1. 구문 분석 실패(2): 잘못된 호스트 이름일 수 있습니다
도메인 이름을 확인할 수 없습니다. DNS 수준 문제일 수 있습니다. 관리자에게 문의하거나 서비스 제공업체를 변경하세요

2. 서버가 Fsockopen을 지원하지 않습니다. pFsockopen 기능을 사용해 보세요
pfsockopen 함수를 사용하여 서버 연결에 성공하면 $this->smtp_conn = fsockopen( in class.smtp.php를 $this->smtp_conn = pfsockopen(으로 수정합니다. PHPmailer를 정상적으로 사용하도록 반환

3. 서버측 오류
원격 호스트와의 연결을 성공적으로 설정했지만 상대방이 SMTP 프로토콜을 설치하지 않았으며 220 응답 코드를 보냈습니다. 이는 SMTP 서버에 문제가 있을 수 있음을 나타냅니다.

4. 220 SMTP 서버 응답이 정상입니다

뭐, fsockopen 함수든 pfsockopen 함수든 원격 SMTP 서버에 정상적으로 접속된 것입니다. PHPmailer를 사용하여 이메일을 보낼 수 없는 경우 계정을 변경하고 다시 시도해 보시기 바랍니다.

5. 이와 같은 기타 오류 보고서

경고: fsockopen(): smtp163.com:25에 연결할 수 없습니다
방화벽이 책임이 있다고 믿을 만한 절대적 이유가 있습니다! 이 경우 관리자에게 연락하여 방화벽 규칙을 변경할 수 없는 경우 "PHPMailer::SMTP 서버에 연결할 수 없습니다",
에 있는 방법을 시도해 볼 수 있습니다. 검색
함수 IsSMTP() {
$this->메일러 = 'smtp';
}

다음으로 변경:
함수 IsSMTP() {
$this->메일러 = 'SMTP';
}

내 제목에서 알 수 있듯이 "PHPMailer는 SMTP 서버에 연결할 수 없으며 SMTP 대소문자 변경과는 아무런 관련이 없습니다." 물론 나쁜 방법으로 당신을 속일 수는 없지만 때로는 치료의 성공률이 당신의 성격에 달려 있습니다

이유를 분석해 보겠습니다.
이 코드는 아마도 class.phpmailer.php의 라인 286 부근에 있을 것입니다. PHPmailer 클래스를 사용하여 메일 전송 방법을 선언할 때 이 함수를 먼저 호출해야 합니다

this->Mailer를 class.smtp.php의 약 400번째 줄까지 추적하세요.

스위치($this->메일러) {
'sendmail'의 경우:
         $result = $this->SendmailSend($header, $body);
         휴식;
케이스 'smtp':
        $result = $this->SmtpSend($header, $body);
         휴식;
케이스 '메일':
         $result = $this->MailSend($header, $body);
         휴식;
         기본값:
        $result = $this->MailSend($header, $body);
부서지다;

우선, smtp는 확실히 SMTP와 같지 않습니다! 나는 이 기본 원칙을 잊어버렸다.
따라서 위의 조건이 충족되지 않으면 PHPmailer는 $result = $this->MailSend($header, $body);이 문장
을 실행합니다.
class.phpmailer.php의 라인 460 부근에서 MailSend() 함수를 추적해 보겠습니다.

  함수 MailSend($header, $body) {
    $to = '';
    for($i = 0; $i to); $i++) {
      if($i != 0) { $to .= ', '; }
      $to .= $this->AddrFormat($this->to[$i]);
    }

    $toArr = split(',', $to);

    $params = sprintf("-oi -f %s", $this->Sender);
    if ($this->Sender != '' && strlen(ini_get('safe_mode')) < 1) {
      $old_from = ini_get('sendmail_from');
      ini_set('sendmail_from', $this->Sender);
      if ($this->SingleTo === true && count($toArr) > 1) {
        foreach($toArr은 $key로 =>$val) {
          $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
        }
      } 그밖에 {
        $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
      }
    } 그밖에 {
      if ($this->SingleTo === true && count($toArr) > 1) {
        foreach($toArr은 $key로 =>$val) {
          $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
        }
      } 그밖에 {
        $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header);
      }
    }

    if (isset($old_from)) {
      ini_set('sendmail_from', $old_from);
    }

    if(!$rt) {
      $this->SetError($this->Lang('인스턴스화'));
      false를 반환합니다.
    }

    true를 반환합니다.
  }


주의$rt = @mail( 这是用 PHP内置的mail函数发信啊!


来自W3School의 메일发信实例

$to = "somebody@example.com"; //여기서 성장하는 邮箱地址
$subject = "내 주제";
$txt = "안녕하세요!";
$headers = "보낸사람: dongfangtianyu@qq.com" . "rn" .
메일($to,$subject,$txt,$headers);
?>


如果는 服务器上运行这脚本能够收到邮件,那么你完全可以用修改SMTP大小写的这这过,毕竟不大好用

 

PHPMailer는 더 이상 사용할 수 없습니다.助。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.