Anophel-آنوفل چطوری در PHP با PHPMailer ایمیل ارسال کنیم؟

چطوری در PHP با PHPMailer ایمیل ارسال کنیم؟

انتشار:
0

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

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

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

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

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

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

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

  1. در صورت عدم ارسال ایمیل، می تواند انواع مختلف پیام های خطا را به بیش از 40 زبان چاپ کند.
  2. دارای پشتیبانی از پروتکل SMTP و احراز هویت از طریق SSL و TLS است.
  3. می‌تواند یک نسخه متن ساده ایمیل را برای مشتریان ایمیل غیرHTML ارسال کند.
  4. این یک جامعه توسعه دهندگان بسیار فعال دارد که آن را ایمن و به روز نگه می دارد.
  5. PHPMailer همچنین توسط سیستم های مدیریت محتوای محبوب PHP مانند وردپرس، دروپال و جوملا استفاده می شود.

نصب PHPMailer

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

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;
}

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

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

در اینجا نمونه ای از نحوه ارسال ایمیل با پیوست ها با استفاده از 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 که در فهرست تصاویر دایرکتوری اسکریپت قرار دارد.

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

عیب یابی کد هایمان

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

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

Mailer Error: Could not instantiate mail function.

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

print_r(error_get_last());

معمولاً مشکل تابع mail مربوط به تنظیمات سرور ایمیل از دست رفته است، در این صورت تابع 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$ می‌تواند پیام‌های خطا را به ۴۳ زبان مختلف بازگرداند.

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

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

$mail->setLanguage("fr");

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

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

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

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 از راه دور نسبت به ایمیل محلی این است که اگر از تابع mail() PHP برای ارسال ایمیل با دامنه آدرس from به هر چیزی غیر از نام دامنه محلی (نام سرور) استفاده می‌کنید، سپس سرور ایمیل گیرنده حمله می‌کند. فیلترها آن را به عنوان هرزنامه علامت گذاری می کنند. برای مثال، اگر ایمیلی از سروری با نام میزبان واقعی example.com با آدرس from از name@gmail.com به name@yahoo.com ارسال کنید، سرورهای یاهو آن را به‌عنوان هرزنامه علامت‌گذاری می‌کنند یا پیامی را به کاربر نشان می‌دهند. به ایمیل اعتماد کنید زیرا منشاء ایمیل example.com است و در عین حال خود را به گونه ای نشان می دهد که گویی از gmail.com آمده است. اگرچه شما مالک name@gmail.com هستید، هیچ راهی برای یاهو وجود ندارد که بتواند آن را پیدا کند.

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

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

نتیجه

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

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

اگر می خواهید PHP رت به صورت حرفه ای یادبگرید و نحوه ارسال ایمیل و خیلی از موارد دیگر را یادبگرید می توانید از مقاله های وب سایت ما و دوره آموزشی PHP وب سایت ما استفاده کنید.

#ایمیل#ارسال_ایمیل#php#phpmailer#php_email
نظرات ارزشمند شما :

در حال دریافت...

مقاله های مشابه

در حال دریافت...