Rozesílání mailů v řádu tisíců najednou

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jan Mikeš
Člen | 771
+
0
-

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ů?

  1. 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..

  1. 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.

  1. 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
+
0
-

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? :-)

Jan Mikeš
Člen | 771
+
0
-

Spam to neni, jedna se o klasicky newsletter – vetsina mailu ma charakter slevy pro ucastniky predchozich rocniku akce. A jak postupneho rozesilani docilit s nette? Udelat to pres CRON? Jednodussi reseni by nebylo?

srigi
Nette Blogger | 558
+
0
-

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)

Acnnair
Člen | 34
+
0
-

Ak naozaj používaš na odoslanie tých mailov smtp.gmail.com, tak myslím, že tam je limit 500 na deň. Inak pre takéto kampane si zriaď radšej mailchimp alebo podobnú službu. Napr. mailchimp má do 2000 subscribers 12000 mailov mesačne zadarmo.

Jan Mikeš
Člen | 771
+
0
-

Neni jeste nejaka alternativa? Se vsim co jste zde popsali + s konzoli jsem nikdy nepracoval a tusim ze to na serveru aplikace neni ani k dispozici.

Filip Procházka
Moderator | 4668
+
0
-

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
+
0
-

O me nejde, jedna se o potreby klienta. Navic ja v tomho ohledu moc zkusenosti nemam takze kazda rada od vas mi pomuze. Pokud pouziji addBcc() uzivatele by se navzajem videt nemeli, unese ale nette kdyz bude mit v 1 instanci Nette\Mail\Message cca 3k adresatu?

Majkl578
Moderator | 1364
+
0
-

Pokud budeš posílat tolik e-mailů najednou a nepoužiješ frontu po dávkách s přestávkami, dřív nebo později (ale spíš dřív) se ocitneš na blacklistu za SPAM (a můžeš tvrdit jak moc chceš, že to SPAM není). :)

Šaman
Člen | 2666
+
0
-

Tak tak, pokud skutečně potřebuješ rozesílat takovéto objemy, tak si musíš zařidit u větších mailhostingů zápis na whitelist. Jinak tě během pár dnů blokne seznam, gmail a budeš studený.

Anebo to rozesílej po desítkách CRONem třeba po minutě.

Jan Mikeš
Člen | 771
+
0
-

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
+
0
-

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).

Jan Mikeš
Člen | 771
+
0
-

Klienta jsem presvedcil aby pouzil MailChimp o to nejde, na toto jsem narazil pouze pri testovani sablony a mailovani v nette. Zkousel jsem 3 ruzne smtp servery a vsude Bcc header zustava :(