zelocalhost
zelocalhost

Reputation: 1183

How to send email for all users with cakephp

i don't understand how send one email for all users, i do it this in my controller :

// Init
$data = $this->request->data['Email'];
$d = array(
    'subject' => $data['subject'],
    'message' => $data['message']
);

// QUERY
$all = $this->Spoutnik->find('all', array(
    'conditions' => array(
        'Spoutnik.role >=' => '1'
    ),
    'fields' => array('Spoutnik.email')
));
$this->set(compact('all'));

// list
$bcc = '';
foreach ($all as $user) {
    $bcc .= $user['Spoutnik']['email'].',';
}

// MAIL
App::uses('CakeEmail', 'Network/Email');
$CakeEmail = new CakeEmail('default');

$website_short_name = Configure::read('website.short_name');
$CakeEmail->bcc("$bcc");
$CakeEmail->subject(''.$website_short_name.' :: '.$d['subject'].'');

$CakeEmail->viewVars(array(
    'message' => (''.$d['message'].'')
));

$CakeEmail->emailFormat('html');
$CakeEmail->template('message_direct');

// final
$CakeEmail->send();

But i have error "no valid mail" , and after the liste of user's mail

what is wrong in my code ?

Upvotes: 0

Views: 3594

Answers (3)

Domingo C.
Domingo C.

Reputation: 799

I will just use the addBcc function of CakeEmail and modify the loop:

App::uses('CakeEmail', 'Network/Email');
$CakeEmail = new CakeEmail('default');

// list
foreach ($all as $user) {
    $CakeEmail->addBcc($user['Spoutnik']['email']);
}

$website_short_name = Configure::read('website.short_name');
$CakeEmail->subject(''.$website_short_name.' :: '.$d['subject'].'');

$CakeEmail->viewVars(array(
    'message' => (''.$d['message'].'')
));

Upvotes: 1

scrowler
scrowler

Reputation: 24405

Couple of things I've noticed at a quick glance...

foreach ($all as $user) {
    $bcc .= $user['Spoutnik']['email'].',';
}

In that code, you're adding a comma after every email, so at the end of your string you'll have a comma. Try this:

$e = 0;
foreach ($all as $user) {
    if($e > 0) $bcc .= ',';
    $bcc .= $user['Spoutnik']['email'];
    $e++;
}

--edit-- good point Deepak, Cake's documentation suggests you give BCC an array. It's easier and more efficient to produce so do that.

Second, $CakeEmail->bcc("$bcc"); doesn't need the quotes. It should work fine with them, but I've seen Cake do some pretty weird things... Try taking them out:

$CakeEmail->bcc($bcc);

Third, you're setting all those emails to BCC which is fine, but I can't see a to address. If you want to send out to a lot of email address without them seeing each other, you still need to send the email to somewhere, even if its [email protected]. Add a to address in before you send:

$CakeEmail->to('[email protected]');

Upvotes: 1

Deepak
Deepak

Reputation: 6812

Try changing your $bcc block to this:

// list
$bcc = array();
foreach ($all as $user) {
    $bcc[]= $user['Spoutnik']['email'];
}

Also refer to CakeEmail Documentation

Upvotes: 0

Related Questions