ارسال ایمیل در پی اچ پی با PHP Mailer
ﺯﻣﺎﻥ ﻣﻄﺎﻟﻌﻪ: 7 دقیقه

ارسال ایمیل در پی اچ پی با PHP Mailer

PHPMailer شاید محبوب ترین کتابخانه پی اچ پی متن‌باز برای ارسال ایمیل باشد. این نخستین بار در سال 2001 به بازار عرضه شد و از آن زمان به بعد، به یکی از روش‌های مورد علاقه برنامه نویسان برای ارسال ایمیل به صورت برنامه‌ای تبدیل شده است.

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

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

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

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

اول از همه، PHPMailer یک رابط شی‌گرا فراهم می‌کند. در حالی که متد mail() شی‌گرا نیست. توسعه دهندگان پی اچ پی عموما از ایجاد رشته‌های header$ هنگام ارسال ایمیل با استفاده از تابع mail() متنفر هستند. زیرا به فرار زیادی احتیاج دارند. PHPMailer از همه دم دست‌تر است. توسعه دهندگان همچنین برای ارسال پیوست‌ها و ایمیل‌های مبتنی بر HTML هنگام استفاده از تابع mail()، باید کد کثیف (نویسه‌های فرار، رمزگذاری و قالب بندی) را بنویسند، در حالی که PHPMailer این کار را بدون دردسر انجام می‌دهد.

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

مزایای دیگر آن شامل موارد زیر است:

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

PHPMailer همچنین توسط سیستم‌های مدیریت محتوای پی اچ پی معروف مانند WordPress ، Drupal و Joomla استفاده می‌شود.

نحوه نصب PHPMailer

با استفاده از کامپوزر به راحتی می‌توانید PHPMailer را نصب کنید:

composer require phpmailer/phpmailer

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

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

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require_once "vendor/autoload.php";

//PHPMailer Object
$mail = new PHPMailer(true); //Argument true in constructor enables exceptions

//From email address and name
$mail->From = "from@yourdomain.com";
$mail->FromName = "Full Name";

//To address and name
$mail->addAddress("recepient1@example.com", "Recepient Name");
$mail->addAddress("recepient1@example.com"); //Recipient name is optional

//Address to which recipient will reply
$mail->addReplyTo("reply@yourdomain.com", "Reply");

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

//Send HTML or Plain Text email
$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 PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require_once "vendor/autoload.php";

$mail = new PHPMailer;

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

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

//Provide file path and name of the attachments
$mail->addAttachment("file.txt", "File.txt");        
$mail->addAttachment("images/profile.png"); //Filename is optional

$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 که در مسیر تصاویر اسکریپت قرار دارد را پیوست می‌کنیم.

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

عیب یابی

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

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

خطای نامه پستی: تابع نامه از طریق پیام رسان انجام نشد.

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

print_r(error_get_last());

معمولا مشکلی در تابع main() به تنظیمات سرور پست الکترونیکی گمشده، مربوط خواهد بود. در این صورت تابع 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 \vendor\phpmailer\phpmailer\src\PHPMailer.php
    [line] => 863
)

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

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

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

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

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

$mail->setLanguage("ru");

همچنین می‌توانید فایل‌های زبان مد نظر خود را به فهرست زبان اضافه کنید.

استفاده از SMTP

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

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

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

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require_once "vendor/autoload.php";

$mail = new PHPMailer(true);

//Enable SMTP debugging.
$mail->SMTPDebug = 3;                               
//Set PHPMailer to use SMTP.
$mail->isSMTP();            
//Set SMTP host name                          
$mail->Host = "smtp.gmail.com";
//Set this to true if SMTP host requires authentication to send email
$mail->SMTPAuth = true;                          
//Provide username and password     
$mail->Username = "name@gmail.com";                 
$mail->Password = "super_secret_password";                           
//If SMTP requires TLS encryption then set it
$mail->SMTPSecure = "tls";                           
//Set TCP port to connect to
$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 از طریق نامه محلی این است که اگر از تابع main() پی اچ پی برای ارسال ایمیل با دامنه آدرس برای هر چیز دیگری غیر از نام دامنه محلی (نام سرور) استفاده می‌کنید، پس از آن حمله، فیلترهای سرور ایمیل گیرنده آن را به عنوان اسپم تشخیص می‌دهد. به عنوان مثال، اگر شما یک ایمیل از سرور با نام میزبان واقعی مثلا example.com با آدرس gmail.com@name به name@yahoo.com ارسال کنید، سرورهای یاهو آن را به عنوان هرزنامه علامت‌گذاری می‌کنند یا پیامی را به کاربر نمایش می‌دهد که به ایمیل اعتماد نکنید زیرا منشا نامه به عنوان مثال example.com است و خود را مانند اینکه از gmail.com آمده است نشان می‌دهد. اگرچه شما صاحب name@gmail.com هستید، هیچ راهی برای یاهو وجود ندارد که این موضوع را پیدا کند.

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

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

جمع بندی

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

می‌توانید در مورد API های این کتابخانه در repository wiki یا در صفحات رسمی دیگر اطلاعات کسب کنید.

منبع

چه امتیازی برای این مقاله میدهید؟

خیلی بد
بد
متوسط
خوب
عالی
3.67 از 3 رای

/@heshmati74
عرفان حشمتی
Full-Stack Web Developer

کارشناس معماری سیستم های کامپیوتری، طراح و توسعه دهنده وب سایت

دیدگاه و پرسش

برای ارسال دیدگاه لازم است وارد شده یا ثبت‌نام کنید ورود یا ثبت‌نام

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید