ホームページ  >  記事  >  バックエンド開発  >  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 にはメール機能が 1 つしかないので、PHPMailer はそれを大幅に拡張したもので、多くの人のニーズに応えられると思います (笑)。主に、メール送信機能を実装する class.phpmailer.php と smtp 実装する class.smtp.php の 2 つのクラス ファイルが含まれています。さらに、さまざまなエラー出力を実現できるファイルや、非常に詳細なドキュメントもあります。

PHPMailer は SMTP サーバーに接続できません。これは SMTP の大文字と小文字の変更とは何の関係もありません。

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

再版▼

レーベル:

php

phpメーラー

雑談

カテゴリ: デフォルトのカテゴリ

PHPmailer が電子メールを送信できず、エラーが表示される エラー: SMTP ホストに接続できませんでした

このブログには過去に「PHPMailer::SMTP サーバーに接続できない」「PHPMailer が SMTP サーバーに接続できない 2 つの一般的な理由」の 2 つの記事があります
1 つは再印刷用、もう 1 つはメモをとるためですが、結果的に誰もが問題を解決できるわけではありません。
友人たちは私に助けを求める手紙をくれましたが、私も不安でした。後で解決しましたが、まだ分からなかったので、落ち着いてもう一度見てみました

PHPMailer が SMTP サーバーに接続できないのはなぜですか?まずコードで確認してください。

function Get_host($host){ //ドメイン名を解決します
$Get_host=gethostbyname($host);
echo "$host に接続しようとしています ...
rn ";
if(!$Get_host){
$str= "解析に失敗しました (1)


";
}elseif($Get_host==$host){
$str= "解析に失敗しました (2): ホスト名が無効である可能性があります
";
}その他{
echo "ドメイン名は $Get_host...
rn";
に解決されます Open_host($host);}
エコー $str;
}

Function 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);


for ($i=0; $i {
$host= $site[$i];
echo Get_host($host);
}



PHPmailer は、メールを送信するための優れた PHP クラスです。エラー処理は、不正な認証や空の受信者に関するエラー プロンプトなど、SMTP サーバーとのセッション中に発生する問題に重点を置いています。ただし、SMTP への接続プロセスのエラー プロンプトは「できませんでした」で始まります。 SMTP ホストに接続します」 一言で言えば、これは解決されていない多くの問題を引き起こしました。さらにばかばかしいのは、それが便利だが不合理な方法を世界中に広めることにつながったことです。ある運命を持っている。

さて、これ以上ナンセンスな話はやめてください。
SMTP ホストに接続できなかった理由を知りたい場合は、サービスに接続する手順を理解する必要があります
完全かつ効果的な SMTP 送信プロセスには、ドメイン名の解決、SMTP サーバーへの接続、本人確認、受信者とレターの内容の決定、
の送信が含まれている必要があります。
上記の PHP コードは、これらのステップを分離し、理由を調べてから方法を見つけることです。エコーされた結果は次のようになります:

1. 解析に失敗しました (2): 無効なホスト名である可能性があります
ドメイン名を解決できません。 DNS レベルの問題である可能性があります。管理者に連絡するか、サービスプロバイダーを変更してください

2. サーバーは Fsockopen をサポートしていません。pFsockopen 関数を試してください
pfsockopen 関数を使用したサーバーへの接続が成功したら、class.smtp.php の $this->smtp_conn = fsockopen( を $this->smtp_conn = pfsockopen( に変更します。PHPmailer を通常の使用に戻します

3. サーバー側のエラー
リモートホストとの接続は正常に確立されましたが、相手はSMTPプロトコルをインストールしておらず、SMTPサーバーに問題がある可能性があることを示す220応答コードを送信しました

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 行目まで追跡します。

switch($this->メーラー) {
ケース「メール送信」:
$result = $this->SendmailSend($header, $body);
休憩;
case '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() 関数を追跡してみましょう。

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

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

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

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

    if(!$rt) {
      $this->SetError($this->Lang('instantiate'));
      false を返します;
    }

    true を返します;
  }


注意$rt = @mail( これはPHP内にあるmail関数数発行信啊です!


W3School からのメール送信例

$to = "somebody@example.com"; //ここで変更された邮箱地址
$subject = 「私の件名」;
$txt = "こんにちは、世界!";
$headers = 「送信者: dongfangtianyu@qq.com」 。 「ん」
mail($to,$subject,$txt,$headers);
?>


ただし、このスクリプトをサーバー上で実行してクライアントに受信できる場合は、SMTP サイズ書き込みを修正する方法を完全に使用できます。

以上、PHPMailer が送信できないものについて説明しました。これには、PHPMailer による送信に関する内容も含まれており、PHP 教則に関心のある友人のお役に立てれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。