E-maily s přílohou v PHP – PHPmailer

Po delší době se vracím k problematice posílání e-mailů v PHP. Tentokráte se budu zabývat posíláním e-mailů s přílohami.

Instalace

Postup instalace PHPmaileru je popsán ve starším článku, nebudu jej zde tedy opakovat.

Tři typy příloh

PHPmailer umožňuje k e-mailové zprávě připojit tři typy příloh – souborové, řetězcové a vložené. Souborové přílohy se vytvářejí ze souboru, ke kterému má skript přístup – obvykle se bude jednat třeba o PDF soubor s objednávkou, fotku apod. Řetězcová příloha spočívá v přiložení řetězce k e-mailu, přičemž tento řetězec se příjemci bude jevit jako soubor. Posledním typem jsou vložené přílohy, které se používají k přikládání obrázků, které se zobrazí v těle HTML e-mailu.

Souborové přílohy

Prvním typem přílohy je samotný soubor. K e-mailu jej připojíme pomocí konstrukce:

$mail->AddAttachment($soubor, $jmeno, $kodovani, $mimeTyp);

kde $soubor určuje název souboru, který se k e-mailu přikládá (včetně absolutní nebo relativní cesty). Název souboru je jediným povinným parametrem. Druhý parametr $jmeno obsahuje název souboru, který se zobrazí příjemci. To je užitečné v situacích, kdy potřebujeme přiložit soubor pod jiným jménem, než pod kterým je uložen v systému souboru. Třetí parametr, $kodovani, určuje způsob, jakým se obsah souboru zakóduje v těle e-mailu – možnosti jsou "base64", "quoted-printable", "8bit", "7bit", "binary" – doporučuji ponechat "base64", což je také výchozí hodnota. Poslední parametr určuje MIME typ – buď uveďte vlastní, nebo ponechte výchozí hodnotu "application/octet-stream".

Tímto způsobem můžete vložit i více souborů.

Příklad použití může vypadat například takto:

$mail->AddAttachment("./nabidky/nabidka-cez.pdf", "nabidka.pdf");
$mail->AddAttachment("./vop/vop.doc", "obchodni-podminky.doc");

Řetězcové přílohy

Tento typ příloh využijete v případě, že nemáte obsah přílohy uložen v souboru, nýbrž v proměnné. Syntaxe je velmi podobná, jako při vkládání souborů:

$mail->AddStringAttachment($retezec, $jmeno, $kodovani, $mimeTyp);

Oproti vkládání souborů jsou zde dva rozdíly – první parametr určuje proměnnou, v níž jsou uložena data, a druhý parametr, tentokráte povinný, označuje jméno souboru, pod kterým se řetězec do e-mailu uloží. Význam a výchozí hodnoty ostatních parametrů jsou shodné.

Příklad použití může vypadat například takto:

// do proměnné $objednavka vložíme potvrzení objednávky ve formátu HTML
$mail->AddStringAttachment($objednavka, "objednavka.html");
// $mail->Body = "V přiloženém souboru objednavka.html naleznete
rekapitulaci vaší objednávky.";

Vložené přílohy

Tento typ příloh slouží například k vkládání obrázků, ale i zvuků nebo videí, na které se lze odkazovat z těla HTML e-mailu. Syntaxe pro přidání vložené přílohy je následující:

$mail->AddEmbeddedImage($soubor, $cid, $jmeno, $kodovani, $mimeTyp);

Vidíme, že oproti výše uvedeným metodám přibyl jeden parametr. Prvním parametrem je jméno obrázku (včetně absolutní nebo relativní cesty), druhým je tzv. CID, jméno, pod kterým bude obrázek dostupný v HTML těle e-mailu. Další parametry mají stejný význam, jako u obou předcházejících metod. Hodnotu posledního parametru, $mimeTyp, je vhodné nastavit tak, aby reflektovala typ vloženého souboru (pro JPG obrázek nastavit "image/jpeg", pro PNG nastavit "image/png" atd.). Na obrázek, vložený tímto způsobem, se v HTML kódu e-mailu odkazuje pomocí <img src='cid:cid-jmeno' alt='popisek obrazku'>.

Například na obrázek přiložený pomocí

$mail->AddEmbeddedImage("./images/logo-cez.png", "cez", "logo.png", "base64", "image/png");

se v těle HTML e-mailu odkážu pomocí <img src='cid:cez' alt='logo ČEZu'>.

Konkrétní ukázka na závěr

Na závěr uvedu kompletní kód, který přes SMTP server odešle e-mail, který bude obsahovat přiložený soubor.

<?php
  require "class.phpmailer.php";
  $mail = new PHPMailer();
  $mail->IsSMTP();  // k odeslání e-mailu použijeme SMTP server
  $mail->Host = "adresa.smtp.serveru";  // zadáme adresu SMTP serveru
  $mail->SMTPAuth = true;               // nastavíme true v případě, že server vyžaduje SMTP autentizaci
  $mail->Username = "jmenouzivatele";   // uživatelské jméno pro SMTP autentizaci
  $mail->Password = "heslo";            // heslo pro SMTP autentizaci
  $mail->From = "skript@example.com";   // adresa odesílatele skriptu
  $mail->FromName = "Testovací skript"; // jméno odesílatele skriptu (zobrazí se vedle adresy odesílatele)

  $mail->AddAddress("prvni.prijemce@example.com");  // přidáme příjemce
  $mail->AddAddress("druhy.prijemce@example.net", "Jméno druhého příjemce");  // a klidně i druhého, včetně jména

  $mail->IsHTML(true);  // bude to HTML e-mail
  $mail->Subject = "První mail poslaný pomocí PHPMaileru";    // nastavíme předmět e-mailu

  // nastavíme HTML tělo e-mailu
  $mail->Body = "Ahoj ahoj!

<img src='cid:cez' alt='logo ČEZU'>V přílohách ti posílám dva soubory - první je nabídka pro ČEZ, druhým jsou všeobecné obchodní podmínky.";
  // nastavíme textové tělo e-mailu
  $mail->AltBody = "Ahoj ahoj!\n\nV přílohách ti posílám dva soubory - první je nabídka pro ČEZ, druhým jsou všeobecné obchodní podmínky.";
  $mail->WordWrap = 50;   // je vhodné taky nastavit zalomení (po 50 znacích)
  $mail->CharSet = "utf-8";   // nastavíme kódování, ve kterém odesíláme e-mail

  // vložíme první soubor
  $mail->AddAttachment("./nabidky/nabidka-cez.pdf", "nabidka.pdf");
  // vložíme druhý soubor
  $mail->AddAttachment("./vop/vop.doc", "obchodni-podminky.doc");
  // vložíme obrázek, na který jsme se odkázali výše
  $mail->AddEmbeddedImage("./images/logo-cez.png", "cez", "logo.png", "base64", "image-png");

  if(!$mail->Send()) {  // odešleme e-mail
     echo 'Došlo k chybě při odeslání e-mailu.';
     echo 'Chybová hláška: ' . $mail->ErrorInfo;
  }
  else
  {
     echo 'E-mail byl v pořádku odeslán.';
  }
?>

To je pro dnešek vše – pokud máte dotazy nebo vám něco nefunguje, pište do komentářů.

Tanto příspěvek byl zařazen do kategorie PHP a označen štítkem , . Do oblíbených si můžete uložit trvalý odkaz.

11 komentářů k E-maily s přílohou v PHP – PHPmailer

  1. pavel Blaha napsal(a):

    Po odeslani e-mailu s prilohou, mi dorazi e-mail, kdy priloha je jako textova soucast e-mailu nikoli jako priloha. $mail->IsSMTP(); jsem musel zakazat, jelikoz mi to forpsi.com nepobralo, ale to by snad nemel byt ten problem. Diky za radu

  2. admin napsal(a):

    jaký MIME typ mají přílohy?
    jinak jsem teď aktualizoval příspěvek, protože mi wordpress požral kousky kódu, teď už by mělo být vše v pořádku (testoval jsem to přes SMTP server a prošlo v pořádku, nicméně nemyslím si, že by to bez něho nemělo fungovat)

  3. milan hornik napsal(a):

    jak vlozit do html emailu obrazek ktery je generovan php scriptem?
    pouhou vymenou obrazku za nazev scriptu mne to nefunguje

  4. Vložení přílohy napsal(a):

    Could not access file: Nazev.pdf . Takové hlášení obdržím při pokusu o odeslání přílohy. Ta je umístěna na ploše, hlášení neobsahuje cestu k souboru. Je to v pořádku?

    Přílohu odesílám z formuláře, přesněji z inputu (type=“file“ maxlenght=“100″) metodou POST odesílacímu skriptu. Kde mám hledat problém?

    Děkuju.

    Kalows

  5. Vložení přílohy napsal(a):

    Zapomněl jsem asi důležitou informaci. Mail se odesílá na zadanou adresu, text zprávy dojde bez chyby.

    Kalows

  6. admin napsal(a):

    2Kalows: chybu bych hledal v (ne)uvedení úplné cesty k souboru. Pokud je „na ploše“, tak ví PHP, že tam ten soubor má hledat?

  7. příloha z formuláře napsal(a):

    ve vašem scriptu jsem zadal misto („./nabidky/nabidka-cez.pdf“, „nabidka.pdf“);
    pouze ($soubor);
    kde proměnná soubor je vložený soubor z formuláře type=“file“ tak je to asi blbost že?
    jde mi o to aby my mohl uživatel přes moje www poslat e-mail s přílohou kterou tam vloží sám.
    Díky za radu

  8. příloha z formuláře napsal(a):

    už v pořádku už jsem na to přišel a sám:) stačí studovat. pokud někdo bude řešit tento problém tak zde je link http://diskuse.jakpsatweb.cz/?action=vthread&forum=9&topic=119104&page=-1#22

  9. cool napsal(a):

    Supr článek, díky moc 😉 Implementace je fakt jednoduchá.
    Thumb up!

  10. mouk napsal(a):

    Ahoj,

    dobre napsany clanek
    – jen mam s tim tady problem … bud mi to posle prilohy pridane takto
    $mail->AddAttachment(„./nabidky/nabidka-cez.pdf“, „nabidka.pdf“);
    nebo takto
    $mail->AddEmbeddedImage(„./images/logo-cez.png“, „cez“, „logo.png“, „base64“, „image-png“);

    ..ale nikdy ne najednou jako je to v tom prikladu…

    nevi nekdo radu co mam spatne – uz do toho vejram celkem dlouho a ne ne na to prijit…

  11. mouk napsal(a):

    jo a ty absolutni adresy k obrazku take nefunguji…

    viz dokumentace: http://www.tig12.net/downloads/apidocs/wp/wp-includes/class-phpmailer.php.source.html#line1496

    je tak fce php is_file() a ta neumi absolutni adresy… 🙁

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *