3

私のコードはテーブルの最後のサブスクライバーにのみメールを送信したため、ここで何か間違ったことをしているに違いないと思います。サブスクライバーの配列をログに記録すると、送信しようとしているサブスクライバーが複数あることが明らかです。問題は、それらを一緒にバッチ処理しようとすることに関係していると思います...これを行うための最良の方法は何ですか? 添付ファイル付きの 1 つのメッセージを作成し、アドレスを個別に送信し、それらすべてを 1 つのバッチ処理として送信しようとしています。これが私のコードです:

    $subscribersManager = new DD_Subscribers_Manager();
    $subscribers = $subscribersManager->getAllSubscribers();


    $subject = $form->getElement('subject')->getValue();
    $body = $form->getElement('body')->getValue();
    $filename = $form->getElement('bulletin')->getValue();
    $filepath = Zend_Registry::get('rootDir') . '/public/downloads/archive/' . $filename;

    $config = array('ssl' => 'tls', 'port' => 587, 'auth' => 'login', 'username' => 'fake@email.com', 'password' => 'password');
    $smtpConnection = new Zend_Mail_Transport_Smtp('smtp.gmail.com', $config);

    foreach ($subscribers as $subscriber) {
        $message = new Zend_Mail('utf-8');
        $message->setFrom('fake@email.com', 'My Fake Mailing List')
                ->addTo($subscriber->email)
                ->setSubject($subject)
                ->setBodyText($body);
        $attachment = $message->createAttachment(file_get_contents($filepath));
        $attachment->type = 'application/pdf';
        $attachment->filename = $filename;
    }
    $message->send($smtpConnection);
4

4 に答える 4

7

これはスコープの問題のようです: foreach ループ内で $message を作成し、最後のメッセージのみを送信します ($message->send() が foreach の後に呼び出されるため)。

基本的に、foreach ループが繰り返されるたびに $message の値を上書きします。$message->send を foreach ループに移動して、反復ごとに 1 つの電子メールを送信します。メッセージの配列を作成して一度に送信する別の方法があるかもしれませんが、ZendMail には詳しくありません。

編集: 実際、Zend_Mail のドキュメントを読むと、$message->addTo() を呼び出して、1 つのメッセージに追加の受信者 (複数) を追加できます。コードは次のように変更できます。

$message = new Zend_Mail();
$message->setFrom('fake@email.com', 'My Fake Mailing List')
                                ->setSubject($subject)
                                ->setBodyText($body);

foreach($subscribers as $subscriber){

    $message->addTo($subscriber->email);
}
$message->send();

Zend_Mail - 受信者の追加

于 2009-04-22T17:31:45.180 に答える
2

サブスクライバーごとに 1 つのオブジェクトを作成し、最後のもの以外は何もしていないように見えます。$message->send呼び出しをforeachループ内に移動します。

于 2009-04-22T17:30:26.010 に答える
0

それは真実ではない。このhttp://framework.zend.com/manual/1.12/en/zend.mail.multiple-emails.htmlをチェックしてください。私も同じことをやってみましたが、全員にメールを送ることができます

于 2013-03-02T05:35:58.717 に答える
0

$message->send($smtpConnection);
以下に示すように、「send」メソッド呼び出しコードを foreach ループ内に配置します。

foreach ($subscribers as $subscriber) {
    $message = new Zend_Mail('utf-8');
    $message->setFrom('fake@email.com', 'My Fake Mailing List')
                     ->addTo($subscriber->email)
                     ->setSubject($subject)
                     ->setBodyText($body);
    $attachment = $message->createAttachment(file_get_contents($filepath));
    $attachment->type = 'application/pdf';
    $attachment->filename = $filename;
    $message->send($smtpConnection);
}
于 2009-09-24T08:52:37.333 に答える