Autor Zpráva
mackopu
Profil
Především ve firemních a skupinových webech se hodí použítí aplikace, která členům komunity rozesílá e-mailem upozornění na to, že dnes má jubileum ten či onen. Pokusil jsem se s uspokojivým výsledkem napsat skript, který jubileum indikuje, v případě narozenin spočítá věk a z e-mailových adres, na které upozornění odesílá, odstraní e-mail jubilanta. Ošetřuje také situaci, kdy má osoba svátek a narozeniny současně.
Pole zájmové skupiny může být zadáno napevno, ale lze jej po malé úpravě načítat i z databáze.
Skript lze spouštět manuálně z komunitní administrace, na pozadí úvodní stránky hojně navštěvovaného webu, ale samozřejmě nejspolehlivější je CRON, nastavený na každodenní spouštění v brzkých ranních hodinách.

Přivítám náměty na vylepšení nebo optimalizaci kódu.
<?php
function UrciVek($narozen)
{
  list($den,$mesic,$rok)=explode(".",$narozen);
  $vek = strVal((Time()-mktime(0,0,0,$mesic,$den,$rok))/31536000);
  $vek = Floor($vek);
  return $vek;
};

$lidi[] = "13.10.;11.03.1973;Renata Kosá;Renata@seznam.cz";
$lidi[] = "07.03.;23.04.1963;Tomáš Rána;rana@seznam.cz";
$lidi[] = "17.12.;29.05.1965;Daniel Suchý;suchy@seznam.cz";
$lidi[] = "28.06.;23.07.1969;Luboš Andrle;infoandrle@seznam.cz";
$lidi[] = "29.06.;21.09.1960;Petr Kučera;petr.kucera@seznam.cz";
$lidi[] = "21.03.;06.11.1966;Radek Novotnyk;studio-novotny@seznam.cz";

$dnes = Date("d.m.");

for($i=0; $i<count($lidi); $i++) {
  list($svatek,$narozeniny,$jmeno,$email) = explode(";",$lidi[$i]);
  if($dnes == $svatek) { // pokud má svátek
    $coma = "svátek";
    $hobluj_1 = true;
  }
  if($dnes == substr($narozeniny,0,6)) { // pokud má narozeniny
    $vek = UrciVek($narozeniny); // spočítám věk
    $coma = "narozeniny (".$vek." let)";
    $hobluj_2 = true;
  }
  if($hobluj_1 && $hobluj_2) { // pokud má narozeniny i svátek současně
    $coma = "svátek a narozeniny (".$vek." let)";
  }
  if($hobluj_1 || $hobluj_2) { // pokud má narozeniny nebo svátek
    // načtu maily do pole
    for($x=0; $x<count($lidi); $x++) {
      list($svatek,$narozeniny,$jmeno,$email) = explode(";",$lidi[$x]);
      $maily[] = $email;
    }
    array_splice($maily, $i, 1); // odstraním email osoby s jubileem
    $komu = implode(", ",$maily); // rozdělím pole mailů čárkou a mezerou pro odeslání
    $headers = "From: Nazev komunity <info@komunita.cz>\n";
    $headers .= "Content-Type: text/plain; charset=windows-1250\n";
    $predmet = "Nazev komunity - Automaticke upozorneni na jubileum";
    $body = "Dnes má $coma $jmeno !!!\n";
    $body .= "\n\nTato zpráva je generována automaticky.";
    @mail($komu, $predmet, $body, $headers);
  }
  // vynulování proměnných
  $coma = "";
  $hobluj_1 = false;
  $hobluj_2 = false;
  $komu = "";
  $headers = "";
  $predmet = "";
  $body = "";
  unset($maily); // vyprázdním pole mailů
}
?>
petr 6
Profil
5. a 6. radek bych zkratil na
$vek=date("Y")-$rok
mackopu
Profil
Děkuji za reakci. Máš pravdu. Přesto jsem použil už hotovou univerzální funci, která zjišťuje věk v kterémkoliv okamžiku. Zde je trochu nadbytečná, ale může být inspirací pro někoho, kdo zvažuje její použití i v jiných případech.
kukweb
Profil
Nebylo by mozne udelat upravu tohoto kodu s nacitanim z databaze. Jinak dekuji, neco podobneho jsem dlouho hledal.
tiso
Profil
mackopu: ten skript je neefektívny:
- posiela samostatný mail pre každého oslávenca
- má zložitost NxN miesto 2xN
- zbytočne ukladá duplicitné dáta o tom kto má meniny

Vhodnejšie by bolo riešenie s databázou.

edit: teraz pozerámmm že je to staré vlákno.
Moderátor Chamurappi: Tentokrát to asi moc nevadí…
mackopu
Profil
kukweb:
Řádky 10 - 15 nahradíš tímto:
$result = mysql_query("SELECT svatek, narozeniny, jmeno, prijmeni, email FROM tvoje_tabulka");
while ($zaznam = mysql_fetch_array($result)) {
  $lidi[] = $zaznam["svatek"].";".$zaznam["narozeniny"].";".$zaznam["jmeno"]." ".$zaznam["prijmeni"].";".$zaznam["email"];
}

tiso:
Nepředpokládám nasazení pro řádově stovky či tisíce e-mailů, kde by se neefektivnost teprve projevila. To už by zavánělo spamem.
kukweb
Profil
Diky za upravu. Nakonec jsem nasel neco na netu a pouziju cast tveho kodu. Aby vse pracovalo, jak ja chci.

phpbirthday

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:

0