3

それだけです。CakePHPを使用してバックグラウンドで電子メールを送信するにはどうすればよいですか。すぐに使用できる電子メールコンポーネントを使用することをお勧めします。

編集:バックグラウンドで、つまり別のスレッドで、または少なくともコントローラーメソッドを終了してユーザーに応答を送信できるようにすることを意味します。関数を実行して、ユーザーに「OK」を返し、その後、メールを送信したいと思います。

それが不可能な場合、PHPmail関数を使用してどのように行うことができますか?(それが良いアプローチである場合のみ)

重要かどうかはわかりませんが、SMTPを使用しています。

前もって感謝します。

編集2:ドキュメントCakeEmail::deliver()から次のように読んだように、私はメソッドを使用しようとしています:

場合によっては、電子メールをすばやく送信する方法が必要であり、必ずしも事前に一連の構成をセットアップする必要はありません。CakeEmail :: Deliver()はその目的を目的としています。

私はこれを試しています:

CakeEmail::deliver('myemail@mydomain.com', 'Test', 'Test',
                array('from' => 'localhost@localhost.com'), true);

しかし、メールは実際には送信されていません。誰かがその方法について何かヒントがありますか?

4

1 に答える 1

4

したがって、「バックグラウンドで」とは、「帯域外」で送信するメールを処理することを意味します。これは、ユーザーに迅速な応答を提供し、ユーザーがフィードバックを受け取った後に (または別のスレッドで) メール送信などの遅い操作を処理できるようにするためです。

これを実現するには、次のようないくつかの方法があります。

  • ワーカー / メッセージ キュー
  • クローンジョブ

最も簡単な方法は、おそらく 15 秒または 30 秒ごとに起動する cron ジョブを使用することです。

私が推奨するアプローチは、ワーカーとキューを調べ、0mqRabbitMQのようなものを使用して、メールを送信するリクエストをキューに入れ、リクエストの外部で処理することです。

ユーザーが開始したリクエスト内で電子メールを送信するのではなく、cron ジョブを実行する場合は、送信電子メール リクエストを表す新しいモデルを作成し、そのデータをデータベースに保存します。Messageたとえば、このモデルを呼び出してみましょう。

CREATE TABLE `messages` (
   `id` CHAR(36) NOT NULL PRIMARY KEY,
   `to` VARCHAR(255) NOT NULL,
   `from` VARCHAR(255) NOT NULL,
   `subject` VARCHAR(255) NOT NULL,
   `body` TEXT,
   `sent` TINYINT(1) NOT NULL DEFAULT 0,
   `created` DATETIME
);

Messageモデルを取得し、「未送信」メッセージを検索するコンソールを作成します。

$messages = $this->Message->findAllBySent(0);

send()物事を簡素化し、すべての未送信メッセージを処理する方法を自分で作成します。

foreach ($messages as $message) {
   if ($this->Message->send($message)) {
       // Sending was a success, update the database
       $this->Message->id = $message['Message']['id'];
       $this->Message->saveField('sent', 1, false);
   }
}

send()モデルでのメソッドの実装はMessageあなた次第ですが、渡された から値を渡し、(http://api.cakephp.org/class/cake-email)$messageにシャントスルーするだけです。CakeEmail

それが完了したら、コマンドライン (または cron) からコンソールを呼び出すことができます。

于 2012-09-05T00:46:30.490 に答える