Autor Zpráva
Macos
Profil *
Ahoj...
Potřeboval bych s něčím poradit... Mám databázi uživatelů, a v jedné z kolonek je jejich e-mail...
Já bych potřeboval v PHP udělat skript, pomocíkterého bych odeslal e-mail s určitým předmětem, zprávou na všechny maily co jsou v databázi.
Zkoušel jsem to asi 3 způsoby, pokatždé jsem hledal chybu proč to nefunguje ale nikdy jsem ji nenašel...
Proto píšu sem a doufám že mi bude někdo ochoten pomoct.
Mělo by to být formou že bude na stránce formulář, já tam napíšu od koho je mail, předmět a zprávu a pak dám odeslat a mailse odešle na všechny adresy v databázi... víte někdo jak na to?
díky
fuckin
Profil
$dotaz = mysql_query(...);
while($row=mysql_fetch_array($dotaz)){
 mail($row['email'], ....);
}
Aesir
Profil
Macos:

Pokud vám stačí ne úplně profi řešení a nevadí, že budou příjemci v poli "komu" mít "undisclosed-recipients", stačí je přidat všechny do bcc.

Pokud to vadí, tak použijte fuckinovo řešení, ale berte to jako hodně jednoduchou kostru. Chce si to ukládat komu již bylo doručeno a komu ne a nejlépe se zamykáním tabulky a zavřít celou operaci do transakce, abyste měl jistotu, že to odejde každému právě a pouze jednou.
cistax
Profil
jsem toho názoru, ze pokud pouzije fuckinovo reseni, myslim, ze to zamykani tabulky nebude potrebne, kdyz se k emailu nastaví Unique, takze kazdy email může být jen jednou v db, tudíž nemůže odejít dvakrát. Pokud se nemýlím

//EDIT: pokud tedy ten sql nebude nejak extraslozity a neudela v nem chybu, ktera zpusobi, dvojite vypsani emailu:)
Joker
Profil
fuckin:
Možná lepší než posílat X-krát mail by bylo poslat jeden na všechny adresy?
$dotaz = mysql_query(...);
$addr = "";
while($row=mysql_fetch_array($dotaz)){
  if($addr) $addr .= ",";
  $addr .= $row['email'];
}
mail($addr,...);

...možná by ale bylo lepší nezobrazovat všechny adresy všem a dát je do BCC.
Aesir
Profil
cistax:

A jak zabezpečíte to, že se ten skript nespustí paralelně víckrát?

Podle mého je nejjednodušší řešení zamknout tabulku a v jedné transakci vybrat e-mail, který ještě nebyl odeslán, pokusit se odeslat. Pokud bude odeslání úspěšné, tak updatnout záznam, že je odeslaný, commitnout transakci a odemknout tabulku.
Alphard
Profil
Aesir, Joker:
Záleží na hostingu. Podobnou věc jsem dělal před půl rokem na jednom z menších hostingů (nechci jmenovat konkrétně). Šlo řádově o stovky mailů jednou za týden, tak jsem to radši konzultoval s technickou podporou (jestli to jejich SMTP server utáhne). A bylo mi řečeno, že ano, ale že to mám odeslat v cyklu, tedy na každého přijemce jeden mail.
Aesir
Profil
Alphard:

Určitě ano. Větší počet e-mailů chce určitě vždycky domluvit i ve vlastním zájmu, aby se to kdyžtak směrovalo přes nějaký spolehlivý mailserver. Pokud jde o hodně velký počet e-mailů, je taky dobrá praktika rozesílání uměle zpomalovat - kvůli antispamu. Antispamy ostatně taky nemají rádi ani velký počet bcc.
cistax
Profil
Aesir: to máte asi pravdu, ale ještě se mi to nestalo:)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: