PHPMailer شاید محبوب ترین کتابخانه منبع باز PHP برای ارسال ایمیل با آن باشد. اولین بار در سال 2001 منتشر شد و از آن زمان به بعد ، به غیر از چند مورد علاقه طرفداران دیگر مانند Swiftmailer ، به یک روش محبوب توسعه دهنده PHP برای ارسال ایمیل به صورت برنامه ای تبدیل شده است.

در این مقاله ، ما در مورد اینکه چرا شما باید به جای PHP از PHPMailer استفاده کنید صحبت خواهیم کرد mail() عملکرد ، و ما برخی از نمونه های کد را در مورد نحوه استفاده از این کتابخانه نشان خواهیم داد.

این مقاله محبوب در سال 2020 به روز شده است تا به روزترین دستورالعمل ها برای کار با PHPMailer را ارائه دهد.

آیا این یک گزینه جایگزین برای PHP است mail() تابع؟

در بیشتر موارد ، این یک گزینه جایگزین برای PHP است mail() عملکرد ، اما بسیاری از موارد دیگر وجود دارد که mail() عملکرد به سادگی انعطاف پذیر نیست تا بتواند به آنچه شما نیاز دارید برسید.

اول از همه ، PHPMailer یک رابط شی گرا را ارائه می دهد ، در حالی که mail() شی گرا نیست. توسعه دهندگان PHP معمولاً از خلق متنفرند $headers رشته ها هنگام ارسال ایمیل با استفاده از mail() عملکرد زیرا آنها نیاز به فرار زیادی دارند. PHPMailer این را نسیم می کند. توسعه دهندگان همچنین برای ارسال پیوست ها و ایمیل های مبتنی بر HTML هنگام استفاده از کد ، باید کد آلوده (فرار از کاراکترها ، رمزگذاری و قالب بندی) را بنویسند. mail() عملکرد ، در حالی که PHPMailer این را بدون درد می کند.

همچنین mail() عملکرد برای ارسال ایمیل به یک سرور ایمیل محلی نیاز دارد که تنظیم آن همیشه بی اهمیت نیست. در صورت احراز هویت ، PHPMailer می تواند از سرور نامه غیر محلی (SMTP) استفاده کند.

مزایای دیگر عبارتند از:

  • درصورت عدم ارسال ایمیل می تواند انواع مختلف پیام های خطا را به بیش از 40 زبان چاپ کند.
  • دارای پشتیبانی و احراز هویت پروتکل SMTP از طریق SSL و TLS است.
  • این می تواند یک نسخه متن ساده از ایمیل را برای سرویس گیرندگان ایمیل غیر HTML ارسال کند.
  • این یک انجمن توسعه دهندگان بسیار فعال است که آن را امن و به روز نگه می دارد.

PHPMailer همچنین توسط سیستم های معروف مدیریت محتوای PHP مانند وردپرس ، دروپال و جوملا استفاده می شود.

درحال نصب PHPMailer

می توانید نصب کنید PHPMailer با استفاده از آهنگساز:

composer require phpmailer/phpmailer

ارسال ایمیل از سرور وب محلی با استفاده از PHPMailer

در اینجا ساده ترین مثال برای ارسال ایمیل از وب سرور محلی با استفاده از PHPMailer آورده شده است:

<?php
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;

require_once "vendor/autoload.php";


$mail = new PHPMailer(true); 


$mail->From = "from@yourdomain.com";
$mail->FromName = "Full Name";


$mail->addAddress("recepient1@example.com", "Recepient Name");
$mail->addAddress("recepient1@example.com"); 


$mail->addReplyTo("reply@yourdomain.com", "Reply");


$mail->addCC("cc@example.com");
$mail->addBCC("bcc@example.com");


$mail->isHTML(true);

$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";

try {
    $mail->send();
    echo "Message has been sent successfully";
} catch (Exception $e) {
    echo "Mailer Error: " . $mail->ErrorInfo;
}

کد و نظرات باید به اندازه کافی شفاف باشد تا همه آنچه را که اتفاق می افتد توضیح دهد.

ارسال ایمیل با پیوست ها

در اینجا مثالی از نحوه ارسال ایمیل همراه با پیوست ها با استفاده از PHPMailer آورده شده است:

<?php
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;

require_once "vendor/autoload.php";

$mail = new PHPMailer;

$mail->From = "from@yourdomain.com";
$mail->FromName = "Full Name";

$mail->addAddress("recipient1@example.com", "Recipient Name");


$mail->addAttachment("file.txt", "File.txt");        
$mail->addAttachment("images/profile.png"); 

$mail->isHTML(true);

$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";

try {
    $mail->send();
    echo "Message has been sent successfully";
} catch (Exception $e) {
    echo "Mailer Error: " . $mail->ErrorInfo;
}

در اینجا ، ما دو فایل را پیوست می کنیم – file.txt، که در همان دایرکتوری اسکریپت قرار دارد ، و images/profile.png، که در آن ساکن است images فهرست پوشه اسکریپت.

برای افزودن پیوست به ایمیل ، فقط باید عملکرد را فراخوانی کنیم addAttachment از شی PHPMailer با عبور از مسیر پرونده به عنوان آرگومان. برای پیوست کردن چندین پرونده ، باید چندین بار آن را فراخوانی کنیم.

عیب یابی

در دو مثال ما از PHPMailer’s استفاده کردیم کلاس استثنا برای اشکال زدایی ، بنابراین هرگونه خطا به ما کمک می کند اشکالاتی را که ممکن است رخ دهد ، رفع اشکال کنیم. ما همچنین بحث را اضافه کردیم true به سازنده PHPM، برای تولید استثناهای توصیفی بیشتر در سطح بالاتر.

بسته به سیستمی که استفاده می کنیم ، احتمالاً بیشترین خطایی که مشاهده خواهیم کرد مربوط به اجرای سیستم است mail() عملکرد در پس زمینه:

خطای ارسال کننده: عملکرد ایمیل نمونه برداری نمی شود.

اگر به جزئیات بیشتری در مورد خطا نیاز داشته باشیم ، می توانیم چنین چیزی را به بند گرفتن اضافه کنیم:

print_r(error_get_last());

معمولاً مشكل در كاركرد نامه مربوط به راه اندازي سرور پست الكترونيكي خواهد بود كه در اين صورت ، اين مشكل است error_get_last عملکرد چیزی مانند این را برمی گرداند:

Array (
    [type] => 2
    [message] => mail(): Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set()
    [file] => OUR_PATH vendorphpmailerphpmailersrcPHPMailer.php
    [line] => 863
)

این مسئله ای است که احتمالاً بیشتر اوقات با آن روبرو خواهیم شد و با استفاده از SMTP می توانیم آن را به راحتی حل کنیم.

نمایش پیام های خطای محلی

$mail->ErrorInfo می تواند پیام های خطا را به 43 زبان مختلف بازگرداند.

برای نمایش پیام های خطا به زبان دیگر ، از آن کپی کنید language پوشه از کد منبع PHPMailer به فهرست پروژه.

برای مثال ، برای بازگرداندن پیام های خطا به زبان روسی ، با استفاده از تماس زیر روش PHPMailer را به زبان روسی تنظیم کنید:

$mail->setLanguage("ru");

همچنین می توانید پرونده های زبان خود را به language فهرست راهنما.

با استفاده از SMTP

برای ارسال ایمیل می توانید از سرور نامه میزبان دیگری استفاده کنید ، اما برای این کار ابتدا باید احراز هویت داشته باشید. به عنوان مثال ، برای ارسال ایمیل از سرور نامه Gmail ، باید یک حساب Gmail داشته باشید.

SMTP پروتكلی است كه توسط سرویس گیرندگان نامه برای ارسال درخواست ارسال ایمیل به سرور نامه استفاده می شود. هنگامی که سرور نامه ایمیل را تأیید کرد ، آن را به سرور نامه مقصد می فرستد.

در اینجا مثالی از ارسال ایمیل از سرور نامه Gmail از دامنه شما آورده شده است. برای اجرای کد نیازی به سرور ایمیل محلی ندارید. ما از پروتکل SMTP استفاده خواهیم کرد:

<?php
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerSMTP;
use PHPMailerPHPMailerException;

require_once "vendor/autoload.php";

$mail = new PHPMailer(true);


$mail->SMTPDebug = 3;                               

$mail->isSMTP();            

$mail->Host = "smtp.gmail.com";

$mail->SMTPAuth = true;                          

$mail->Username = "name@gmail.com";                 
$mail->Password = "super_secret_password";                           

$mail->SMTPSecure = "tls";                           

$mail->Port = 587;                                   

$mail->From = "name@gmail.com";
$mail->FromName = "Full Name";

$mail->addAddress("name@example.com", "Recepient Name");

$mail->isHTML(true);

$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";

try {
    $mail->send();
    echo "Message has been sent successfully";
} catch (Exception $e) {
    echo "Mailer Error: " . $mail->ErrorInfo;
}

Gmail نیاز به رمزگذاری TLS از طریق SMTP دارد ، بنابراین ما آن را متناسب با آن تنظیم می کنیم. قبل از ارسال از طریق SMTP ، باید نام میزبان ، شماره پورت ، نوع رمزگذاری را در صورت لزوم پیدا کنید و در صورت نیاز به احراز هویت ، به نام کاربری و رمز ورود نیز نیاز دارید. توجه داشته باشید که تأیید اعتبار دو عاملی در Gmail به شما امکان نمی دهد از SMTP آنها با نام کاربری / رمز عبور استفاده کنید. بجای، پیکربندی اضافی لازم خواهد بود.

یک مزیت بزرگ در استفاده از SMTP از راه دور نسبت به نامه های محلی این است که اگر از PHP استفاده می کنید mail() عملکرد برای ارسال ایمیل با from دامنه آدرس به غیر از نام دامنه محلی (نام سرور) تنظیم شده است ، فیلترهای حمله سرور ایمیل گیرنده آن را به عنوان هرزنامه علامت گذاری می کند. به عنوان مثال ، اگر از سروری با نام میزبان واقعی ایمیل ارسال کنید example.com با from نشانی name@gmail.com به name@yahoo.com، سپس سرورهای یاهو آن را به عنوان هرزنامه علامت گذاری می کنند یا پیغامی را به کاربر نشان می دهند که به ایمیل اعتماد نکند زیرا اصل ایمیل example.com و اما خود را به گونه ای نشان می دهد که انگار از آنجا آمده است gmail.com. اگرچه شما صاحب هستید name@gmail.com، هیچ راهی برای یافتن یاهو وجود ندارد.

بازیابی ایمیل ها با استفاده از POP3

PHPMailer همچنین اجازه می دهد POP قبل از SMTP تأیید برای ارسال ایمیل. به عبارت دیگر ، شما می توانید با استفاده از POP احراز هویت کنید و با استفاده از SMTP ایمیل ارسال کنید. متأسفانه ، PHPMailer از بازیابی ایمیل از سرورهای نامه با استفاده از پروتکل POP3 پشتیبانی نمی کند. این فقط به ارسال ایمیل محدود می شود.

نتیجه

اگر شما یک توسعه دهنده PHP هستید ، احتمال اجتناب از ارسال ایمیل به صورت برنامه ای کم است. اگرچه ممکن است خدمات شخص ثالثی مانند Mandrill یا SendGrid را انتخاب کنید ، اما گاهی اوقات چنین گزینه ای نیست و حتی بیشتر از آن کتابخانه ارسال ایمیل خود را بچرخانید. اینجاست که PHPMailer و گزینه های دیگر آن (Zend Mail ، Swift Mailer و …) وارد می شوند.

می توانید در مورد API های این کتابخانه اطلاعات کسب کنید در ویکی مخزن، یا در اسناد رسمی.

آیا با وابستگی به کتابخانه PHP درگیر می شوید؟ پخش فیلم ما را تماشا کنید و درمورد اینکه چگونه آهنگساز می تواند به شما کمک کند این کار را برای خود مدیریت کنید ، یاد بگیرید.