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ářů.
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
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)
jak vlozit do html emailu obrazek ktery je generovan php scriptem?
pouhou vymenou obrazku za nazev scriptu mne to nefunguje