1

SwiftMailerを使用して一括メールを送信しています。現時点では、私はコードでそれを行います

$transport = Swift_SmtpTransport::newInstance('*****', 25);
$transport->setUsername('***');
$transport->setPassword('***');

$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance();
$message->setSubject($derBetreff);

$bbc= array('1@web.de','2@web.de','3@web.de',...,'1000@web.de');

$message->setFrom(array('my@email.de' => 'My Name'));           
$message->setTo('my@email.de');
$message->setBcc($bcc);
$message->setBody('Hi this is my email');           
$message->attach(Swift_Attachment::fromPath('myFile.pdf'));     

// Send the message
$result = $mailer->send($message);
echo $result;

私は自分自身に 1 つの電子メールを送信するだけで、BCC に最大 1000 人を追加します。

コードを実行して 1 つの電子メールを送信するのに約 9 分かかり、「成功」メッセージが返されます。ただし、 php.ini ファイルのmax_execution_timeは 30 秒にしか設定されていません。

私の最初の質問は、なぜ max_execution_time が SwiftMailer スクリプトを停止しないのですか?

次に、 Swiftmailer 用の AntiFlood Pluginを見つけました。これは大量のメールを送信するのに役立ちます。以下のスクリプトは、最初に 100 通のメールを送信してから 30 秒間一時停止し、次の 100 通のメールの送信を続けることで、各メンバーに 1 つのメールを送信します。これは、スパムとしてマークされるのを回避するための優れた方法であると読みました。

2 つ目の質問は、AntiFlood プラグインが機能するために非常に長い実行時間が必要ですか? たとえば、以下のスクリプトを使用して 1000 通のメールを送信し、一時停止のみを考慮した場合、スクリプトは少なくとも 4.5 分実行されますよね?

// Create the Mailer using any Transport
$mailer = Swift_Mailer::newInstance(
  Swift_SmtpTransport::newInstance('smtp.example.org', 25)
);

// Use AntiFlood to re-connect after 100 emails
$mailer->registerPlugin(new Swift_Plugins_AntiFloodPlugin(100));

// And specify a time in seconds to pause for (30 secs)
$mailer->registerPlugin(new Swift_Plugins_AntiFloodPlugin(100, 30));

// Continue sending as normal
for ($lotsOfRecipients as $recipient) {
  ...

  $mailer->send( ... );
}
4

2 に答える 2

1

まず第一に、電子メールの送信はスクリプト自体では行われません。そのため、サーバーが Linux で実行されている場合、max_execution_time は影響を受けません。ドキュメントを参照してください。

set_time_limit() 関数と構成ディレクティブ max_execution_time は、スクリプト自体の実行時間にのみ影響します。system() を使用したシステム コール、ストリーム操作、データベース クエリなど、スクリプトの実行以外で発生するアクティビティに費やされた時間は、スクリプトの最大実行時間を決定する際には含まれません。これは、測定時間が実数である Windows では当てはまりません。

したがって、一度に複数のメールを送信する場合は、Anti-Floodプラグインを使用することをお勧めします。

ただし、メールをデータベースに保存し、cronjob で Y 分ごとに DB から X メールを送信することをお勧めします。この方法では、目の前で数分かかるロード スクリプトがありません (ページがリロードされた場合に再送信される危険性が含まれます)。Laravel のようなフレームワークを使用している場合は、組み込みのメールクエリ機能を使用して、まさにそれを行うことができます。

于 2017-12-21T09:51:27.147 に答える
0

大量のメールを送信するには、RabbitMQ などの Broker サービスを使用する必要があります。1 つはメールをプールするため、もう 1 つは Swiftmailer でメールを送信するための 2 つのキューを作成する必要があります。各メールは rabbitMq メッセージになります。

于 2016-01-02T12:00:29.713 に答える