質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

6330閲覧

PEAR::Mailで送信できない(SMTP: STARTTLS failed)

hachico8686

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/12/22 02:26

編集2021/12/23 02:17

前提・実現したいこと

PEAR::Mailでメールを送信するPHPプログラムが、以前は送信されたものが、失敗するようになりました。
メールサーバ側(バージョンアップや調子が悪い時があった)が原因かも知れませんが、
プログラム側の変更で送信できるようにしたいです。

動作環境

RHEL 7.9
Apache:2.4.6
PHP 5.4.16

PEARのインストール状況は以下の通り。

# pear list Installed packages, channel pear.php.net: ========================================= Package Version State Archive_Tar 1.4.14 stable Console_Getopt 1.4.3 stable Mail 1.4.1 stable Mail_Mime 1.10.11 stable Mail_mimeDecode 1.5.6 stable Net_SMTP 1.10.0 stable Net_Socket 1.2.2 stable PEAR 1.10.1 stable Structures_Graph 1.1.1 stable XML_Util 1.4.5 stable

発生している問題・エラーメッセージ

デバッグ内容

DEBUG: Recv: 220 XXXXX.net ESMTP Postfix DEBUG: Send: EHLO localhost DEBUG: Recv: 250-XXXXX.net DEBUG: Recv: 250-PIPELINING DEBUG: Recv: 250-SIZE XXXXX DEBUG: Recv: 250-ETRN DEBUG: Recv: 250-STARTTLS DEBUG: Recv: 250-AUTH PLAIN LOGIN DEBUG: Recv: 250-AUTH=PLAIN LOGIN DEBUG: Recv: 250-ENHANCEDSTATUSCODES DEBUG: Recv: 250-8BITMIME DEBUG: Recv: 250 DSN DEBUG: Send: STARTTLS DEBUG: Recv: 220 2.0.0 Ready to start TLS DEBUG: Send: RSET DEBUG: Send: QUIT

送信結果のエラー(getMessage()の取得内容)

authentication failure [SMTP: STARTTLS failed (code: 220, response: 2.0.0 Ready to start TLS)]

該当のソースコード

関数化しているところを抜粋しているので、多少変数の辻褄が合わないかも知れませんが、ご了承ください。

php

1date_default_timezone_set('Asia/Tokyo'); 2 3$mail_subject = "XXXXXXXXXX; 4 5require_once ("Mail.php"); 6 7mb_language("Japanese"); 8mb_internal_encoding("UTF-8"); 9 10$params = array ( 11 "host" => 'XXXXX', 12 "port" => 587, 13 "auth" => true, 14 "debug" => true, 15 "username" => 'XXXXX', 16 "password" => 'XXXXX' 17); 18 19$mailObject = Mail::factory ( "smtp", $params ); 20 21$recipients = 'XXXXX'; 22 23$headers = array ( 24 "MIME-Version" => "1.0", 25 "Content-Type" => "text/plain; charset=ISO-2022-JP", 26 "Content-Transfer-Encoding" => "7bit", 27 "To" => $email_to, 28 "From" => $email_from, 29 "Subject" => mb_encode_mimeheader( $mail_subject ) 30); 31 32$body = 'XXXXX'; 33 34$body = mb_convert_encoding($body, "ISO-2022-JP-MS", "UTF-8"); 35 36$r = $mailObject->send ( $recipients, $headers, $body ); 37 38if (PEAR::isError($r)) { 39 echo($r->getMessage()); 40}

試したこと

$paramsの内容を以下に変更してみましたが、同じエラーでした。

php

1'auth' => "PLAIN", 2'socket_options' => array('ssl' => array('verify_peer_name' => false)),

補足情報

認証情報(メールサーバ、メールアドレス、パスワード)は日常的に使用しているものです。
設定やパスワードも変更していません。
他のメールアカウント(同じドメイン)に変えても、同じエラーでした。

追記1

mailxコマンドを使って、以下の設定で送信できることを確認しました。

# cat ~/.mailrc set smtp=smtp://XXXXX.com:587 set from=XXXXX@XXXXX.jp set smtp-auth-user=XXXXX@XXXXX.jp set smtp-auth-password="XXXXX" set smtp-use-starttls set nss-config-dir=/etc/pki/nssdb/ set ssl-verify=ignore # echo "TEST" | mailx -v -s "SUBJECT" XXXXX@XXXXX.jp

最初set ssl-verify=ignoreがない状態ではPeer's certificate issuer is not recognized.というエラーで送信不可でした。
このことから、/usr/share/pear/Net/Socket.phpを以下の通りに修正し、自己証明を無効化して再度PHPプログラムの送信を試したのですが、同じエラーでした。

PHP

1 public function enableCrypto($enabled, $type) 2 { 3 if (version_compare(phpversion(), '5.1.0', '>=')) { 4 if (!is_resource($this->fp)) { 5 return $this->raiseError('not connected'); 6 } 7 8 stream_context_set_option($this->fp, 'ssl', 'verify_peer', false); //追加 9 stream_context_set_option($this->fp, 'ssl', 'verify_peer_name', false); //追加 10 11 return @stream_socket_enable_crypto($this->fp, $enabled, $type); 12 } else { 13 $msg = 'Net_Socket::enableCrypto() requires php version >= 5.1.0'; 14 15 return $this->raiseError($msg); 16 } 17 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FKM

2021/12/22 06:41

SMTPの使用ポートは何番ですか?
FKM

2021/12/22 08:06

件のエラーはpeer認証の不一致のときに起きるものなので、プログラムやサーバの環境でなにかバージョンを変えたものがあったら、それを明示してください。
hachico8686

2021/12/23 00:58

プログラムが動作するサーバは、仮想マシン(VirtualBox)で動作しています。 最後に送信可能だった時(つい2週間ほど前ですが)から、アップデート等の変更はしていません。 ファイアウォールを無効にしても同じエラーでした。SELinuxは最初からDisabledです。 プログラムは、メール送信処理は設定も含め変更していません。送信失敗することに気づいて、debugをtrueにしたくらいです。
FKM

2021/12/23 01:04

PHPじゃなくてローカルサーバからコマンドで送ってどのような反応が返るかテストしてみてください。
hachico8686

2021/12/23 02:20

コマンド送信結果を追記1に記載しました。 すみませんが、ご指摘等お願いします。
hachico8686

2021/12/23 02:43

yum.logを確認しましたが、アップデートはしていませんでした。 yumの現在のバージョンは3.4.3です。
hachico8686

2021/12/23 03:07

Gmail使って送信できるか、試してみたいと思います。 お時間ある時に、他の解決方法があればお教えいただけると助かります。
guest

回答1

0

自己解決

Gmailに変えたところ、送信することができました。
テスト中のため、とりあえずメールが送れればいいので、これで行きたいと思います。

なぜ突然送れなくなってしまったかは謎のままですが…
お付き合いいただきありがとうございました。色々と勉強になりました。

投稿2021/12/23 04:40

hachico8686

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問