2015-09-23 78 views
6

私は素晴らしい動作する電子メールを送信するためにPHPMailerを使用しています。ただし、電子メールを同期的に送信するため、後続のページの読み込みに時間がかかります。電子メールをPhpMailer経由で非同期で送信

この例ではhttps://github.com/PHPMailer/PHPMailer/blob/master/examples/gmail.phps

を示したように、私はメール配信の非同期を作るための方法があるかどうか、私は疑問に思うphpmailerのを使用しています。私はこれを調査し、sendmailは、「バックグラウンドモード」に配信モードを設定するオプションを持っていることが判明 - ソースhttp://php.net/manual/en/function.mail.php

mail($to, $subject, $message, $headers, 'O DeliveryMode=b'); 

私は似た何かがphpmailerの中で行うことができるかどうかを知りたいですか?誰もがこれでどんな成功を収めましたか?

EDIT: - (追加情報) phpmailerのは、sendmailを使用するように設定することができますように思え - https://github.com/PHPMailer/PHPMailer/blob/master/class.phpmailer.php これは何とか背景の配信を可能にするために活用することができるならばそのため、私は疑問に思います。また

/** 
* Which method to use to send mail. 
* Options: "mail", "sendmail", or "smtp". 
* @type string 
*/ 
public $Mailer = 'mail'; 

/** 
* The path to the sendmail program. 
* @type string 
*/ 
public $Sendmail = '/usr/sbin/sendmail'; 
/** 
* Whether mail() uses a fully sendmail-compatible MTA. 
* One which supports sendmail's "-oi -f" options. 
* @type boolean 
*/ 
public $UseSendmailOptions = true; 

/** 
* Send messages using $Sendmail. 
* @return void 
*/ 
public function isSendmail() 
{ 
    $ini_sendmail_path = ini_get('sendmail_path'); 
    if (!stristr($ini_sendmail_path, 'sendmail')) { 
     $this->Sendmail = '/usr/sbin/sendmail'; 
    } else { 
     $this->Sendmail = $ini_sendmail_path; 
    } 
    $this->Mailer = 'sendmail'; 
} 

- どうやら私はphp.iniの対API呼び出しにインライン引数としてこれを行うことを好むだろうphp.iniの http://blog.oneiroi.co.uk/linux/php/php-mail-making-it-not-suck-using-sendmail/

経由でsendmailのオプションを設定する方法があるようにありえない世界を変化する。誰もこれを試しましたか?

答えて

14

誤ったアプローチ。

PHPMailerはメールサーバではありません。 SMTPは、遅延や処理速度の遅い傾向があり、典型的なWebページの送信中に対話的に送信することができない冗長でチャットなプロトコルです(これは、BlackHatSamuraiがリンクしている問題でしょう)。多くの人はそれを正確に実行することで逃げ出しますが、それは良い解決策だと思うことにだまされることはなく、間違いなく自分でMTAを実装しようとしないでください。

あなたがリンクしているGmailの例では、SMTPをリモートサーバーに使用していますが、ローカルサーバーからの送信は常に遅くなります。 sendmail(またはmail() - これは基本的に同じことです)をローカルサーバーに送信しているときに、約0.1秒以上かかる場合、間違ったことをしています。ローカルホストへのSMTPでさえ、それ以上の時間はかからず、近くのスマートホストへの送信も遅すぎることはありません。

スレッドを使用してバックグラウンドにしようとすると、まさにこれを回避する方法ではないワームが大量に発生します。そのような方法で達成するものが、適切なメールサーバーに比べて恐ろしいものになります。ただしないでください。

これを行う正しい方法は、ローカルメールサーバーをインストールし、PHPMailerでメッセージを送信することです。この方法は非常に高速で(毎秒何百ものメッセージ)、正確にを実行する必要があります。は、PHPMailerがデフォルトで動作するため動作させるために使用します。

メールサーバーは、あなたのメッセージをキューに入れ、接続の問題、配信の延期、バウンス、その他考慮していないすべてのものを処理します。

+0

素晴らしい返答です。詳細な説明をありがとう。とても有難い!!この主題になると、私は多少の悩みを抱えています。メールサーバーを選択してインストールするための推奨事項はありますか?私は共有ホスティングプランに入っています。私のウェブホストがカスタムのものをインストールできるかどうかはわかりません。 – rogerb

+0

ほとんどのLinuxディストリビューションはpostfixを使用しています。しかし、他にもたくさんあります。あなたのISPがインストールを許可しない場合、おそらくすでに何かを提供しているか、近くのスマートホストを提供しているでしょう。彼らのドキュメントをチェックし、サポートチケットを開きます。もしそうでなければ、私は新しいサービスプロバイダをインストールすることをお勧めします... – Synchro

+1

ありがとう@シンクロ。私はホスティングプロバイダが提供するデフォルトのメールサーバを使用して終了し、電子メールごとにおよそ2秒かかると(タイムスタンプ付きで)気づいた。だから私は私のウェブホストに電話をかけた。彼らは共有ホスティングプランに入って以来、遅れが予想された(明らかに彼らのメールサーバーは送信前に待ち行列に入れられたプロキシに送信する)。最後に、私は "-O DeliveryMode = b"をphp.ini(http://blog.oneiroi.co.uk/linux/php/php-mail-making-it-not-suck-using-sendmail/)に設定しました。大きな違いを作りました。メールはバックグラウンドモードで送信され、スクリプトは** 0.16秒で返されます!** – rogerb

0

thisphpMailerによれば、このタイプの呼び出しはサポートされていません。非同期呼び出しを行うには、独自のスレッドクラスを作成する必要があります。 pThreadsおよびThreadクラスを参照してください。他の解決策の1つはhereであった。

+0

ご回答いただきありがとうございます。 phpMailerがsendmailを配信メカニズムとして許可しているようだから、これが完全に正確かどうか(日付まで)私は自分の質問を編集し、この情報を追加します。 – rogerb

+0

@rogerb、非同期スレッドを使用するSendmailクラスを書き直す必要はありません。 – BlackHatSamurai

+0

スマートホストの使用はどうですか? – Phil

関連する問題