Rozesílání mailů v řádu tisíců najednou
- Jan Mikeš
- Člen | 771
Ahoj,
dělám aplikaci pro rozesílání direct mailu, v databázi je aktuálně kolem 3 tisíců unikátních emailových adres.
Co je z hlediska funkčnosti a spolehlivosti nejlepší řešení pro odesílání emailů?
- Prohnat Nette\Database\Table\Selection a pro každý ActiveRow vytvářet nový email a ten odeslat zvlášť
foreach($selection as $row){
$mail = new \Nette\Mail\Message;
$mail->setMailer($this->mailer);
$mail->addTo($row->email)->setHtmlBody($template)->send();
}
Nevýhodu vidím předně v tom, že se musí odeslat najednou 3000+ emailů, což může být celkem solidní zátěž pro mail server (BTW používá se gmail) a bojím se, že to vyhodnotí jako spam a jednoduše mi odmítně požadavek..
- Pro každý ActiveRow volat $mail->addTo()
$mail = new \Nette\Mail\Message;
$mail->setMailer($this->mailer);
foreach($selection as $row){
$mail->addTo($row->email)
}
$mail->setHtmlBody($template)->send();
Tento případ se mi zdá šetrnější vůči mail serveru, ale co je nežádoucí a je problém, je to, že ostatní uživatelé nesmí vidět, komu všemu byl email poslán.
- Nějaké jiné řešení?
Bude fungovat odesláni mailu bez $mail->addTo() a všechny uživatele zde napřidávat pomocí $mail->addBcc($mail) ??
- Glubo
- Člen | 12
No mnohem čistčí je si ty maily rozdělit do dávek, třeba po padesáti-sto mailech a postupně je odesílat, třeba po (pár) minutách. Vzhledem k různým opatřením proti spammerům není dobrý nápad snažit se odeslat tísíce mailů „naráz“ z jedné IP.
P.S. Jsi si jistý, že to opravdu není spam? :-)
- srigi
- Nette Blogger | 558
Taketo veci by sa uz mali riesit asynchronne pomocou task queue. To znamena, ze po odoslani requestu na webapku, ta nejako nasype emaily do nejakej queue (RabbitMQ, ZeroMQ, redis DB) a hned vrati response. Na serveri ti bezi jeden alebo viac workerov (ako daemon alebo konzolovy script), ktore z tej queue odoberaju jednotlive tasky a vykonavaju ich.
Je to najlepsie riesenie, pretoze ho vies skalovat pridavanim workerov.
Editoval srigi (1. 3. 2013 19:40)
- Filip Procházka
- Moderator | 4668
Přidávat tolikrát addTo()
určitě není dobré – skoro
určitě se uživatelé navzájem uvidí a to nechceš.
Pokud to chceš dělat pořádně, tak to nejde dělat zadarmo – zatni zuby a zaplať si mailchimp, nebo nějakou českou alternativu.
- Jan Mikeš
- Člen | 771
Nevim proc, ale pri pouziti $message->addBcc("neco@neco.cz") kazdy vidi vsechny uzivatele, to neni spravne, od toho preci Bcc je ne? Dival jsem se do zdroje mailu, a hlavicka Bcc normalne obsahuje vsechny emailove adresy. Jedna se o bug nette nebo feature, nebo jak toto fixnout?
- Filip Procházka
- Moderator | 4668
My jsme tě varovali ;)
Bug Nette to není, může za to tvůj SMTP server (teď je otázka, jestli to tak má fungovat, nebo je to bug).