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

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

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

Sendmailは、インターネットで電子メールを送受信するサーバソフトウェア(MTA)です。ユーザーが送信したメールを受け、他メールサーバへ引き渡しバケツリレー式に配送したり、届いたメールをユーザーが受け取るまでの間保管するといった働きをします。

SMTP

SMTP(Simple Mail Transfer Protocol)はIPネットワークでemailを伝送する為のプロトコルです。

PHP

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

Q&A

解決済

3回答

8390閲覧

phpMailerでの送信が不安定

退会済みユーザー

退会済みユーザー

総合スコア0

Sendmail

Sendmailは、インターネットで電子メールを送受信するサーバソフトウェア(MTA)です。ユーザーが送信したメールを受け、他メールサーバへ引き渡しバケツリレー式に配送したり、届いたメールをユーザーが受け取るまでの間保管するといった働きをします。

SMTP

SMTP(Simple Mail Transfer Protocol)はIPネットワークでemailを伝送する為のプロトコルです。

PHP

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

0グッド

1クリップ

投稿2019/05/28 08:07

編集2019/05/29 04:30

AWSにてとあるサイトを運用しており、ユーザーがフォームで入力した内容を複数のアドレスに一括送信する、という部分でphpMailerを使用しております。

これまでは問題無く動作していたのですが、最近になって断続的にメールが届かない症状が続いております。

お手上げ状態で大変困っており、もし解決の糸口がありましたらご教授いただけませんでしょうか。

環境

・サーバ:Apache 2.4.25(AWS)
・PHPバージョン:5.6.30
・メールサーバー:ムームーメール


メール送信に使用しているコードは以下の通りです。

php

1require '/hogehoge/PHPMailer/PHPMailerAutoload.php'; 2 3 4$mail = new PHPMailer(); 5$mail->SMTPDebug = 2; 6//phpMailerのログをsyslogに出力 7$mail->Debugoutput = function($str, $level) {syslog(LOG_ERR, 'PHPMailer-'.date('Y-m-d H:i:s').':'.$str);}; 8$mail->isSMTP(); 9$mail->SMTPKeepAlive = true; 10$mail->Host = 'smtp.muumuu-mail.com'; 11$mail->SMTPAuth = true; 12$mail->Username = 'xxx@xxx.com'; 13$mail->Password = 'xxx'; 14$mail->SMTPSecure = 'ssl'; 15$mail->Port = '465'; 16$mail->CharSet = "UTF-8"; 17$mail->isHTML(true); 18$mail->Encoding = "base64"; 19$mail->setFrom(FROM_ADDRESS, '送信者'); 20$mail->ReturnPath =FROM_ADDRESS; 21 22$address_list = array('a@gmail.com', 'b@gmail.com', 'c@gmail.com', 'd@gmail.com'); 23 24foreach($address_list as $address){ 25 $mail->addAddress($address); 26 $mail->Subject = 'タイトル'; 27 $mail->Body = '本文'; 28 $mail->send(); 29 $mail->clearAddresses(); 30} 31 32$mail->SmtpClose();

正常に送信出来た場合は、以下のようなログが残りました。

May 28 11:42:23 ip-xxx-xxx-xxx-xxx httpd: PHPMailer-2019-05-28 11:42:23:Connection: opening to ssl://smtp.muumuu-mail.com:465, timeout=300, options=array (#012) May 28 11:42:23 ip-xxx-xxx-xxx-xxx httpd: PHPMailer-2019-05-28 11:42:23:Connection: opened May 28 11:42:23 ip-xxx-xxx-xxx-xxx httpd: PHPMailer-2019-05-28 11:42:23:SERVER -> CLIENT: 220 smtp-proxy002.phy.lolipop.jp LOLIPOP-Fsecure#015 May 28 11:42:23 ip-xxx-xxx-xxx-xxx httpd: PHPMailer-2019-05-28 11:42:23:CLIENT -> SERVER: EHLO example.com.me#015 May 28 11:42:23 ip-xxx-xxx-xxx-xxx httpd: PHPMailer-2019-05-28 11:42:23:SERVER -> CLIENT: 250-smtp-proxy002.phy.lolipop.jp Hi smtp-proxy002.phy.lolipop.lan [172.19.44.43]#015#012250-8BITMIME#015#012250-AUTH PLAIN LOGIN#015#012250 SIZE 102400000#015 May 28 11:42:23 ip-xxx-xxx-xxx-xxx httpd: PHPMailer-2019-05-28 11:42:23:CLIENT -> SERVER: AUTH LOGIN#015

メール送信出来なかった場合、以下のようなログが残りました。

May 28 11:42:26 ip-xxx-xxx-xxx-xxx httpd: PHPMailer-2019-05-28 11:42:26:Connection: opening to ssl://smtp.muumuu-mail.com:465, timeout=300, options=array (#012) May 28 11:42:26 ip-xxx-xxx-xxx-xxx httpd: PHPMailer-2019-05-28 11:42:26:SMTP ERROR: Failed to connect to server: (0) May 28 11:42:26 ip-xxx-xxx-xxx-xxx httpd: PHPMailer-2019-05-28 11:42:26:SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

送信出来なかった場合、メールサーバーへの接続で失敗しているように見えます。

1時間あたり100~200件ほど送信しているため、ムームーメールの送信制限にひっかかっているのかと思い、サポートに問い合わせてみましたが制限はかかっていなかったとの事でした。

「$mail->SMTPDebug」のレベルを変えてみましたが、これ以上詳しいログは取得出来ず、なぜメールサーバーへの接続が失敗しているのかが特定出来ない状況です。

stackoverflow等でも調べてみましたが、ユーザー名・ホスト・ポート等を確認する等の手段が書かれておりましたが、送信成功しているメールもあるため、メールサーバーの設定情報が原因では無いと考えています。

お手上げ状態で大変困っているのですが、もし解決の糸口がありましたらご教授いただけませんでしょうか。


PHPMailerのログレベルを変更し、より詳しいログを取得した所、以下のようなログを得られました。

May 29 10:43:49 ip-xxx-xxx-xxx-xxx httpd: Connection: opening to ssl://smtp.muumuu-mail.com:465, timeout=300, options=array (#012) May 29 10:43:49 ip-xxx-xxx-xxx-xxx httpd: Connection failed. Error #2: stream_socket_client(): Failed to enable crypto [/xxx/PHPMailer/SMTP.php line 326] May 29 10:43:49 ip-xxx-xxx-xxx-xxx httpd: Connection failed. Error #2: stream_socket_client(): unable to connect to ssl://smtp.muumuu-mail.com:465 (Unknown error) [/xxx/PHPMailer/SMTP.php line 326] May 29 10:43:49 ip-xxx-xxx-xxx-xxx httpd: SMTP ERROR: Failed to connect to server: (0) May 29 10:43:49 ip-xxx-xxx-xxx-xxx httpd: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

「stream_socket_client(): Failed to enable crypto」
「stream_socket_client(): unable to connect to~」
の二つが、新たに得られた情報となります。

調べた所、PHP5.6からSSLコンテキストオプションでSSLサーバー証明書の検証がデフォルトでtrueになっており、その場合はローカルに証明書をもつ必要があるようですが、それをfalseにする事で解決されるというケースを見つけました。

・PHP5.6でSMTPのhostがsslの場合に注意!
https://qiita.com/satthi/items/1eaf1f5c2e1170f398da

・PHPMailer - SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
https://stackoverflow.com/questions/26827192/phpmailer-ssl3-get-server-certificatecertificate-verify-failed

そこで、PHPMailerに以下のオプションを追加いたしました。

php

1$mail->SMTPOptions = array( 2 'ssl' => array( 3 'verify_peer' => false, 4 'verify_peer_name' => false, 5 'allow_self_signed' => true 6 ) 7);

ですが、やはりエラー内容は変わらず、断続的にメール未送信が発生している状況です。

アドバイスいただいた「リトライ/再送信処理」を組み込みを進め、平行してムームーメールのサポートにも情報の提供をお願いしたいと思います。

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

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

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

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

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

m.ts10806

2019/05/28 08:10

アクセスが集中しているとかタイムアウトしているとかではない感じですかね
CHERRY

2019/05/28 08:25

リソース不足等のメッセージは出ていたりはしませんか?
退会済みユーザー

退会済みユーザー

2019/05/28 08:51 編集

mts10806様 ご回答ありがとうございます。 CloudwatchでEC2を確認してみましたが、CPUの利用率は10%前後でした。 アクセスログの方も確認してみたいと思います。 また、phpMailerでtimeoutが設定出来るようなので、試してみたいと思います。
退会済みユーザー

退会済みユーザー

2019/05/28 08:52

CHERRY様 ご回答ありがとうございます。 自分が確認した限りでは、リソース不足等のメッセージは出ておりませんでした。 もし見るべきログ・メッセージがありましたら、教えていただけないでしょうか。
guest

回答3

0

ベストアンサー

ご回答いただいた皆様、誠にありがとうございます。

本日ムームーメールからアナウンスがあり、送信エラーが発生していた期間に、ちょうどメールサーバーに障害が発生していたようでした。
https://lolipop.jp/info/obsta/6299/

アドバイスいただいた方、お騒がせしてしまい申し訳ありません。
今後の事も考え、自前メールサーバーの構築、もしくはAWS SESへの移行を検討したいと思います。

投稿2019/05/29 06:47

編集2019/05/29 06:49
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ログにある
https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
は確認されたんでしょうかね?

断続的にメールが届かない が具体性に欠けるんですが……
a@gmail.comは届くけど、b、c、dになるに従って届く確率が減る、とか。

基本的にメールは同一ドメインに対して連続して送りつけるとSPAMを疑われたりするので、インターバルを入れたりするのはスタンダードだと思います。

特に送信先同士のメールアドレスがバレて問題ないのならToに並べてforeachで回すのを止める、とか。(1通ならエラーにならない場合)

connect failed が取得できるなら、リトライするように組めば良いのでは、という気もします。

投稿2019/05/29 04:07

takepan1973

総合スコア821

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

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

takepan1973

2019/05/29 04:08

AWS使ってるならSES使った方がいいんでは……という気もしますね。
退会済みユーザー

退会済みユーザー

2019/05/29 04:11

ご回答ありがとうございます。 https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting 上記については全て確認し、対応を行ってみました。 >断続的にメールが届かない が具体性に欠けるんですが…… >a@gmail.comは届くけど、b、c、dになるに従って届く確率が減る、とか。 →こちらは、foreachで回しているメールアドレスの中で、届かないメールに規則性は見られませんでした。 >特に送信先同士のメールアドレスがバレて問題ないのならToに並べてforeachで回すのを止める、とか。(1通ならエラーにならない場合) →送信先同士でメールアドレスが見えては困るため、こちらの対応は難しいです。。 >connect failed が取得できるなら、リトライするように組めば良いのでは、という気もします。 →ありがとうございます。 送信OK/NGはPHP側でも取得出来ますので、リトライを組み込んでみたいと思います。
guest

0

インターネットは、特にメールは100%送れるものと考えないほうが良いです。
ログを見る限りSMTPサーバへの接続エラーとなっていてムームーメールに原因がありそうですがそれ以上はおそらく深掘りできないと思います。(サーポートに聞いてもはぐらかされる公算が高い)

よってこの場合エラーとなった場合、10秒、30秒、3分待って再送するという処理が適切です。
または送信できなかったメール情報を別に記憶しておき、全て送信後に再送するという方法もあります。

投稿2019/05/29 03:52

namda

総合スコア705

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

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

退会済みユーザー

退会済みユーザー

2019/05/29 04:13

ご回答ありがとうございます。 >ログを見る限りSMTPサーバへの接続エラーとなっていてムームーメールに原因がありそうですがそれ以上>はおそらく深掘りできないと思います。(サーポートに聞いてもはぐらかされる公算が高い →おっしゃる通り、ムームーメールにも問い合わせておりますが、有効な情報を得られておりません。 >よってこの場合エラーとなった場合、10秒、30秒、3分待って再送するという処理が適切です。 >または送信できなかったメール情報を別に記憶しておき、全て送信後に再送するという方法もあります。 →ありがとうございます。 takepan1973様のご回答にもありました通り、リトライ/再送処理を組み込んでみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問