バージョン選択

フォーラム

メニュー

オンライン状況

97 人のユーザが現在オンラインです。 (86 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 97
もっと...

サイト内検索

質問 > 管理機能 > 受注完了メール送信の失敗時にエラーログをメール送信したい

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
PRIA
投稿日時: 2024/4/17 10:43
対応状況: −−−
常連
登録日: 2020/8/24
居住地:
投稿: 34
受注完了メール送信の失敗時にエラーログをメール送信したい
[EC-CUBE]    4.0.4
[レンタルサーバ]   さくらサーバー
[OS] WIN10
[PHP] 7.4.33
[データベース] MySQL5.7
[対象プラグイン] エラーのメール通知、履歴確認プラグイン

先日、二日続けて受注完了メールが届かない問題が発生し、
ログを確認したところ、いずれも受注日時の1秒後に、以下のエラーログが残っていました。

Exception occurred while flushing email queue: Expected response code 250 but got code "451"
(※前後は省略しています)

今のところ再発はしていないのですが、いつ発生するか分からないため、何らかの対策をしたいと考えております。

受注完了メールが届かなかった場合にエラーログのメールを任意のアドレスに送信することが最も望ましいですが、
そのためには、リクエストを送ってレスポンスから判定する処理が必要かと思いますので、MailService.php等に条件を追加しようとしましたが具体的な方法が分からず、
代替案として、エラーログを参照し、上記エラーの文字列を含むものがヒットすれば、通知メールを送信してはどうかと考えましたが、そもそもエラーログを参照する方法が分かりませんでした。

$errorLog = $this->mailer->getLastErrorMessage();
という感じで取れるかなと思ったのですが、当然ダメでした。
そもそもエラーログは、/rc/var/log/prodに日付別で格納されており、どのデータを参照するのかもよく分かりません。

何か良い方法はありますでしょうか?
ご教示いただけますと幸いです。
よろしくお願いいたします。
h_tanaka
投稿日時: 2024/4/17 10:52
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1852
Re: 受注完了メール送信の失敗時にエラーログをメール送信したい
メールサーバーのタイムアウトでそのようなエラーが発生するようです。
https://github.com/symfony/symfony/issues/45586

エラーが出力されているのであれば、その出力箇所がエラーログには出力されていると思うので、その箇所に処理を追加するのが良いと思います。

エラーログは、次のように仕分けられています。
admin- 管理画面
front- フロント画面
site- サイト(admin+front)


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

mcontact
投稿日時: 2024/4/17 10:52
対応状況: −−−
登録日: 2022/1/22
居住地:
投稿: 1536
Re: 受注完了メール送信の失敗時にエラーログをメール送信したい
> そもそもエラーログは、/rc/var/log/prodに日付別で格納されており、どのデータを参照するのかもよく分かりません。

EC-CUBEには、日付毎のエラーログファイル以外に同じフォルダにsite.logファイルに纏められているはずですので、そちらを確認してみてください。


----------------
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EC-CUBEインテグレートパートナー【ゴールド】ランク
M&I Works
URL: https://miworks.biz/
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

mcontact
投稿日時: 2024/4/17 11:03
対応状況: −−−
登録日: 2022/1/22
居住地:
投稿: 1536
Re: 受注完了メール送信の失敗時にエラーログをメール送信したい
> 受注完了メールが届かなかった場合にエラーログのメールを任意のアドレスに送信することが最も望ましいですが、
> そのためには、リクエストを送ってレスポンスから判定する処理が必要かと思いますので、MailService.php等に条件を追加しようとしましたが具体的な方法が分からず、
> 代替案として、エラーログを参照し、上記エラーの文字列を含むものがヒットすれば、通知メールを送信してはどうかと考えましたが、そもそもエラーログを参照する方法が分かりませんでした。

受注完了メールが届かなかったとの事で、エラーを検知してメールを送信したい様ですが、同じサーバ内でエラーを検知しても検知メールを同じ理由で送れない事もあるのではないでしょうか?
レンタルサーバをご利用の様なので、難しいようですが一般的にサーバ管理・エラー監視は、サーバ監視ソフトなどを利用するのが一般的です。
有名ソフトとしては、zabbixやdatadogなどが有名です。


----------------
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EC-CUBEインテグレートパートナー【ゴールド】ランク
M&I Works
URL: https://miworks.biz/
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

PRIA
投稿日時: 2024/4/17 11:35
対応状況: −−−
常連
登録日: 2020/8/24
居住地:
投稿: 34
Re: 受注完了メール送信の失敗時にエラーログをメール送信したい
h_tanaka様

早速のご連絡、ありがとうございます。

私もそのページには辿り着きまして
メールサーバーのタイムアウトが原因であることも、レスの内容から何となく分かりましたが、メールサーバーのタイムアウト時間を延ばす設定を検索しても情報が見つけられず、最終的に抜本解決は断念いたしました。

セッションのタイムアウトであれば、.envファイルで設定できるのですが……。

エラーログの詳細は以下になります。

[2024-04-10 12:42:06] app.ERROR [N/A] [0224b0a] [1964] [Symfony\Bundle\SwiftmailerBundle\EventListener\EmailSenderListener:onTerminate:64] - Exception occurred while flushing email queue: Expected response code 250 but got code "451", with message "451 4.1.8 Domain of sender address アカウント名@ドメイン名.sakura.ne.jp does not resolve " [] [POST, /rc/shopping/checkout, IP, https://ドメイン名.sakura.ne.jp/rc/shopping/confirm, Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36]

この場合、Symfony\Bundle\SwiftmailerBundle\EventListener\EmailSenderListener:onTerminateの64行目がエラーログを吐いているところでしょうか?
PRIA
投稿日時: 2024/4/17 11:42
対応状況: −−−
常連
登録日: 2020/8/24
居住地:
投稿: 34
Re: 受注完了メール送信の失敗時にエラーログをメール送信したい
mcontact様

ありがとうございます。

>EC-CUBEには、日付毎のエラーログファイル以外に同じフォルダにsite.logファイルに纏められているはずですので、そちらを確認してみてください。

site.logファイルにはエラーログは記録されておりませんので、そのファイルを参照してもキャッチできないようでした。

h_tanaka
投稿日時: 2024/4/17 12:18
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1852
Re: 受注完了メール送信の失敗時にエラーログをメール送信したい
エラーログからはわからないですね。。

注文受付メールを送信している処理は、次のメソッドになります。
src/Eccube/Service/MailService.php
public function sendOrderMail()

プラグインでオーバーライドされている可能性もあるので、 sendOrderMail で grep検索してみてください。


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

mcontact
投稿日時: 2024/4/17 13:02
対応状況: −−−
登録日: 2022/1/22
居住地:
投稿: 1536
Re: 受注完了メール送信の失敗時にエラーログをメール送信したい
下記のログ出力を行うメソッドで、ログレベルやメッセージなどでキャッチすれば、エラー発生時に何かしらのアクションは起こせるはずです。

https://github.com/EC-CUBE/ec-cube/blob/4.3/src/Eccube/Log/Logger.php#L54-L70


----------------
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EC-CUBEインテグレートパートナー【ゴールド】ランク
M&I Works
URL: https://miworks.biz/
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

PRIA
投稿日時: 2024/4/17 14:15
対応状況: −−−
常連
登録日: 2020/8/24
居住地:
投稿: 34
Re: 受注完了メール送信の失敗時にエラーログをメール送信したい
お二人ともありがとうございます。

とても参考になる情報で大変ありがたく思います。

mcontact様からいただいた情報から
ログをメールに送信できないか試してみようと思います。

今後とも、何卒よろしくお願いいたします。
PRIA
投稿日時: 2024/4/18 9:33
対応状況: −−−
常連
登録日: 2020/8/24
居住地:
投稿: 34
Re: 受注完了メール送信の失敗時にエラーログをメール送信したい
実際に以下のようなコードを書いて試してみましたが、
[PROCESS START]といった、admin.INFOのエラー本文(タイムスタンプやPathなし)しか取得できず、肝心のapp.ERRORのデータが含まれていませんでした。

public function log($level, $message, array $context = [])
{
if ($this->context->isAdmin()) {
$this->adminLogger->log($level, $message, $context);
} elseif ($this->context->isFront()) {
$this->frontLogger->log($level, $message, $context);
} else {
$this->logger->log($level, $message, $context);
}
//メールを送信する
$this->sendNotification($message);
}

protected function sendNotification($message)
{
$to_email = "任意のメールアドレス";
$subject = "ログ通知";
$body = "ログ内容:\n$message";

$headers = "From: 任意のメールアドレス\r\n";
$headers .= "Reply-To: 任意のメールアドレス\r\n";
$headers .= "Content-Type: text/plain; charset=utf-8\r\n";

mail($to_email, $subject, $body, $headers);
}

app.ERRORをタイムスタンプ付きで取得するには、どうしたらよいでしょうか?
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は96,049名です
総投稿数は111,651件です

投稿数ランキング

1
seasoft
7369
2
468
3217
3
AMUAMU
2712
4
nanasess
2325
5
umebius
2085
6
yuh
1893
7
h_tanaka
1852
8
red
1574
9
mcontact
1536
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
804
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.