Изпращане на писма с PHPMailer. HTML съдържание, вградени картинки, прикачени файлове, ползване на SMTP, поддръжка на кирилица


PHPMailer е PHP клас за изпращане на електронна поща. Притежава много повече функции от обикновената mail() функция, сред които са прикачени файлове и вградени в писмото картинки. Особен подходящ е за функции от типа "Свържете се с нас", тъй като не позволява вмъкването на допълнителни хедъри и оттам изпращането на спам през вашия сайт. Поддържа SMTP протокол.

От къде да го сваля?

PHPMailer може да свалите от официалната страница. Там също може да намерите пълната документация.

Първи стъпки

След като свалите архива, разархивирайте го и го качете на уеб сървъра. Ето примерен код за изпращане на писмо:

<?php
require("class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsMail();

$mail->AddAddress("email@example.com");
$mail->Subject = "Test 1";
$mail->Body = "Test 1 of PHPMailer.";

if(!$mail->Send())
{
   echo "Грешка при изпращане: " . $mail->ErrorInfo;;
}
else
{
   echo "Писмото е изпратено";
}
?>


Тук чрез $mail->IsMail(); отбелязваме, че писмото трябва да се изпрати чрез функцията mail() на PHP. Всички методи за изпращане са:

IsSendmail - чрез командата sendmail.
IsQmail - използва се директно qMail MTA.
IsSMTP - използва се SMTP сървър.

Ето и пример за използване на SMTP. Предполагаме, че SMTP сървъра изисква оторизация с име и парола. Ако това не е нужно, просто сложете $mail->SMTPAuth = false;. За да използвате няколко сървъра, разделете ги със точка и запетая.

<?php
require("class.phpmailer.php");
$mail = new PHPMailer();$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host = "smtp1.example.com;smtp2.example.com";
$mail->SMTPAuth = true;
$mail->Username = 'smtpusername';
$mail->Password = 'smtppassword';

$mail->AddAddress("email@example.com");
$mail->Subject = "Test 1";
$mail->Body = "Test 1 of PHPMailer.";

if(!$mail->Send())
{
   echo "Error sending: " . $mail->ErrorInfo;;
}
else
{
   echo "Letter is sent";
}?>


За да добавим данни за изпращача, използваме следните функции:

$mail->From="mailer@example.com";
$mail->FromName="My site's mailer";
$mail->Sender="mailer@example.com"; // това определя ReturnPath хедъра
$mail->AddReplyTo("replies@example.com", "Replies for my site"); // определя ReplyTo хедърите

За различните типове получатели се ползват следните конструкции:

$mail->AddAddress("mail1@domain.com", "Recepient 1");
$mail->AddCC("mail1@domain.com", "Recepient 1");
$mail->AddBCC("mail1@domain.com", "Recepient 1");

Ако трябва да има 2 или повече To: адреса, просто се повтаря AddAddress функцията.

Езици

Ако се налага писмото да съдържа кирилски или други не-латински букви, както и ако пращате unicode писма, е нужно да укажете съответния набор от знаци, например:

$mail->CharSet="windows-1251";
$mail->CharSet="utf-8";

HTML съдържание

HTML писмата са с по-красиво съдържание, както и по-добре оформено. Тъй като има и клиенти, които не четат HTML, е добре да има и алтернативно текстово съдържание. Ето пример:

<?php
require("class.phpmailer.php");
$mail = new PHPMailer();$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host = "smtp1.example.com;smtp2.example.com";
$mail->SMTPAuth = true;
$mail->Username = 'smtpusername';
$mail->Password = 'smtppassword';

$mail->From="mailer@example.com";
$mail->FromName="My site's mailer";
$mail->Sender="mailer@example.com";
$mail->AddReplyTo("replies@example.com", "Replies for my site");

$mail->AddAddress("email@example.com");
$mail->Subject = "Test 1";

$mail->IsHTML(true);
$mail->Body = "<h1>Test 1 of PHPMailer html</h1><p>This is a test</p>";
$mail->AltBody="This is text only alternative body.";

if(!$mail->Send())
{
   echo "Error sending: " . $mail->ErrorInfo;;
}
else
{
   echo "Letter is sent";
}
?>

Картинки

Ако трябва да добавим картинки в HTML съдържанието, има два начина. Единият е като зададем абсолютен адрес, който води към нашия сайт например. Проблемът е, че по този начин може да се следи кой чете писмата, поради което мейл клиентите не показват такива картинки. За да се избегне този проблем, картинките могат да се прикачат към писмото. В последствие в HTML кода се записват по специален начин:

<?php
require("class.phpmailer.php");
$mail = new PHPMailer();$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host = "smtp1.example.com;smtp2.example.com";
$mail->SMTPAuth = true;
$mail->Username = 'smtpusername';
$mail->Password = 'smtppassword';

$mail->From="mailer@example.com";
$mail->FromName="My site's mailer";
$mail->Sender="mailer@example.com";
$mail->AddReplyTo("replies@example.com", "Replies for my site");

$mail->AddAddress("email@example.com");
$mail->Subject = "Test 1";

$mail->IsHTML(true);
$mail->AddEmbeddedImage('logo.jpg', 'logoimg', 'logo.jpg'); // прикача файла logo.jpg, който ще бъде достъпен чрез идентификатора logoimg
$mail->Body = "<h1>Test 1 of PHPMailer html</h1>
    <p>This is a test picture: <img src=\"cid:logoimg\" /></p>";
$mail->AltBody="This is text only alternative body.";

if(!$mail->Send())
{
   echo "Error sending: " . $mail->ErrorInfo;;
}
else
{
   echo "Letter is sent";
}
?>

Прикачени файлове

При нужда, може да прикачите файл към писмото. Използва се функцията AddAttachment:

<?php
require("class.phpmailer.php");
$mail = new PHPMailer();$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host = "smtp1.example.com;smtp2.example.com";
$mail->SMTPAuth = true;
$mail->Username = 'smtpusername';
$mail->Password = 'smtppassword';

$mail->From="mailer@example.com";
$mail->FromName="My site's mailer";
$mail->Sender="mailer@example.com";
$mail->AddReplyTo("replies@example.com", "Replies for my site");

$mail->AddAddress("email@example.com");
$mail->Subject = "Your invoice";

$mail->IsHTML(false);
$mail->AddAttachment('files/invoice-user-1234.pdf', 'invoice.pdf'); // прикача files/invoice-user-1234.pdf, като го преименува на invoice.pdf
$mail->Body = "Please find your invoice attached.";
if(!$mail->Send())
{
   echo "Error sending: " . $mail->ErrorInfo;;
}
else
{
   echo "Letter is sent";
}
?>


Коментари:

Нов (07-09-2010 02:41) :
Здравейте. Допадна ми подробното представяне на PHPMailer и възможностите, които имаме с него. Н о тъй като не съм много навътре с PHP възможно ли е да напишете как трябва да интегрираме въпросния PHPMailer код в една реална контактна форма за да можем да изпращаме писма през SMTP например. Благодаря

Боби (26-08-2011 12:04) :
Привет,
благодаря за описанието. Всичко работи с едно изключение - не мога да получавам е-майлите с кирилски букви (нито subect, нито body). Опитах няколко вариации, сменях енкодинга на маил клиента и отново не става. Идея какво не е наред?

Обратно към списъка със статиите

Тази страница последно е променяна на 2024-03-28 11:59:21