پنجشنبه ۲۴ اردیبهشت ۱۴۰۵

Thursday, May 14, 2026 GMT +3:30

ارسال ایمیل با PHP و کلاس PHPMailer

php-mail-class

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

ارسال ایمیل در PHP با تابع mail


ساده ترین روش ارسال ایمیل در PHP استفاده از تابع درونی و از پیش تعریف شده mail و پروتکل SMTP (مخفف Simple Mail Transfer Protocol) بدون بررسی نام کاربری و رمز عبور (Authentication) است، در این روش کافی است تابع mail را با چند آرگیومنت فراخوانی کنیم تا ایمیل ارسال شود، به طور مثال:
<?php
//دریافت کننده ایمیل
$to = 'username <useraccount@example.com>';

//موضوع ایمیل
$subject = 'ایمیل ساده';

//متن پیام
$body = 'سلام، این ایمیل جهت تست ارسال شده است!';

//سربرگ ها
$headers = 'From: yourname <youraccount@example.com>' . "\r\n" .
    'Reply-To: yourname <youraccount@example.com>' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

//فراخوانی تابع و ارسال ایمیل
if(mail($to, $subject, $body, $headers)) {
    echo 'ایمیل شما با موفقیت ارسال شد';
} else {
    echo 'خطا در ارسال ایمیل! تنظیمات سرور شما از این امکان پشتیبانی نمی کند';
}
?>
توضیح:
- تابع mail به صورت از پیش تعریف شده در مفسر PHP وجود دارد و تنها کافی است آن را با تکمیل پارامترها فراخوانی کنیم.
- کارکرد صحیح این تابع تا حدود زیادی بستگی به تنظیمات سرور و فایل php.ini دارد، معمولا در سرورهای اشتراکی دسترسی به فایل اصلی php.ini امکان پذیر نیست بنابراین اگر نتوانیم با تابع mail ایمیل ارسال کنیم به احتمال زیاد تنظیمات این فایل به درستی انجام نشده است یا مسئول فنی هاست قابلیت ارسال ایمیل بدون اعتبارسنجی (Authentication) را محدود کرده است که در صورت نیاز باید با پشتیبانی هاست در این مورد تماس بگیریم (البته در اغلب موارد امکان ارسال ایمیل با ایجاد حساب کاربری و SMTP که در ادامه توضیح خواهیم داد وجود دارد).
- برای ارسال ایمیل با تابع mail سه پارامتر اصلی و چند پارامتر فرعی باید در نظر گرفته شود، پارامترهای اصلی آن آدرس ایمیل دریافت کننده (To)، موضوع (Subject) و متن پیام (Body) است، پارامترهای اضافی به شکل سربرگ ها قابل استفاده هستند (آدرس ایمیل ارسال کننده (From) اغلب اجباری است) که به طور مثال می توانند به صورت های زیر باشند:
<?php
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'X-Mailer: PHP' . "\r\n";
$headers .= 'From: yourname <youraccount@example.com>' . "\r\n";
$headers .= 'Reply-To: yourname <youraccount@example.com>' . "\r\n";
$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
$headers .= 'Cc: admin@example.com' . "\r\n";
$headers .= 'Bcc: other@example.com' . "\r\n";
?>
سربرگ ها را می توانیم به شکل آرایه نیز در کد ارسال ایمیل داشته باشیم:
$headers = array(
    'From' => 'yourname <youraccount@example.com',
    'Reply-To' => 'yourname <youraccount@example.com',
    'X-Mailer' => 'PHP/' . phpversion()
);
- علامت r\n\ در کدهای بالا برای ایجاد یک خط جدید استفاده می شود، برای حفظ اثر این کدها باید در بین علامت های "" (Double Quotation) باشند نه '' (Single Quotation).
نکته 1: سربرگ From در اغلب پلتفرم های ایمیل اجباری است و در صورتی که این سربرگ تنظیم نشده باشد ممکن است خطای زیر را در PHP دریافت کنیم:
Warning: mail(): "sendmail_from" not set in php.ini or custom "From:" header missing.
نکته 2: عبارت MIME (مخفف Multipurpose Internet Mail Extensions) استاندارد اینترنتی برای ارسال و دریافت اطلاعات با فرمت های مختلف در بستر ایمیل است.

ارسال ایمیل به صورت HTML با تابع mail


تابع mail علاوه بر ارسال ایمیل به صورت متن ساده یا Plain Text برای ارسال محتوای فرمت بندی شده به صورت کدهای HTML نیز قابل استفاده است، بدین منظور دو کار را باید در هنگام ارسال ایمیل انجام دهیم:
1- متن پیام ما باید به صورت کدهای HTML باشد مشابه تگ های صفحات وب که به صورت HTML کدنویسی می کنیم.
2- در قسمت سربرگ ها که در بالا عنوان شد، سربرگ زیر را برای پشتیبانی از زبان فارسی (یا سایر زبان های UTF-8) به کد خود اضافه کنیم:
<?php
//دریافت کننده ایمیل
$to = 'username <useraccount@example.com>';

//موضوع ایمیل
$subject = 'ایمیل ساده';

//متن پیام
$body = '<html><body>سلام، این ایمیل جهت <b>تست</b> ارسال شده است!</html></body>';

//سربرگ ها
$headers = 'Content-type: text/html; charset=utf-8' . "\r\n";
$headers .= 'From: yourname <youraccount@example.com>' . "\r\n" .
    'Reply-To: yourname <youraccount@example.com>' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

//فراخوانی تابع و ارسال ایمیل
if(mail($to, $subject, $body, $headers)) {
    echo 'ایمیل شما با موفقیت ارسال شد';
} else {
    echo 'خطا در ارسال ایمیل! تنظیمات سرور شما از این امکان پشتیبانی نمی کند';
}
?>
البته ارسال سربرگ های اضافی همیشه هم ضروری نیست، برخی از سرویس های ایمیل به طور پیش فرض از یونیکد UTF-8 پشتیبانی می کنند، اما برای اطمینان از اینکه ایمیل ارسالی در همه پلتفرم ها خوانا و قابل استفاده باشد بهتر است سربرگ Content-type را همراه ایمیل خود ارسال کنیم.

ارسال فایل ضمیمه با تابع mail در PHP


ارسال ایمیل بدون فایل های ضمیمه (Attachment) با تابع mail در PHP کار چندان سختی نیست اما اگر بخواهیم به همین صورت فایل ها را نیز به همراه نامه الکترونیک خود ضمیمه کنیم باید چند کار دیگر انجام دهیم که در ادامه خواهیم گفت، ابتدا کد زیر را در نظر بگیریم این کد با استفاده از تابع mail در PHP علاوه بر ارسال متن ساده و متن به صورت HTML قابلیت ارسال فایل ضمیمه (Attachment) را نیز دارد:
<?php
//دریافت کننده ایمیل
$to = 'username <useraccount@example.com>';

//ارسال کننده ایمیل
$from = 'yourname <youraccount@example.com>';

//ارسال پاسخ به
$reply = 'yourname <youraccount@example.com>';

//موضوع
$subject = 'ارسال ایمیل به همراه ضمیمه';

//کد اتفاقی Boundary
$boundary = md5(time());

//خط جدید
$line = "\r\n"; //یا PHP_EOL

//فایل ضمیمه
$filename = 'phpbook.zip';

//تجزیه و آماده سازی فایل برای ارسال
$attachment = chunk_split(base64_encode($filename));

//سربرگ ها
$headers = 'From: ' . $from . $line;
$headers .= 'Reply-To: ' . $reply . $line;
$headers .= 'MIME-Version: 1.0' . $line;
$headers .= 'Content-Type: multipart/mixed; boundary="' . $boundary . '"' . $line;

//متن پیام به صورت ساده
$body = '--' . $boundary . $line;
$body .= 'Content-Type: text/plain; charset="utf-8"' . $line;
$body .= 'Content-Transfer-Encoding: 8bit' . $line . $line;
$body .= 'این یک ایمیل به همراه ضمیمه است' . $line;

//متن پیام به صورت HTML
$body .= '--' . $boundary . $line;
$body .= 'Content-Type: text/html; charset="utf-8"' . $line;
$body .= 'Content-Transfer-Encoding: 8bit' . $line . $line;
$body .= 'این یک ایمیل به همراه <b>ضمیمه</b> است' . $line;

//تنظیمات فایل ضمیمه
$body .= '--' . $boundary . $line;
$body .= 'Content-Type: application/zip; name="' . $filename . '"' . $line;
$body .= 'Content-Transfer-Encoding: base64' . $line;
$body .= 'Content-Disposition: attachment' . $line;
$body .= 'Content-Transfer-Encoding: 7bit' . $line . $line;
$body .= $attachment . $line;
$body .= '--' . $boundary . '--';

//فراخوانی تابع و ارسال ایمیل
if(mail($to, $subject, $body, $headers)) {
    echo 'ایمیل شما با موفقیت ارسال شد';
} else {
    echo 'خطا در ارسال ایمیل! تنظیمات سرور شما از این امکان پشتیبانی نمی کند';
}
?>
توضیح:
- در هنگام ارسال ایمیل به همراه فایل ضمیمه (Attachment) به سربرگی تحت عنوان Boundary (سرحد، کرانه) احتیاج داریم، در صورتی که ایمیل ارسالی چند بخشی شامل متن ساده، متن به صورت HTML و فایل ضمیمه باشد در استاندارد MIME برای تفکیک قسمت های مختلف آن از هم از عبارتی تحت عنوان Boundary استفاده می شود، نکته مهم اینکه این عبارت نباید جایی در متن ایمیل تکرار شده باشد لذا با تابع MD5 و در نظر گرفتن زمان سرور به صورت Unix یک عبارت رمزی شده (Hash) ایجاد می کنیم، شیوه ایجاد عبارت رمزی شده مهم نیست مهم این است یک رشته متنی غیرتکراری بر اساس استاندارد RFC 1341 کنسرسیوم جهانی وب (W3C) در ایمیل داشته باشیم که قسمت های مختلف را از هم جدا کند.
- نکته مهم دیگر استفاده از تابع chunk_split و base64_encode است، به این صورت فایل ما برای انتقال به قطعات کوچکتری تقسیم شده و در چارچوب استاندارد RFC 2045 سازمان استانداردسازی وب (IETF) قابل انتقال است.
- متغیر line برای ایجاد خط جدید با کاراکترهای rn در محتوای سربرگ های ایمیل ارسالی است، طبق بررسی ما در هنگام ارسال ایمیل به همراه فایل ضمیمه بهتر است تعداد خط ها دقیقا مشابه با نمونه کد بالا باشد.
- در سربرگ های اولیه مقادیر multipart/mixed را برای Content-Type در نظر گرفته ایم که این کار به دلیل ضمیمه بودن فایل به همراه ایمیل است.
- در قسمت میانی کد دو نوع محتوای مشابه به صورت plain/text و text/html تنظیم کرده ایم که جهت سازگاری با سیستم های دریافت ایمیلی است که از HTML پشتیبانی نمی کنند، در صورتی که سیستم دریافت ایمیل از HTML پشتیبانی کند حالت متن ساده نادیده گرفته می شود (در حال حاضر اغلب برنامه ها از ایمیل های HTML پشتیبانی می کنند و حالت Plain Text ضرورت چندانی ندارد).
- در قسمت مربوط به فایل ضمیمه از مقادیر application/zip برای Content-Type استفاده کرده ایم که نوع فایل phpbook.zip را در استاندارد MIME مشخص می کند، برای بدست آوردن مقادیر Content-Type فایل های مختلف کافی است آدرس دایرکتوری، نام فایل به همراه فرمت آن را در سرور یا در لوکال هاست در تابع زیر به جای متغیر فرضی file جایگزین کرده و کد را اجرا کنیم، خروجی دستورات مقادیر مناسب قسمت Content-Type متناظر با فایل تنظیم شده را نمایش می دهد:
<?php
//تابع نمایش نوع فایل
function getMIMEType($file_name){
    //لیست فرمت های پرکاربرد
    $mime_types = array(
        //files
        'txt' => 'text/plain',
        'htm' => 'text/html',
        'html' => 'text/html',
        'php' => 'text/html',
        'css' => 'text/css',
        'js' => 'application/javascript',
        'json' => 'application/json',
        'xml' => 'application/xml',
        'swf' => 'application/x-shockwave-flash',
        'flv' => 'video/x-flv',
        //images
        'png' => 'image/png',
        'jpe' => 'image/jpeg',
        'jpeg' => 'image/jpeg',
        'jpg' => 'image/jpeg',
        'gif' => 'image/gif',
        'bmp' => 'image/bmp',
        'ico' => 'image/vnd.microsoft.icon',
        'tiff' => 'image/tiff',
        'tif' => 'image/tiff',
        'svg' => 'image/svg+xml',
        'svgz' => 'image/svg+xml',
        //archives
        'zip' => 'application/zip',
        'rar' => 'application/x-rar-compressed',
        'exe' => 'application/x-msdownload',
        'msi' => 'application/x-msdownload',
        'cab' => 'application/vnd.ms-cab-compressed',
        //audio/video
        'mp3' => 'audio/mpeg',
        'qt' => 'video/quicktime',
        'mov' => 'video/quicktime',
        'mpeg' => 'video/mpeg',
        'mpe' => 'video/mpeg',
        'mpg' => 'video/mpeg',
        'wav' => 'audio/wav',
        'aiff' => 'audio/aiff',
        'aif' => 'audio/aiff',
        'avi' => 'video/msvideo',
        'wmv' => 'video/x-ms-wmv',
        //adobe
        'pdf' => 'application/pdf',
        'psd' => 'image/vnd.adobe.photoshop',
        'ai' => 'application/postscript',
        'eps' => 'application/postscript',
        'ps' => 'application/postscript',
        //ms office
        'doc' => 'application/msword',
        'docx' => 'application/msword',
        'rtf' => 'application/rtf',
        'xls' => 'application/vnd.ms-excel',
        'ppt' => 'application/vnd.ms-powerpoint',
        //open office
        'odt' => 'application/vnd.oasis.opendocument.text',
        'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
        );
        
        //بررسی پسوند فایل
        $ext = strtolower(array_pop(explode('.', $file_name)));
        
        //برگردان نتیجه
        if (array_key_exists($ext, $mime_types)) {
            return $mime_types[$ext];
        }
        else {
            return 'application/octet-stream';
        }
}

//آدرس فایل شما
$file_name = 'file/phpbook.zip';

//خروجی
echo getMIMEType($file_name);
?>
این تابع اغلب فرمت های رایج را پوشش می دهد.

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


اگرچه کاربرد تابع mail در PHP بسیار ساده و آسان است اما این تابع تنها موارد اولیه را پوشش می دهد، به فرض امکان استفاده از پروتکل SMTP به صورت Authentication (بررسی اعتبار نام کاربری و کلمه عبور) وجود ندارد یا نمی توانیم سرور ارسال ایمیل را تغییر دهیم و محدودیت های دیگری از این دست، به همین دلایل برنامه نویسان و توسعه دهندگان PHP بسته ها و کلاس های دیگری برای مدیریت فرآیندهای مربوط به ارسال ایمیل نوشته اند که یکی از معروف ترین آنها کلاس PHPMailer است، علاوه بر کلاس PHPMailer بسته ایمیل PEAR نیز برای PHP وجود دارد که البته به دلیل قدرت و انعطاف پذیری کلاس PHPMailer کمتر مورد استفاده قرار می گیرد.
PHPMailer
برای شروع آموزش ارسال ایمیل با استفاده از کلاس PHPMailer ابتدا باید پکیج فایل های مرتبط با این کلاس را از لینک زیر دریافت کنیم:
https://github.com/PHPMailer/PHPMailer
در صورت مسدود بودن خدمات GitHub برای IP های ایران می توانید آخرین نسخه فعلی آن را از لینک زیر نیز دریافت کنید:
دانلود پکیج کلاس PHPMailer نسخه Stable 5.2 - حجم 211 کیلوبایت (آخرین به روزرسانی لینک در وبگو: 99/12/1)
این پکیج حاوی فایل ها و فولدرهای مختلفی است که شاید در نگاه اول کمی گیج کننده باشد، خوشبختانه برای ارسال ایمیل های متداول وجود چند فایل به شرح زیر برای اغلب موارد کفایت می کند و باقی سورس ها جنبه توسعه، سفارشی سازی، مثال یا موارد خاص دارند:
- PHPMailerAutoload.php
جهت مدیریت خودکار و افزودن فایل کلاس های مورد نیاز در هنگام ارسال ایمیل، در نسخه های جدید PHPMailer تنها include این فایل در کدهای برنامه و وجود دو فایل class.phpmailer.php و class.smtp.php در دایرکتوری پکیج اغلب نیازها را پوشش می دهد، وجود فایل PHPMailerAutoload.php در دایرکتوری پکیج الزامی نیست و می توانیم مستقیما فایل class.phpmailer.php را include کنیم.
- class.phpmailer.php
فایل اصلی کلاس PHPMailer که عمده وظایف فرایند ارسال ایمیل را بر عهده دارد، وجود این فایل در دایرکتوری پکیج الزامی است.
- class.smtp.php
کلاس تکمیلی برای فراهم سازی امکان استفاده از پروتکل SMTP جهت ارسال ایمیل، وجود این فایل در دایرکتوری پکیج برای کار با پروتکل SMTP الزامی است.
با این تفاسیر استفاده از کلاس PHPMailer ساده و آسان است، کافی است سه فایل بالا را در دایرکتوری داشته باشیم و مطابق الگوی زیر موارد مورد نیاز را با توجه به حساب ایمیلمان در سرور تنظیم کرده و کدها را اجرا کنیم:
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | ارسال ایمیل با کلاس PHPMailer</title>
<!-- Webgoo.ir -->
</head>
<body>
<?php
//فایل بارگذاری خودکار
require_once('PHPMailerAutoload.php');

//فراخوانی کلاس
$mail = new PHPMailer(true);

//استفاده از SMTP
$mail->IsSMTP();

try {
    //آدرس سرور ایمیل
    $mail->Host = "mail.example.com";
    
    //استفاده از پروتکل های رمزنگاری
    $mail->SMTPSecure   = 'ssl';
    
    //پورت ارسال ایمیل
    $mail->Port = 465;
    
    //استفاده از SMTP Authentication
    $mail->SMTPAuth = true;
    
    //نام کاربری و کلمه عبور حساب ایمیل
    $mail->Username   = "youraccount@example.com";
    $mail->Password   = "yourpassword";
    
    //افزودن قسمت پاسخ به ایمیل
    $mail->AddReplyTo('replyaccount@example.com', 'Reply Name');
    
    //تنظیم اطلاعات گیرنده ایمیل
    $mail->AddAddress('receiveraccount@example.com', 'Receiver Name');
    
    //تنظیم اطلاعات ارسال کننده ایمیل
    $mail->SetFrom('senderaccount@example.com', 'Sender Name');
    
    //موضوع ایمیل ارسالی
    $mail->Subject = 'PHPMailer Test';
    
    //متن برای کاربرانی که به دلایل فنی نمی توانند ایمیل را به درستی مشاهده کنند
    $mail->AltBody = 'برنامه شما از این ایمیل پشتیبانی نمی کند، برای مشاهده آن لطفا از برنامه دیگری استفاده نمائید';
    
    //یونیکد برای پشتیبانی از زبان فارسی
    $mail->CharSet = 'UTF-8';
    
    //امکان استفاده از تگ های HTML
    $mail->ContentType = 'text/html';
    
    //متن پیام به صورت HTML
    $mail->MsgHTML('<html><body>این یک <font color="#CC0000">تست</font> است!</body></html>');
    
    // ضمیمه کردن فایل به ایمیل
    //$mail->AddAttachment('path/to/file/phpbook.zip');
    
    //ارسال ایمیل
    $mail->Send();
    
    //چاپ نتیجه موفقیت آمیز
    echo "پیام با موفقیت ارسال شد\n";
} catch(phpmailerException $e) {
    //پیام خطا از PHPMailer
    echo $e->errorMessage();
} catch(Exception $e) {
    //سایر خطاها
    echo $e->getMessage();
}
?>
</body>
</html>
توضیح:
- همانطور که گفتیم ارسال ایمیل با PHPMailer خیلی سخت نیست، کافی است ابتدا فایل مدیریت خودکار کلاس های مورد نیاز برنامه یعنی PHPMailerAutoload.php را (با استفاده از require یا include) در صفحه وارد کنیم، سپس موارد مورد نیاز را مطابق با اطلاعات سرور و حساب ایمیلمان تنظیم نمائیم.
- در قسمت new PHPMailer کلاس اصلی برنامه را فراخوانی می کنیم تا در ادامه به متدهای آن دسترسی داشته و نهایتا ایمیل را ارسال کنیم.
- در قسمت IsSMTP مشخص می کنیم که می خواهیم از SMTP (یا از Sendmail) برای ارسال ایمیل استفاده کنیم و برای استفاده از این امکان باید آدرس میل سرور (Host)، نام کاربری (Username) و کلمه عبور (Password) را مطابق الگو تکمیل نمائیم، این اطلاعات و امکان ایجاد حساب کاربری جدید در قسمت ایمیل برنامه های مدیریت هاست مانند cPanel یا DirectAdmin وجود دارد و اغلب توسط شرکت های ارائه دهنده خدمات میزبانی وب نیز در بدو خرید پلن ها ارسال می شود.
- در صورت استفاده از پروتکل های امن مانند SSL یا TLS برای ارسال ایمیل در متد SMTPSecure مقادیر متناظر را تنظیم می کنیم همچنین پورت ارسال ایمیل در متد Port تنظیم  می شود که در حالت معمول یکی از مقادیر 25، 465 یا 587 است (این اطلاعات در قسمت مدیریت حساب های ایمیل برنامه کنترل پنل هاست موجود است).
نکته: اگر برای دامنه سایت گواهی های SSL رایگان نظیر Let's Encrypt فعال باشد باید از نسخه های به روز PHP (نسخه 5.6 به بعد) استفاده کنیم چون این گواهی در به روزرسانی های اخیر جهت پردازش نیاز به OpenSSL 1.1.0 دارد، در غیر اینصورت ممکن است خطای عدم اتصال به سرور ایمیل دریافت کنیم، به طور مثال:
smtp error: failed to connect to server: (0) smtp connect() failed
یا
smtp error: could not connect to smtp host
نتیجه اینکه ایمیل ها از PHPMailer ارسال نمی شوند.
- قسمت AltBody برای کاربرانی است که برنامه دریافت ایمیل آنها تنها از متن ساده پشتیبانی می کند و امکان مشاهده ایمیل های HTML را ندارند، با توجه به اینکه اغلب برنامه ها از ایمیل های HTML پشتیبانی می کنند تنظیم این قسمت اختیاری است.
- متدهای AddReplyTo، AddAddress، SetFrom برای تعیین آدرس دریافت کننده پاسخ به ایمیل، دریافت کننده ایمیل و ارسال کندده ایمیل است.
- متدهای CharSet و ContentType یونیکد و نوع محتوای ارسالی را مشخص می کنند که برای سازگاری با زبان فارسی از استاندارد UTF-8 و برای پشتیبانی از تگ های HTML از نوع محتوای text/html استفاده می کنیم.
- قسمت MsgHTML متن پیام به صورت HTML را در خود جای می دهد، این متن هم می تواند با فراخوانی یک فایل جانبی (با تابع file_get_contents) تکمیل شود یا اینکه به صورت مستقیم اطلاعات را وارد کنیم، به فرض در هنگام کار با فرم های وب می توانیم متن دریافتی از فیلدهای فرم را به متغیر نسبت داده و متغیر را به عنوان محتوای ایمیل ارسالی تنظیم کنیم.
- اگر نیاز به ضمیمه کردن فایل یا فایل هایی در ایمیل باشد می توانیم با متد AddAttachment (که در مثال بالا غیر فعال شده است)  این کار را انجام دهیم، ذکر این نکته ضروری است که فایل باید از قبل بر روی سرور قرار گرفته باشد و سپس آدرس آن به صورت داینامیک در این قسمت جایگزین شود که خود نیاز به کمی مهارت در برنامه نویسی PHP دارد.
- در نهایت نیز ایمیل با متد Send ارسال شده و با توجه به استفاده از try و catch در صورتی که خطایی رخ دهد در قسمت phpmailerException (اگر خطا از سمت کلاس PHPMailer باشد) یا در قسمت Exception (سایر خطاها) مدیریت می شود، استفاده از try و catch اختیاری است (مثال هایی در دایرکتوری examples پکیج PHPMailer وجود دارد که با و بدون استفاده از try و catch چگونگی ارسال ایمیل را نمایش می دهند).

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


با استفاده از کلاس PHPMailer می توانیم از سایر سرورهای SMTP که در آنها حساب کاربری داریم نیز برای ارسال ایمیل استفاده کنیم، البته در عمل سرویس های ایمیل معمولا پس از مدتی برخی از پورت های عمومی خود را محدود کرده یا تغییر می دهند با این وجود یکی از پرکاربردترین این نوع خدمات سرویس ایمیل سایت گوگل است که محدودیت های کمتری نسبت به سایر موارد مشابه دارد، البته در لحظه ای که آین آموزش نوشته می شود ظاهرا پورت 465 SSL آن برای برنامه های جانبی مسدود شده است و خطای Timeout می دهد اما پورت 587 TLS مشکلی ندارد و قابل استفاده است، در کنار این دو پورت امن پورت 25 نیز وجود دارد که نیازی به رمزنگاری ندارد و البته در حال حاضر پشتیبانی نمی شود، برای اینکه کد ارسال ایمیل از طریق گوگل در سرور به درستی کار کند بهتر است همه حالت های مختلف را تست و بررسی کنیم، ارسال ایمیل از این طریق محاسن و در عین حال معایبی دارد، بهترین مزیت آن این است که محدودیت برخی از هاست های اشتراکی را ندارد چون در بیشتر هاست ها برای ارسال ایمیل محدودیت هایی به صورت روزانه یا ساعتی قائل می شوند، ظاهرا و به گفته تیم پشتیبانی گوگل در سرویس پست الکترونیک این شرکت روزانه بالغ بر 2000 ایمیل از یک اکانت تجاری قابل ارسال است که این عدد برای حساب های غیرتجاری یا آزمایشی (Trial) به 500 ایمیل در روز کاهش پیدا می کند، اما معایب این سرویس این است که ممکن است از طرف گوگل پورت های آن مسدود شود یا بدون اطلاع قبلی تغییر پیدا کند و یا به IPهای برخی کشورها سرویس ارائه نکند و مواردی از این دست که این استقلال برنامه ما را تحت تاثیر قرار می دهد، به هر صورت تصمیم به استفاده یا عدم استفاده از این امکان را به عهده شما می گذاریم.
برای استفاده از SMTP گوگل برای ارسال ایمیل در PHP نمونه کد بالا را که مبتنی بر کلاس PHPMailer است به صورت زیر ویرایش می کنیم:
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | ارسال ایمیل با SMTP گوگل و کلاس PHPMailer</title>
<!-- Webgoo.ir -->
</head>
<body>
<?php
//فایل بارگذاری خودکار
require_once('PHPMailerAutoload.php');

//فراخوانی کلاس
$mail = new PHPMailer(true);

//استفاده از SMTP
$mail->IsSMTP();

try {
    //آدرس سرور ایمیل
    $mail->Host = "smtp.gmail.com";
    
    //استفاده از پروتکل های رمزنگاری
    $mail->SMTPSecure   = 'tls';
    
    //پورت ارسال ایمیل
    $mail->Port = 587;
    
    //استفاده از SMTP Authentication
    $mail->SMTPAuth = true;
    
    //نام کاربری و کلمه عبور حساب گوگل
    $mail->Username   = "youraccount@gmail.com";
    $mail->Password   = "yourpassword";
    
    //افزودن قسمت پاسخ به ایمیل
    $mail->AddReplyTo('replyaccount@example.com', 'Reply Name');
    
    //تنظیم اطلاعات گیرنده ایمیل
    $mail->AddAddress('receiveraccount@example.com', 'Receiver Name');
    
    //تنظیم اطلاعات ارسال کننده ایمیل
    $mail->SetFrom('senderaccount@example.com', 'Sender Name');
    
    //موضوع ایمیل ارسالی
    $mail->Subject = 'PHPMailer Test';
    
    //متن برای کاربرانی که به دلایل فنی نمی توانند ایمیل را به درستی مشاهده کنند
    $mail->AltBody = 'برنامه شما از این ایمیل پشتیبانی نمی کند، برای مشاهده آن لطفا از برنامه دیگری استفاده نمائید';
    
    //یونیکد برای پشتیبانی از زبان فارسی
    $mail->CharSet = 'UTF-8';
    
    //امکان استفاده از تگ های HTML
    $mail->ContentType = 'text/html';
    
    //متن پیام به صورت HTML
    $mail->MsgHTML('<html><body>این یک <font color="#CC0000">تست</font> است!</body></html>');
    
    // ضمیمه کردن فایل به ایمیل
    //$mail->AddAttachment('path/to/file/phpbook.zip');
    
    //ارسال ایمیل
    $mail->Send();
    
    //چاپ نتیجه موفقیت آمیز
    echo "پیام با موفقیت ارسال شد\n";
} catch(phpmailerException $e) {
    //پیام خطا از PHPMailer
    echo $e->errorMessage();
} catch(Exception $e) {
    //سایر خطاها
    echo $e->getMessage();
}
?>
</body>
</html>
ممکن است پس از اجرای کد برای اولین بار سرویس گوگل دسترسی برنامه را تا زمان دریافت مجوزهای لازم از صاحب حساب کاربری مسدود کند، بدین جهت اگر با خطای Authentication مواجه شدیم لازم است که به ایمیل خود مراجعه کرده و با پیروی از دستورالعمل پیام ارسالی از طرف گوگل مبنی بر تلاش برای استفاده از حساب کاربری ما در یک برنامه جانبی اجازه استفاده از حساب کاربریمان را به برنامه خود بدهیم و از نو آن را اجرا کنیم، توجه کنیم نباید به اشتباه بر روی لینک ها کلیک کنیم، در غیر این صورت ممکن است دسترسی برنامه به حساب گوگل مسدود شده و برای ارسال ایمیل از این طریق با مشکل مواجه شویم.

ارسال ایمیل در لوکال هاست و WampServer


برای ارسال ایمیل از طریق لوکال هاست و برنامه سرور محلی WampServer با استفاده از SMTP سرویس ایمیل گوگل GMail، ابتدا لازم است که آخرین نسخه WampServer را روی سیستم خود نصب کنیم، این برنامه از لینک زیر قابل دریافت است:
www.wampserver.com
پس از نصب برنامه به دلیل استفاده گوگل از پروتکل های امن و عدم پشتیبانی WampServer (به طور پیش فرض) از این امکان باید تغییراتی در فایل اصلی php.ini اعمال کنیم تا ایمیل ما از این طریق قابل ارسال باشد، لذا به دایرکتوری که برنامه را در آن نصب کرده ایم رفته و آدرس زیر را ادامه می دهیم تا به فایل php.ini برسیم:
\bin\apache\apache*.*.**\bin
در این فایل با استفاده از نت پد (Notepad) یا هر ویرایشگر متنی دیگری و با کمک قابلیت کلمه یاب یا Find به دنبال عبارت openssl می گردیم تا به خط مربوط به extension=php_openssl.dll برسیم، اگر در ابتدای این خط علامت ; بود آن را حذف، فایل خود را ذخیره کرده و برنامه WampServer را (اگر در حال اجرا بود) بسته و مجددا اجرا می کنیم یا می توانیم از امکان شروع مجدد آن استفاده کنیم، اکنون اگر تابع phpinfo را در یک فایل php خروجی بگیریم:
<?php
phpinfo();
?>
در قسمت Phar امکان OpenSSL Support باید فعال یا Enabled باشد در غیر این صورت در هنگام ارسال ایمیل از طریق PHPMailer و WampServer پیام زیر را دریافت خواهیم کرد:
Warning: stream_socket_enable_crypto() [streams.crypto]: this stream does not support SSL/crypto
در صورت فعال بودن OpenSSL و عدم دریافت خطا همه چیز آماده است تا از کلاس PHPMailer و SMTP گوگل استفاده کنیم.
در پایان مجددا یادآور می شویم که ممکن است برای اولین بار گوگل کد ما را مسدود کند تا زمانی که مجوز اجازه و دسترسی برنامه را از صاحب حساب دریافت کند، لذا اگر با این خطا در اکانت GMail خود مواجه شدیم باید از دستورالعمل های آن پیروی کرده و مجوز دسترسی به حسابمان را برای برنامه ارسال ایمیل فراهم کنیم.
دسته بندی: آموزش کاربردی » PHP
related مطالب بیشتر:
محدود کردن لینک دانلود مستقیم فایل ها با PHP و htaccess
تبدیل تاریخ میلادی، شمسی با مبدل JDF در PHP
نمایش آمار بازدیدها با PHP بدون استفاده از دیتابیس
نمایش قسمتی از متن و پاراگراف با PHP
ساخت منوی هوشمند با PHP و CSS
دیدگاه
more ۱۴۸ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
سینا
۱۹:۴۳ ۱۴۰۰/۱۲/۲۹
با سلام مجدد
ببخشید من طبق فرمایشات شما PHPMailer رو نصب کردم
طبق این تنظیمات و این اکستنشن
http://www.yiiframework.com/extension/smtp-mail
وقتی یه ایمیل باهاش ارسال می شه مشکلی نداره و ایمیل رو ارسال می کنه ولی وقتی تنظیم کردم بیشتر از یه دونه ایمیل ارسال کنم واسه جیمیل خودم هرچی ایمیل فرستادم میاد و واسه اونایی هم که ایمیل دادم آدرس to همه ایمیلهایی که براشون فرستادم رو به لیست می کنه یعنی میگه واسه اینا هم این ایمیل فرستاده شده! چرا باید ایمیلهایی که ارسال کردم یه نسخه از اون به ایمیل خودمم بیاد؟ و چرا باید توی to دریافت کننده همه ایمیل های دیگه رو هم لیست کنه؟ با swiftMailer این مشکل رو نداشتم فقط اونجا هرکاری کردم نتونستم باهاش smtp جیمیل رو فعال کنم!
قاعدتا تنظیمات کدهای شما دچار اشکالی است و احتمالا در حلقه آدرس ها مجدد و به اشتباه استفاده می شوند، در مجموع حل این مشکل نیاز به روئیت، خطایابی و اجرای کامل کدها در سرورتان دارد، همچنین دستورالعمل استفاده از PHPMailer با محتوای آدرسی که درج کرده اید متفاوت است و متدهای مجزایی دارد که در آموزش حاضر به همراه نمونه کد ذکر شده است.
سینا
۰۱:۵۷ ۱۴۰۰/۱۲/۲۹
با سلام و درود بر شما
سال نو شما مبارک
نوروزتون مبارک باشه
ببخشید من توی سایتم برای ارسال ایمیل از swiftMailer استفاده می کنم که با smtp هاستم می تونم باهاش ایمیل ارسال کنم هیچ وقت نتونستم با smtp جیمیل ارسال داشته باشم آیا با smtp جیمیل می شه ارسال داشت؟
'swiftMailer' => array(
'class' => 'ext.swiftMailer.SwiftMailer',
),
آدرس لینک دانلود و توضیحاتش اینجاست
https://www.yiiframework.com/extension/swiftmailer
هرکاری کردم درست نشده واسه ارسال هم از این تابع استفاده می کنم
حذف شد
آیا تنظیماتی چیزی باید اضافه کنم؟ چون ایمیل هاست اکثرا گیر میده میگن نباید زیاد استفاده کنید
با تشکر
متقابلا سال جدید و نوروز بر شما مبارک باد، در مورد سوال متاسفانه با این فریم ورک کار نکردیم و امکان نصبش هم به دلیل محدودیت های زمانی میسر نیست، در صورت تمایل می توانید در یک صفحه وب آزمایشی کدها را درج کنید و اطلاع دهید تا خطایابی و بررسی ها در سرورتان انجام شود، برای ارسال ایمیل به راحتی می توانید از کلاس PHPMailer استفاده کنید و صرف داشتن حساب ایمیل با اطلاعات نام کاربری و کلمه عبور SMTP سرور شما کفایت می کند، برای ارسال ایمیل با GMail هم پس از اولین اجرای کدها معمولا باید فرآیند اعطای مجوز به برنامه را از طریق ایمیلی که توسط گوگل به حساب شما ارسال می شود انجام دهید، در مجموع تقریبا همه چیز در آموزش حاضر گفته شده و بقیه موارد به بحث خطایابی حین اجرا مربوط می شود.
محمد بیگی
۱۹:۴۴ ۱۴۰۰/۱۲/۰۲
سلام وقت بخیر
بنده برای ارسال ایمیل انبوه دادم یک برنامه نویسی کدنویسی کرده و متاسفانه ناقص هست و بصورت خودکار ایمیل ارسال نمیشود و متاسفانه پاسخگو نیستن مشکل حل کنند ممنون میشم بنده راهنمایی فرمایید. برنامه نویسی به زبان PHP میباشد و فایل PHPMailerAutoload.php در سرور موجود نیست و کد نویسی این فایل داخل فایل PHPMailer پیدا نکردم. اگر راهی داره بنده راهنمایی فرمایید ممنون میشم.
بدون دیدن و بررسی سورس کدها نظر خاصی نمی شود داد، در صورت تمایل می توانید نمونه کدها را به آدرس ایمیل ما (موجود در بخش تماس) ارسال یا یک حساب موقت ایجاد کنید تا مشکل قابل بررسی باشد.
۱۵:۰۱ ۱۴۰۰/۱۱/۲۰
سلام دوباره مهندس میرزایی عزیز
تعداد ایمیل ارسالی با گوگل در روز ۵۰۰ تا هست تو گوگل سرچ کردم نوشته بود کدومش درسته ۵۰۰ تا یا ۲۰۰۰ تای شما ؟
مهندس میرزایی تعداد رو سایت گوگل زده ۵۰۰ عدد ارسال ایمیل یا ارسال یک ایمیل به ۵۰۰ نفر
فکر کنم ارسال از طریق smtp محدودیت ۱۰۰ تا در روز رو داره مهندس میرزایی لینک زیر رو یه نگاهی بندازید شما انگلیسی خوب بلد هستی به ما هم بگید درستش چند تا هست ؟
https://support.google.com/a/answer/166852?hl=en

https://www.roxo.ir/google-free-smtp-server
این سایت ایرانی هم گفته ۱۰۰ تا در روز همین درسته چون تو جدول سایت گوگل هم اومده
در جدول محدودیت های جیمیل حداکثر ایمیل قابل ارسال برای حساب های غیر آزمایشی 2000 در روز و برای حساب های آزمایشی 500 عدد در روز (per day) است، حال اینکه منظور گوگل از trial accounts چیست و شامل حساب های معمول جیمیل کاربران می شود یا خیر را باید دقیقتر بررسی کرد (برای اطمینان مبنا را همان 500 قرار دهید)، بحث SMTP در مورد تعداد دریافت کننده ها (Recipients) است که می تواند حداکثر 100 نفر برای هر ایمیل و مجموعا 10000 نفر در روز باشد، سایت Roxo به نظر در ترجمه دچار اشتباه شده است.
نکته: این محدودیت ها هر از چندگاهی از سمت گوگل ممکن است کم و زیاد شوند!
۱۴:۴۱ ۱۴۰۰/۱۱/۲۰
سلام مهندس میرزایی من ایمیل با گوگل میفرستم اوکی هست فقط یه سوال اگه بخوام بیشتر از ۲۰۰۰ ایمیل در روز بتونم استفاده کنم برای بخش های مختلف مثلا بخش فراموشی رمز یا ... باید برای یه بخش از سایت از یه اکانت جیمیل و برای بخش دیگه از اکانت جیمیل دیگه ای استفاده کنم درسته ؟ و اینکه بهترین انتخاب چیه بهتر از گوگل به لحاظ کمی و کیفی چه سرویس رایگانی هست ؟ روش شما چیه ؟
اگر بخواهید از گوگل استفاده کنید قاعدتا باید از محدودیت های آن پیروی کنید، در صورت لزوم می شود راه حل شما را اجرا یا سرویس هاست ایمیل خریداری کرد، همچنین اگر از VPS یا سرور اختصاصی استفاده کنید محدودیت های ایمیل خیلی کمتر خواهد بود.
۲۳:۵۴ ۱۴۰۰/۱۰/۰۱
سلام ممنون از سایت خوبتان
متاسفانه ایمیل های ارسالی اسپم شناسایی میشن واسه رفع این مشکل چیکار کنم
منظورم اینه که ایمیل ها از طرف ما میرن پوشه اسپم
لطفا عبارت "SPF" را در قسمت جستجوی سایت وارد کنید، یک راه حل ممکن که می تواند مشکل ارسال ایمیل به فولدر اسپم ها را تا حدود زیادی حل کند فعال سازی قابلیت SPF به خصوص در هاست های اشتراکی است، در صورتی که مشکل به صرف انجام این شیوه رفع نشود سایر مشکلات احتمالی که در قسمت تنظیمات ایمیل پنل هاست گزارش شده است را بررسی کنید، همچنین با جستجو در گوگل ببینید IP سرورتان در بلک لیست های ایمیل وجود دارد یا خیر و در صورت وجود IP را از لیست سیاه خارج کنید.
محمدجواد نورائی
۱۳:۳۰ ۱۴۰۰/۰۹/۱۹
سلام ممنون بابت آموزش هاتون من میخوام یه ایمیل محلی بسازم به صورتی که وقتی صفحه بالا میاد مخاطب پیامش رو بنویسه و وقتی روی دکمه ارسال کلیک میکنه پیام به ایمیل شخصی من ارسال بشه میشه کد این کار رو برام بنویسید ؟؟ پیشاپیش از محبت شما سپاسگزارم البته بسیار عجله دارم بابت این کد
متاسفانه خدمات پاسخگویی به مشکلات کاربران شامل کدنویسی اختصاصی نمی شود، آموزش های مربوطه از جمله "فرم تماس" و "ارسال ایمیل" در سایت وجود دارد که می توانید از مطلب حاضر و قسمت جستجو به آنها دسترسی داشته باشید، در صورتی که در ترکیب کدها و نحوه استفاده مشکلی دارید می توانید مطرح کنید تا راهنمایی کنیم.
۰۷:۱۳ ۱۴۰۰/۰۵/۲۶
سلام مجدد ارور هاست رو فعال کردم مشکل به خاطر اینکلود کردن کلاس ارسال ایمیل با حروف بزرگ بود که در اصل با حروف کوچک نوشته بودم سپاس
۱۱:۵۹ ۱۴۰۰/۰۵/۲۵
سلام خدمت مدیر محترم وبگو تو لوکال با کامپوزر نصب کردم phpmailer کار میکنه ولی تو هاست صفحه سفید میاد بعد از زدن دکمه ارسال علت چی میتونه باشه تشکر
خطایابی در PHP را با درج دستور زیر در ابتدای کدها فعال کنید:
error_reporting(-1);
همچنین خطاهای دریافتی از PHPMailer را در قسمت catch چاپ و بررسی کنید، ایراد می تواند از تنظیمات حساب ایمیل مانند نام کاربری و کلمه عبور، پورت اتصال و ...
mahdi
۱۸:۲۹ ۱۴۰۰/۰۳/۱۲
سلام استاد این تابع در لوکال هم ایمیل ارسال میکنه هم فایل ضمیمه ، البته زمپ رو یه سری تغییرات باید داد و حساب ایمیل خودمون هم یه گزینه داره که برای دسترسی راحت هست که باید فعالش کرد
function send($emailAddress, $subject, $content, $file){
$to = $emailAddress;
$from = ....;
$fromName = ....;
$subject = $subject;
$content = $content;
$headers = "From: $fromName <$from>";
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
$headers .= "\nMIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed;\n";
$headers .= " boundary=\"{$mime_boundary}\"";
$message = "--{$mime_boundary}\n" . "Content-Type: text/html; charset=\"UTF-8\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" . $content . "\n\n";
if(!empty($file)){
if(is_file($file)){
$message .= "--{$mime_boundary}\n";
$fp = fopen($file,"rb");
$data = fread($fp,filesize($file));
fclose($fp);
$data = chunk_split(base64_encode($data));
$message .= "Content-Type: application/octet-stream; name=\"".basename($file)."\"\n" .
"Content-Description: ".basename($file)."\n" .
"Content-Disposition: attachment;\n" . " filename=\"".basename($file)."\"; size=".filesize($file).";\n" .
"Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
}
}
$message .= "--{$mime_boundary}--";
$returnpath = "-f" . $from;
$mail = mail($to, $subject, $message, $headers, $returnpath);
echo $mail?"<h1>Sent!</h1>":"<h1>failed.</h1>";
}
این در سایت واقعی هم عمل میکنه ؟
و اینکه این موارد زیر رو که در phpMailer هستند رو میشه با تابع mail ایجاد کرد ؟
'Host'     => 'smtp.gmail.com',
'Username' => 'myEmail@gmail.com',
'Password' => 'myPassword',
که با smtp و ایمیل و پسورد بخوایم ارسال ایمیل رو داشته باشیم
هر جا دیدم میگفتن این امکان کلا وجود نداره و اینکه استاد در نهایت بنظر شما درگیرش نشم ؟ از همون phpmailer استفاده کنم؟
کد مبتنی بر تابع mail است و اگر تنظیمات سرور مشکلی نداشته باشد عمل می کند، بعضی از هاست ها ارسال ایمیل بدون اعتبارسنجی نام کاربری و کلمه عبور را مجاز نمی کنند، تابع mail یک روش دم دستی است و از تنظیمات پیش فرض سرور استفاده می کند، امکان تغییر تنظیمات یا استفاده از Authentication فراهم نیست:
https://www.php.net/manual/en/function.mail.php
به نظر از PHPMailer استفاده کنید بهتر است چون واقعا ایراد خاصی ندارد و سورس کدها هم با توضیحات مشخص است که چه کاری انجام می دهند.
mahdi
۱۳:۲۴ ۱۴۰۰/۰۳/۱۲
سلام وقت بخیر ، استاد عزیز اگر ما با تابع mail یه تابعی بنویسیم که در لوکال قابلیت ارسال هر نوع ایمیلی رو داشته باشه ، آیا همین تابع در یه سایت واقعی هم به همین صورت دقیق عمل میکنه یا کلا ارسال ایمیل در لوکال با سایت واقعی فرق داره و باید حتما از phpmailer استفاده کنیم؟
خیلی ممنون استاد عزیز
برای ارسال ایمیل با تابع mail در لوکال باید برنامه سرور مجازی امکان Mail Server را داشته باشد (تا آنجا که اطلاع داریم WampServer، XAMPP و... به صورت پیش فرض چنین قابلیتی ندارند) لذا در این موارد استفاده از یک SMTP Server خارجی گزینه بهتری است، نکته مهم دیگر در نظر گرفتن sendmail_path صحیح است که به صورت پیش فرض معمولا به شکل زیر باید باشد:
'/usr/sbin/sendmail'
اما به جهت اینکه ممکن است در تنظیمات php.ini آدرس دیگری تنظیم شده باشد باید با کد زیر هم دریافت و مقایسه شود:
ini_get('sendmail_path')
برای آشنایی بیشتر سورس کدهای فایل class.phpmailer.php را بررسی کنید.
به نظر طراحی کلاس ارسال ایمیل را جزء موارد کم اولویت بعدی قرار دهید بهتر است، با وجود PHPMailer که سازگار و سبک است و اینکه ارسال ایمیل صرفا یک کار مجزا از پروژه اصلی است و می شود کدها را کاملا جدا از پروژه اصلی به برنامه متصل و استفاده کرد خیلی وقت صرف نوشتن کلاس جدید نکنید شاید بهتر باشد مگر اینکه قابلیت های خاص دیگری مد نظر داشته باشید.
hamidReza
۱۶:۱۶ ۱۴۰۰/۰۲/۰۲
سلام
ممنون بابت آموزش مفیدتون در مورد آیکن ایمیل سوالی داشتم
چون این ایمیل از طریق کدهای نوشته شده در سایت ارسال میشه، چطور میتونم آیکن اون رو در اینباکس ایمیل تغییر بدم؟
آیا امکان پذیر هست؟
منظورتان از آیکن تصویری در متن ایمیل است؟ در اینصورت باید سورس کد برنامه ارسال ایمیل را ویرایش و آیکن شخصی را جایگزین کنیم، اگر یک اسکرین شات از جزئیات آیکن مربوطه ارسال کنید بهتر می توانیم راهنمایی کنیم.
حسین
۱۳:۵۸ ۱۳۹۹/۰۶/۱۰
سلام بر شما و با تشکر از سایت خوبتون.
من ابتدا با تابع mail پیش رفتم و یک if ایجاد کردم که اگر ایمیل با موفقیت ارسال شد پیام موفقیت رو بده. همینطور هم شد و پیام موفقیت رو داد. اما هیچ ایمیلی ارسال نشد.
با کلاس php mailer هم امتحان کردم اما موقع ارسال ایمیل ارور میده که:
SMTP Error: Could not authenticate.
لطفا راهنمایی کنید.
با تشکر
ارسال ایمیل با تابع mail توصیه نمی شود، اما برای اینکه بتوانید از کلاس PHPMailer به راحتی استفاده کنید باید ابتدا تنظیمات مورد نیاز اکانت ایمیلتان رادر سرور داشته باشید، این تنظیمات معمولا در کنترل پنل هاست سایت (برنامه های cPanel، DirectAdmin و...) قسمت ایمیل ها در دسترس است و شامل نام کاربری (معمولا آدرس ایمیل)، کلمه عبوری که هنگام ساخت نام کاربری در نظر گرفته اید، آدرس سرور ایمیل به فرض mail.example.com و مقادیر مربوط به پورت های ورودی و خروجی است که در دو حالت SSL و غیر امن معمولا متفاوت هستند، این اطلاعات را باید در کلاس PHPMailer مطابق نمونه تنظیم کنیم تا امکان اتصال به سرور SMTP سایت وجود داشته باشد در غیر اینصورت خطای بالا که مربوط به عدم شناسایی اطلاعات ورود به حساب ایمیل است دریافت خواهیم کرد.
نکته: برای اطمینان از عملکرد صحیح سرور ایمیل می توانیم از برنامه هایی مانند Outlook نیز جهت تست استفاده کنیم.
یه سوال کننده
۰۳:۲۳ ۱۳۹۸/۰۸/۲۴
سلام. ببخشید چطور میشه ایمیل هایی رو میفرستن که ریپلای زدن رو ایمیلی که از طرف ما نبوده بیشتر تو تبلیغات دیدم امیدوارم منظورم و متوجه شده باشید.
یعنی یه ایمیلی میفرستن که انگار اول ما ایمیل زدیم بعد جواب دادن به ایمیل ما درصورتی که ایمیلی نزدیم
ساده ترین روش ممکن در این موارد درج قسمت Subject (عنوان یا موضوع پیام) با پیشوند
Re:
است، به فرض:
Re: Your Subject
همچنین تنظیم آدرس مخاطب در پارامتر Reply-To (سربرگ های ایمیل) که در آموزش حاضر نمونه کدهای آن درج شده است.
برای افزودن متن ایمیل قبلی که به آن پاسخ داده شده نیز می توان از فرمت زیر در قسمت Body پیام استفاده کرد:
-------- Original Message --------
From: Test <test@example.com>
Sent: Tuesday, October 16, 2019 9:40 AM
To: Test <test@example.com>
Subject: Test

this is a test!
صبا
۰۲:۰۰ ۱۳۹۸/۰۵/۰۷
سلام ممنون از اموزش مفیدتون.
من یک سوال داشتم. اگر لوکال هاست ما روی پورت دیگری باشد مثلا 74 باید چه تنطیماتی انجام داد؟ من با زمپ کار میکنم. روی سیستمی که پورت پیشفرض 80 بود تنظیمات اعمال کردم و درست بود اما روی سیستم دیگر که به اجبار روی پورت 74 است باید چه تنظیماتی انجام دهم؟
ببخشید سوال دیگر هم داشتم از نظر شما بهترین تابع برای استفاده از ارسال ایمیل کدام است. من از تابع mail استفاده میکنم از نظر امنیت و کارایی نیازی به تغییر هست؟
با تشکر.
برای تغییر پورت پیش فرض تایع mail در PHP باید به فایل php.ini دسترسی داشته و با ویرایش این فایل مقادیر پورت را تغییر دهید:
https://www.quackit.com/php/tutorial/php_mail_configuration.cfm
این فایل معمولا در دایرکتوری های محل نصب برنامه سرور مجازی قرار دارد، در کل پیشنهاد ما استفاده از کلاس PHPMailer است.
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
4 × 6
20 × 20
=