2017-01-31 7 views
1

PHPMailerで生成された電子メールを でSMTPに直接送信するのではなく、データベースに保存する方法を探しています。 これは、顧客が提供するメールサーバー経由でメールが送信されているため、信頼性が低いためです。だからこそ私は直接メールを送信するのではなく、データベースにメールをキューイングしたいのです。PHPMailer store finished mail

明白なアイデアは、PHPMailersの内部$ MIMEHeader、$ MIMEBodyおよび類似の変数を格納し、その後それらをPHPMailerオブジェクトに戻すことです。 これらの変数のほとんどは、他にアクセスすることなくプロテクトアクセス修飾子が設定されているため、これは実際には不可能です。

アクセス修飾子を公開に変更するためにReflectionのようなことをすると思っていましたが、それは破損しやすい粗いハックのように聞こえます。 また、PHPMailer自体を変更する必要はありませんPHPMailerを更新することができます。

PHPMailerオブジェクト全体をシリアライズするのはもう一つのアイデアでしたが、メールを送信するときにファイルシステム内の添付ファイルが残っているかどうかを確認する必要があるため、少し実用的ではありません。

+2

ほとんどのリソースオーバーヘッドでもっとも簡単です....メール全体を保存するのではなく、PHPMailerで使用される変数をDBに保存してください。 – Kitson88

答えて

2

あなたがこれを行うことによって、それを送信することなく、完全なメッセージを手に入れることができます。

$mail->preSend(); 
$message = $mail->getSentMIMEMessage(); 

したい場合は、それ自体でSMTPクラスをドライブすることができますあらかじめ作成されたメッセージを送信することはできますが、それは特に簡単なことではありません。事前に構築されたメッセージではなく、パラメータを保存することをお勧めします。

ヘッダーと本文を直接設定できるということは、PHPMailerに完全なMIMEパーサーが含まれていることを意味します。 send関数を呼び出すと、メッセージが送信時にのみ作成されるため(すべての変更が上書きされるため)、保護されたアクセスを回避するだけでは不十分です(これらのプロパティは最初に保護されているため、 。要するに、あなたはこれを間違った方法で近づいています。

あなたが間違った場所でキューイングしている - これはメールサーバのためのものであり、彼らは非常に上手です。本当にはあなた自身のMTAを書いたくありません。これは私が行うことであり、1時間に100万メッセージを送信するのに問題はありません.MTAはすべての信頼性の問題を処理します。

1

私はおそらくあなたが(たとえとして直列配列からのメール内容を構築するだけでデータを格納するのに十分だろうphpmailerの

によって生成された電子メールを保存するための良い方法を探しています、 JSON何でも)。その後、必要に応じてメールを再構築して再送信することができます。おそらく同じロジックでは、あなたのコードは、おそらくバグだらけになります

信頼性が低くなり

冗談を除いて、一度send()が返されると、メール配信で何が起こるのかはあなたの問題ではありません。それが失敗するならば、それはあなたのコードの外に犯人がいるのでそれを修正するべきではありません。ちょうどあなたのアプリの要件に「信頼性の高いメールサーバ」を追加します:)