امروز چهارشنبه ۱۴۰۰/۰۱/۲۵

2021/04/14 GMT +4: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 است (این اطلاعات نیز در قسمت حساب های ایمیل برنامه مدیریت کنترل پنل هاست موجود است).
- قسمت 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 ایمیل از یک اکانت قابل ارسال است، اما معایب این سرویس این است که ممکن است از طرف گوگل پورت های آن مسدود شود یا بدون اطلاع قبلی تغییر پیدا کند و یا به 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 بدون استفاده از دیتابیس
» نحوه نمایش متن و تصاویر اتفاقی در PHP و MySQL
» آموزش ساخت نقشه XML سایت (Sitemap) با PHP و MySQL
» ساخت فید خوان آر اس اس (RSS Feed Reader) با PHP
» ساخت منوی هوشمند با PHP و CSS
commentنظرات (۱۲۱ یادداشت برای این مطلب ارسال شده است)
more یادداشت های جدید بر اساس تاریخ ارسال در انتهای یادداشت های موجود نمایش داده می شوند.
نویسنده: سمیه
۱۰:۱۷ ۱۳۹۱/۰۵/۰۹
سلام بر مدیر سایت
آموزش های css و php خیلی ساده و روان توضیح دادین مرسی من از سایت شما خیلی راضی هستم.
پاسخ: 
سلام
نظر لطف شماست.
نویسنده: محمد
۱۰:۴۱ ۱۳۹۱/۰۵/۱۱
خیلی ممنون از راهنمایی و کمکتون
نویسنده: mahsa
۱۹:۲۹ ۱۳۹۱/۰۵/۱۱
سلام
تشکر از توضیحاتتون. من در هنگام استفاده از کلاس phpmailer به یه مشکل برخوردم. اگه <title> یه عنوان فارسی باشه، تمام متن های فارسی مثل "پیام با موفقیت ارسال شد" رو به شکل مربع مربع مینویسه. در هنگام ارسال ایمیل هم همین مشکل در Subject و Body پیش میاد (کد CharSet رو هم مینویسم ولی باز فایده نداره)
پاسخ: 
سلام
ابتدا دقت کنید که قسمت charset دقیقا به همان صورت که در مثال آمده، بدون فاصله خالی یا علامت "" به جای '' باشد و بعد از قسمت new PHPMailer درج گردد نه قبل از آن، سپس در مرورگر دیگری ایمیل خود را ارسال کنید، اگر مشکل حل نشد، فایل class.phpmailer.php را در یک ویرایگشر php باز کنید و در خط 56 مقادیر public $CharSet را برابر utf-8 قرار دهید.
نویسنده: جواد
۰۰:۴۷ ۱۳۹۱/۰۵/۱۲
با سلام
ممنون از مطالب واقعا مفیدتون.ولی من به یه مشکلی برخوردم چرا هرچی ایمیل میفرستم متنی که دریافت میشه چه به صورت فارس باشه یا انگلیسی همش مربع مربع دریافت میشه.این تنظیماتیم که گفتین انجام دادم رفتم خط 56 تغییر دادم تازه خط 62 هم تغییر دادم ولی باز نشد ممنون میشم اگه راهنماییم کنی.
پاسخ: 
سلام
این پارامتر را به ایمیل خود اضافه کنید:
$mail->Encoding = 'base64';
اگر مشکل حل نشد، تابع زیر یا تابع درونی utf8_encode را هم امتحان کنید:
<?php
function change_to_utf8($str){
$str = mb_convert_encoding($str, "UTF-8");
return $str;
}
?>
اگر همچنان مشکل وجود داشت، در خط 69 به جای 8bit از مقادیر دیگر مثل base64 7bit و... استفاده کنید.
یک راه حل پیشنهادی دیگر استفاده از روش زیر است:
$MsgHTML = 'متن ایمیل و...';
$maile->MsgHTML = "=?UTF-8?B?".base64_encode($MsgHTML)."?=";
به این طریق مقادیر به صورت utf-8 اینکد می شوند.
ظاهرا این مشکل تنها در برخی سرورها به وجود می آید.
نویسنده: جواد
۱۶:۴۴ ۱۳۹۱/۰۵/۱۲
راه حل آخری که نفهمیدم منظورتون چیه ولی راه حل های دگتونو چک کردم ولی باز ایمیل دریافتی فارسی پوشش نمیده.
این فایل mail منه:
$mail->CharSet = "UTF-8"; // يونيکد براي زبان فارسي
$mail->ContentType = "text/html"; // استفاده از html
$mail->Encoding = 'base64';
$mail->MsgHTML(change_to_utf8('سلام'));
/*$mail->MsgHTML('<html>
<body>
سلام
</body>
</html>'); // متن پيام به صورت html*/
اینم فایل class.phpmailer منه:
 public $CharSet           = 'UTF-8';
public $ContentType = 'text/html';
public $Encoding = 'base64 7bit';
پاسخ: 
قسمت زیر را اصلاح کنید:
$mail->CharSet = "UTF-8";
به این شکل:
$mail->CharSet = 'UTF-8';
نکته دوم اینکه راه حل ها را با هم استفاده نکنید، وقتی از Encoding base64 استفاده می کنید، دیگر از تابع change_to_utf8 استفاده نکنید و همین طور برای سایر راه حل هایی که ذکر شد، قسمت آخر در واقع ابتدا متن پیام را در یک متغیر فرضی قرار می دهیم و هنگام استفاده از maile->MsgHTML آن را به صورتی که نوشته ایم فراخوانی می کنیم تا متن بر اساس یونیکد uftf-8 ارسال شود، و نکته آخر اینکه base64 7bit را با هم استفاده نکنید، بلکه base64 یا 7bit را امتحان کنید.
ظاهرا کلاس phpmailer نسخه فعلی که جدید ترین آن است، با برخی سرورها در هنگام کار با یونیکد utf-8 مشکلاتی دارد، البته ما نیز از همین کد در پروژه های خود استفاده می کنیم و به چنین مشکلاتی برنخورده ایم، شاید لازم باشد تنظیمات PHP سرور خود را هم در مورد پشتیبانی از یونیکدها بررسی کنید.
نسخه قدیمی تر این کلاس را از اینجا می توانید دریافت و امتحان کنید:
phpmailer.worxware.com
نویسنده: جواد
۱۴:۰۷ ۱۳۹۱/۰۵/۱۳
با سلام
اول ازتون خیلی تشکر میکنم که پاسخگوی سوالات هستید.
بعد خواستم بگم تو کپی کردن علامت های اسلش بعد از ارسال نظرات به این صورت در اومده،ولی به یه نکته جدید بر خودم چرا تو تابع میل این کد:
$mail->MsgHTML('<html>
<body>
اين يک <font color="#CC0000">تست</font> است!
</body>
</html>');
مینویسم موقع دریافت ایمیل حروف ناخواناست ولی موقعی که تو تابع میل از:
$mail->MsgHTML(file_get_contents('contents.html'))
استفاده میکنم ایمیل دریافتیم درست دریافت میشه و قشنگ فارسی مینویسه، کد 'contents.html بررسی کردم دقیقا همون کدیه که در بالا توی تابع میلم نوشتم.
پاسخ: 
سلام
خواهش می کنیم، هدف ما حل مشکل شما و کمک به سایر کاربرانی است که ممکن است با این مورد مواجه شده باشند.
به احتمال زیاد به دلیل وجود Byte Order Mark یا BOM در فایل contents.html است، زمانی که فایل های خود را در ویرایشگر، ویراش و ذخیره می کنید، معمولا کارکترهایی نامرئی برای شناسایی یونیکد به آنها اضافه می شود، نظیر یونیکد در برنامه notepad ویندوز، برخی از برنامه ها نیز قابلیت افزودن یا حذف این کاراکترهای نامرئی را در هنگام ذخیره سازی به کاربر می دهند مانند Adobe Dreamweaver، به هر صورت خوشحالیم که مشکل به هر طریق حل شد، با این حال روش زیر را هم امتحان کنید که بر مبنای BOM برای یونیکد utf-8 است:
$email_body = chr(239) . chr(187) . chr(191) .'<html>
<body>
اين يک <font color="#CC0000">تست</font> است!
</body>
</html>';
$mail->MsgHTML("$email_body");
نویسنده: mahsa
۱۷:۲۹ ۱۳۹۱/۰۵/۳۰
سلام
ببخشید یه سوال از نرم افزار ومپ سرور ورژن 2.2e داشتم. این نرم افزار بعد از مدتی دیگه هم در ویندوز سون و هم اکسپی رفرش نمیشه و باید نرم افزار رو بعد از هر تغییرات در کدها، ریست کنم تا تغییرات اعمال بشه. کار خاصی باید بکنم که درست بشه یا کلاً مشکلات اینجوری هست؟
پاسخ: 
سلام
در حالت عادی wampserver نباید این مشکل را داشته باشد، احتمال اینکه مشکل از cache شدن صفحه در مرورگر باشد زیاد است، برای اطمینان، از مرورگر دیگری استفاده کنید، اگر باز مشکل مشاهده شد باید تنظیمات mod_cache را در آدرس زیر بررسی کنید:
bin\apache\apache*.*.*\conf\httpd.conf
با استفاده از قابلیت find در یک ویرایشگر متنی به دنبال عبارت mod_cache بگردید، اگر مقابل عبارت زیر علامت # قرار نداشت، یعنی mod_cache فعال است و ممکن است ایجاد مشکل کرده باشد:
LoadModule cache_module modules/mod_cache.so
لذا علامت # را در ابتدای آن اضافه کرده و wampserver را از نو اجرا کنید.
نویسنده: رضا
۱۱:۰۱ ۱۳۹۱/۰۶/۱۱
وااااااااااااااااقعا عالی از ته دلم میگم
ای ول
باور کن بزرگترین کمک رو بهم کردی با این آموزشی که گذاشتین
ممنون
پاسخ: 
خواهش می کنیم؛ از اینکه آموزش مفید بوده خوشحالیم.
نویسنده: سعید
۰۸:۳۶ ۱۳۹۱/۰۷/۱۹
با سلام و عرض ادب و تشکر
من می خواستم از سرویس گوگل برای ارسال ایمیل استفاده کنم ولی با هر دو پورت 25 و 578 ارور authentication میده.
ممنون میشم راهنمایی ام کنید
پاسخ: 
سلام
مثالی که در آموزش قرار داده ایم را مجددا امتحان کردیم، ایمیل بدون مشکلی ارسال شد! لذا پورت 587 گوگل فعال است، امکان دارد گوگل از شما تقاضای تایید دسترسی داشته باشد، باید به ایمیل خود مراجعه کنید و ببینید آیا پیامی از طرف گوگل دریافت کرده اید، اگر این طور نبود، نام کاربری و کلمه عبور خود را بررسی و از صحیح بودن آن اطمینان حاصل کنید، در ضمن دقت کنید ارسال ایمیل باید از سرور هاست شما انجام شود، در لوکال هاست نیاز به ایجاد تغییراتی در فایل php.ini است که در آموزش در مورد wampserver توضیح داده ایم، همچنین می توانید برای بررسی دقیق تر خطای دریافتی، پارامتر زیر را به کد اضافه کنید (در قسمت پارامترها):
$mail->SMTPDebug  = 2;
نویسنده: blue
۲۳:۲۹ ۱۳۹۱/۰۸/۰۵
با سلام براي من اين ارور رو ميده. خيلي گشتم ولي نمي تونم حلش كنم. لطفا كمكم كنيد
Message was not sent 
PHP Mailer Error: The following From address failed: m.abdollahi58@gmail.com
پاسخ: 
سلام
این مشکل ممکن است دلایل متفاوتی داشته باشد، از پارامتر زیر استفاده کنید تا جزئیات بیشتری از خطای دریافتی را مشاهده کنید:
$mail->SMTPDebug = 2;
دلیل دیگر هم ممکن است مربوط به فعال نبودن extension = php_openssl.dll در سرور یا لوکال هاست باشد، برای راهنمایی دقیق تر لطفا اطلاعات بیشتری از نوع سرور یا احیانا لوکال هاست خود ارائه دهید.
نویسنده: blue
۰۰:۴۳ ۱۳۹۱/۰۸/۰۶
حلش كردم. به جاي اس اس ال ، تي ال اس رو نوشتم.
پاسخ: 
همان طور که در آموزش ذکر شده باید از پورت 587 TLS استفاده کنید، به هر صورت خوشحالیم که مشکل حل شد.
نویسنده: حامد
۲۳:۰۳ ۱۳۹۱/۰۸/۰۸
راه حل ارور authentication با گوگل حل شدنی نیست. من یه ماهه تلاش می کنم نمیشه.
یاهو ام زیاد محدودیت نداره نسبت به گوگل. امتحانش ضرر نداره.
اگه از smtp یاهو استفاده کنین اصلا ارور نمیده. خیلی هم راحته. فقط آدرس سرور رو به smtp.mail.yahoo.com
و پورت اون ssl 465 هستش. بقیه تغییراتم از قبیل آی دی و پسورد یاهو فراموش نشه. راستی از پورت tls برای یاهو استفاده نکنین.
موفق باشین.
پاسخ: 
سلام
ممنون از طلاعات خیلی مفیدتان، البته smtp گوگل تست شده و اگر مراحل را درست انجام دهید، مشکلی برای ارسال ایمیل وجود ندارد.
نویسنده: مهسا
۱۱:۳۱ ۱۳۹۱/۰۸/۳۰
سلام. ممنون از این که با حوصله به پرسش ها پاسخ میدید.
آیا برای استفاده از تابع mail در صفحات html به DB نیاز هست یا نه؟
پاسخ: 
سلام
تابع mail یکی از توابع درونی php است و لذا تنها در صفحات php (فایل های با فرمت php) قابل استفاده است، برای استفاده از آن نیازی به دیتابیس نیست مگر اینکه بخواهید اطلاعات موجود در پایگاه داده را ایمیل کنید که خود یک مبحث جدا است.
نویسنده: مریم
۱۵:۴۵ ۱۳۹۱/۱۰/۰۹
سلام
من از کد شما استفاده کردم ولی ارور authentication میده
SMTP -> ERROR: Password not accepted from server: 535-5.7.1 Username and Password not accepted. Learn more at 535 5.7.1 http://support.google.com/mail/bin/answer.py?answer=14257 ew4sm59221205wid.11 
SMTP Error: Could not authenticate.
برای من ایمیلی ارسال شد که تلاشی برای استفاده از ایمیل شما بوده پسورد رو تغییر بدبد .
چطور می تونم این ارور رو بر طرف کنم
پاسخ: 
سلام
در انتهای ایمیل ارسال شده توسط گوگل باید قسمتی وجود داشته باشد مبنی بر اینکه اگر این خود شما بوده اید، برای دادن مجوز دسترسی به برنامه، از دستورالعمل لینک پیروی کنید.
If this was you, and you want to give this application access to your account, complete the troubleshooting steps listed at http://support.google.com/mail?p=client_login
1- از طریق آدرس http://mail.google.com/mail وارد حساب ایمیل خود شوید (در صورت مشاهده رمز Captcha آن را نیز وارد کنید).
2- سپس مرورگر خود را بسته و مجددا وارد حساب کاربری ایمیل شوید.
3- اگر مجددا مشکلی بود از طریق لینک http://www.google.com/accounts/DisplayUnlockCaptcha وارد حساب خود شوید.
4- بر روی Continue کلیک کنید.
5- اکنون باید بتوانید از طریق smtp گوگل ایمیل ارسال کنید.
نویسنده: سعيد كرمي
۲۰:۱۴ ۱۳۹۱/۱۱/۲۶
سلام. واقعا از ته دل ميگم خسته نباشي. سايتت بسيار عالي و روانه. آموزش هات كامله. من براي اولين بار براي سايتي نظر ميزارم چون سايتي نديدم كه ارزش نظر دادن داشته باشه. واقعا خوبه. به قدري كه ارزش داره براي كدهاي كاربرديت حتي مبلغ تعيين كني تا كمي از زحماتت جبران شه. مثلا بابت هر لينك آموزش 200 تومن. البته ارزشش خيلي بيشتر اين مبلغ فقط پول چاييته. البته اين يه پيشنهاده. و اميدوارم جسارت و دخالت بنده رو ببخشيد. در ضمن جاي كدهاي Asp.net خاليه. در ضمن كدهاي كاربردي رو بيشتر كنيد. در ضمن من چطور ميتونم يه كد بنويسم كه تاريخ و ساعت رو از سرور بگيره و در سايت نشون بده.
و سوال آخر كد هاي امنيتي در سايت به چه دردي ميخوره. منظورم همين كدهايي كه بعضي موقع در سايتها طوري مينويسن كه خونده هم نميشه و شما هم اون رو به صورت سوال و جواب در پايان ايميل گذاشتي
خيلي خيلي خيلي ممنون
پاسخ: 
سلام
خیلی ممنون از نظر لطف و پیشنهادات خوب شما، البته تلاش ما این است که مطالب، در عین حفظ کیفیت آموزش ها، بدون محدودیت های دست و پا گیر و رایگان منتشر شوند، در مورد ASP.NET فعلا این امکان وجود ندارد، در رابطه با نمایش تاریخ مطلبی در سایت و در آموزش های کاربردی php (تحت عنوان تبدیل تاریخ میلادی به شمسی) وجود دارد، کافی است عبارت "تاریخ" را در قسمت جستجو وارد کنید.
در رابطه با سوال آخر و اینکه کدهای امنیتی چه کاربردی دارند، دلیل استفاده از این کدها جلوگیری از ارسال هرزنامه توسط برنامه های خزنده است، توضیح اینکه افراد مختلف با انگیزه های متفاوت اقدام به ایجاد برنامه هایی می کنند که در سایت ها و وبلاگ های مختلف به دنبال فرم های ارسال نظر (یا هر فرم دیگری) می گردنند و در صورت پیدا کردن، موارد را به صورت فرضی یا تبلیغاتی پر کرده و ارسال می کنند! برای جلوگیری از این نوع برنامه ها از کدهای امنیتی استفاده می شود.
more لطفا پیش از ارسال یادداشت نکات زیر را مد نظر داشته باشید:
- موارد غیرمرتبط با مباحث آموزش ها را در فرم منوی "تماس با ما" مطرح و پاسخ را از طریق ایمیل دریافت کنید.
- به سوالات کلی، مبهم و مشکلاتی که تلاشی برای رفع آن نکرده باشید پاسخ مختصر داده خواهد شد.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین قرار دهید تا امکان تست و بررسی وجود داشته باشد.
- از درج عناوین تبلیغاتی در فیلدها خودداری کنید، در صورتی که یادداشت تبلیغاتی تشخیص داده شود حذف خواهد شد.
- تمام یادداشت ها بررسی و زمانی جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد خودداری کنید.





4 × 5
 refresh

آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
form شریفی
در:
سلام مجدد. من یه سوال خیلی تخصصی دارم. ممنون میشم پاسخ بدین. برای پروژه پایان نامه. دارم روی موتورهای جستجوگر تحقیق میکنم. فرض...
۱۴۰۰/۰۱/۲۵

form شریفی
در:
سلام استاد. من از متد file_get_contents استفاده می کنم برای دریافت اطلاعات از سایت های مختلف. بعضی وقتها سایت ها دیر لود میشه. آیا...
۱۴۰۰/۰۱/۲۵

form hh
در:
سلام خدمت شما بنده یه سوال داشتم تمام مراحل شما رو انجام دادم و نتیجه گرفتم و لازمه یه تشکرم بکنم. وبسایت من،...
۱۴۰۰/۰۱/۲۵

form erfan
در:
سلام من واسه یه دکمه یه محتوایی تعریف کردم که وقتی کلیک شد محتوا رو نشون بده اما تو دوجاش موندم یک اینکه چیکار کنم...
۱۴۰۰/۰۱/۲۱

form mahdi
در:
سلام استاد عزیز ، بازم معذرت میخوام سوالام زیاد شد ولی همشون در یک موضوع هستن ، تونستم که با این روش برای هر اسلایدر...
۱۴۰۰/۰۱/۱۸

form mahdi
در:
سلام استاد عزیز عذر میخوام بار سومه پیام میزارم ، مشکلش از ست اینترول بود که قطع نمیشد و با هم تداخل داشتند ولی بدون...
۱۴۰۰/۰۱/۱۸

form mahdi
در:
سلام وقت بخیر استاد عزیز ، یک تابع رو چطور میشه در جاوا اسکریپت اورراید کرد؟ که مثلا با هر فراخوانی مجدد ، قبلی ها...
۱۴۰۰/۰۱/۱۸

form متین
در:
سلام چجوری برای خود صفحه ادرس بسازیم که سایتی که رو ساختیم رو با دستگاه دیگه پیداش کنیم
۱۴۰۰/۰۱/۱۶

form امیرحسین برزویی
در:
من یک وبلاگ دارم و 9 سالمه من در وبلاگم مداحی می گذارم ولی وقتی قاب گذاشتم از این سایت من دیگه فیلم...
۱۴۰۰/۰۱/۱۶

form بنده خدا
در:
سلام خسته نباشین، خدا قوت. یه سوال دارم. چرا در بخش نظردهی وبلاگ به جای عنوان پست می نویسه مطلب مورد نظر یافت نشد؟!...
۱۴۰۰/۰۱/۱۵

form روح الله
در:
موقعی میخواهم وارد سایت ایران خودرو بشم پیام میده از Ip داخلی استفاده کنید دلیلش چیست
۱۴۰۰/۰۱/۱۴

form غریب
در:
تشکر از شما مشکلم حل شد امیدوارم موفق و پیروز باشید هر جا که هستید
۱۴۰۰/۰۱/۱۱

form غریب
در:
سلام مجدد ممنون و تشکر از کمکتون کد به خوبی کار میکنه اما همچنان من مشکلی دارم که حل نتونستم کنم...
۱۴۰۰/۰۱/۱۰

form غریب
در:
سلام مجدد این کدی که دادید خوب هست ولی من بد و ناقص توضیح دادم توجه کنید کد این هست تقریبا ممنون...
۱۴۰۰/۰۱/۱۰

form غریب
در:
سلام خسته نباشید من کدی دارم که میخوام داخل یه بخشیش نتیجه یه رویداد رو فراخوانی کنم و راهش و نمیدونم اگر میشه کمک...
۱۴۰۰/۰۱/۱۰

form محسن
در:
سلام ، سوال من مربوط به پنل کارگزاری هاست ، وقتی اسم یک سهم (نماد) را در قسمت جست و جو سرچ میکنم...
۱۴۰۰/۰۱/۰۸

form ترجمه
در:
باسلام همه صفحات من دارای دو url می باشد که یکی با حروف کوچک است و دیگری با حروف بزرگ چجوری این مشکل را...
۱۴۰۰/۰۱/۰۸

form سهیل ملکی
در:
سلام خسته نباشید ببخشید من میخوام از تابع navigator.online توی جاوا اسکریپت استفاده کنم تا باهاش بفهمم کاربر آنلاین هست یا نه و اگه بود...
۱۴۰۰/۰۱/۰۴

form Rabbiten
در:
سلام. من چند ماه است که دنبال کد استایل تصویر مثل تبلیغات بالای سایت شما هستم. اما هیچ جا پیدایش نمی کنم. لطف می...
۱۴۰۰/۰۱/۰۱

form mahdi
در:
سلام استاد عزیز سال نو رو تبریک میگم بهتون ، امیدوارم که خودتون و خانوادتون همیشه سالم و سلامت باشید و امسال پر از...
۱۳۹۹/۱۲/۳۰

form korosh abbasy
در:
سلام وقت بخیر ببخشید در مورد این مطلب سوالی پرسیدم شما در مورد output buffering توضیح دادید کد کار نمیکنه میخواستم ببینم نیازی هست من...
۱۳۹۹/۱۲/۲۹

form احمد
در:
سلام مجدد عذرخواهی میکنم یه موردی دیگه بود فراموش کردم در مورد سوال هدر بگم اینکه روی لوکال به هدر ارسال میشه ولی روی هاست...
۱۳۹۹/۱۲/۲۸

form احمد
در:
با سلام خسته نباشید ببخشید قبلا یه سری دستورات جی کوری رو از خودتون گرفتم وقتی فیلدهای فرمم تکمیل شده است توسط هدر بره به...
۱۳۹۹/۱۲/۲۸

form korosh abbasy
در:
سلام دم شما گرم این دستور برای خوندن فایل هم استفاده میشه؟ من میخوام دسترسی تعیین کنم که اگر یک متغییر true...
۱۳۹۹/۱۲/۲۷

form احمد
در:
با سلام و خسته نباشید ببخشید داخل جیکوری یدونه متغییر دارم الان میخوام همین متغییر رو با یه عدد دیگه جمع کنم ولی وقتی علامت...
۱۳۹۹/۱۲/۲۶
  در انتظار بررسی: ۱
 پاسخگویی به سوالات ممکن است تا 24 ساعت زمان ببرد.