آگهی
article

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

php-mail-class

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

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


برای ارسال ایمیل در php روش های مختلفی وجود دارد، ساده ترین راه،  ارسال ایمیل با استفاده از تابع درونی و از پیش تعریف شده ()mail و SMTP بدون بررسی نام کاربری و رمز عبور (authentication) است، معمولا، کافی است این تابع را با چند آرگومان فراخوانی کنید تا ایمیل شما ارسال شود، به طور مثال:
<?php
//دریافت کننده ایمیل
$to = "username@example.com";
//موضوع ایمیل
$subject = "ایمیل ساده";
//متن پیام
$body = "سلام، \n\n این ایمیل جهت تست ارسال شده است!";
//سربرگ های اضافه
$headers = "From: yourname@example.com";
//فراخوانی تابع و ارسال ایمیل
if (mail($to, $subject, $body, $headers)) {
    echo("<p>ایمیل شما با موفقیت ارسال شد</p>");
    }
else {
    echo("<p>خطا در ارسال ایمیل! تنظیمات سرور شما از این امکان پشتیبانی نمی کند</p>");
    }
?>
توضیح:
- تابع mail به صورت از پیش تعریف شده در php وجود دارد و تنها کافی است آن را با تکمیل پارامترها، فراخوانی کنیم.
- کارکرد صحیح این تابع، تا حدود زیادی بستگی به تنظیم درست موارد مورد نیاز آن در فایل php.ini دارد (از جمله smtp_port ،SMTP ،sendmail_from در سرورهای ویندوز و sendmail_path در سرورهای لینوکس)، در سرورهای اشتراکی، معمولا دسترسی به فایل اصلی php.ini امکان پذیر نیست، بنابراین اگر نتوانید با تابع mail ایمیل ارسال کنید، به احتمال زیاد تنظیمات این فایل به درستی انجام نشده است یا سرور هاست شما، قابلیت ارسال ایمیل را محدود کرده است که باید با پشتیبانی خود در این مورد تماس بگیرید.
- همانطور که ملاحظه می کنید، این تابع سه پارامتر اصلی و چند پارامتر فرعی را می تواند در هنگام ارسال ایمیل پوشش دهد، پارامترهای اصلی آدرس ایمیل دریافت کننده، موضوع و متن پیام است، پارامترهای اضافی به صورت سربرگ ها قابل استفاده هستند که به طور مثال می توانند به صورت زیر باشند:
<?php
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'X-Mailer: php' . "\r\n";
$headers .= 'Reply-To: username@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";
?>
- علامت r\n\ در کدهای بالا برای ایجاد یک خط جدید استفاده می شوند.
- MIME یک استاندارد اینترنتی برای ارسال و دریافت ایمیل است (Multipurpose Internet Mail Extensions)، همچنین است SMTP که مخفف (Simple Mail Transfer Protocol) است.

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


تابع mail علاوه بر ارسال ایمیل به صورت متن ساده یا plain text برای ارسال متون به صورت صفحات html نیز قابل استفاده است، بدین منظور دو کار را باید در هنگام ارسال ایمیل انجام دهیم:
1- متن پیام ما باید به صورت یک کد html باشد، درست شبیه صفحات ساده وب که به صورت html هستند.
2- در قسمت سربرگ ها که در بالا عنوان شد، سربرگ زیر را برای پشتیبانی از زبان فارسی، به کد خود اضافه کنیم:
<?php
$headers = 'Content-type: text/html; charset=utf-8' . "\r\n";
?>
به طور مثال:
<?php
//دریافت کننده ایمیل
$to = "username@example.com";
//موضوع
$subject = "ارسال ایمیل به صورت html";
//متن پیام به صورت html
$body = "<html>
<body>
سلام، \n\n این ایمیل جهت<b> تست </b>ارسال شده است!
</html>
</body>"
;
//سربرگ ها
$headers = "From: yourname@example.com \r\n";
$headers .= "Content-type: text/html; charset=utf-8 \r\n";
//ارسال ایمیل
if (mail($to, $subject, $body, $headers)) {
    echo("<p>ایمیل شما با موفقیت ارسال شد</p>");
    }
else {
    echo("<p>خطا در ارسال ایمیل! تنظیمات سرور شما از این امکان پشتیبانی نمی کند</p>");
    }
?>
البته ارسال سربرگ های اضافی همیشه هم ضروری نیست، برخی از سرویس های ایمیل به طور پیش فرض از یونیکد utf-8 استفاده می کنند، اما برای اطمینان از اینکه ایمیل شما در همه سیستم ها خوانا و قابل استفاده باشد، بهتر است سربرگ utf-8 را همراه ایمیل خود ارسال کنید.

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


ارسال ایمیل بدون فایل های ضمیمه یا همان attachment با تابع mail در php کار چندان سختی نیست، اما اگر بخواهیم به همین صورت فایل ها را نیز به همراه نامه الکترونیک خود ضمیمه کنیم، باید چند کار دیگر را نیز انجام دهیم که در ادامه خواهیم گفت؛ ابتدا کد زیر را در نظر بگیرید:
<?php
//دریافت کننده ایمیل
$to = "username@example.com";
//ارسال کننده ایمیل
$from = "yourname <yourname@example.com>";
//موضوع
$subject = "ارسال ایمیل به همراه ضمیمه";
//کد رندوم boundary
$randcode = md5("r",time());
//خط جدید
$line = "\r\n"; //یا PHP_EOL
//فایل ضمیمه
$filename = "phpbook.zip";
//تجزیه و آماده سازی فایل برای ارسال
$attachment = chunk_split(base64_encode($filename));
//سربرگ ها
$headers  = "From: ".$from.$line;
$headers .= "MIME-Version: 1.0".$line;
$headers .= "Content-Type: multipart/mixed; boundary=\"".$randcode."\"";
//متن پیام به صورت ساده
$body = "--".$randcode.$line;
$body .= "Content-Transfer-Encoding: 7bit".$line.$line;
$body .= "این یک ایمیل به همراه ضمیمه است".$line;
//متن پیام به صورت html
$body .= "--".$randcode.$line;
$body .= "Content-Type: text/html; charset=\"utf-8\"".$line;
$body .= "Content-Transfer-Encoding: 8bit".$line.$line;
$body .= "این یک ایمیل به همراه <b>ضمیمه</b> است".$line;
//تنظیمات فایل ضمیمه
$body .= "--".$randcode.$line;
$body .= "Content-Type: application/zip; name=\"".$filename."\"".$line;
$body .= "Content-Transfer-Encoding: base64".$line;
$body .= "Content-Disposition: attachment".$line.$line;
$body .= $attachment.$line;
$body .= "--".$randcode."--";
//ارسال ایمیل
if (mail($to, $subject, $body, $headers)) {
    echo("<p>ایمیل شما با موفقیت ارسال شد.</p>");
    }
else {
    echo("<p>خطا در ارسال ایمیل! تنظیمات سرور شما از این امکان پشتیبانی نمی کند</p>");
    }
?>
کد بالا با استفاده از تابع mail در php، علاوه بر ارسال متن ساده و متن به صورت html قابلیت ارسال فایل ضمیمه (attachment) را نیز دارد.
توضیح:
- قبل از هر چیز در هنگام ارسال ایمیل با ضمیمه، ما به سربرگی تحت عنوان boundary یا سرحد و کرانه احتیاج داریم، برای تفکیک قسمت های مختلف یک ایمیل  (از جمله متن ساده، متن به صورت html و فایل ضمیمه) در استاندارد MIME باید از کدهای رندوم تحت عنوان boundary استفاده کنیم، البته در واقع مهم نیست این کد شامل چه عبارتی (از حروف و اعداد) باشد، مهم این است که سیستم دریافت کننده ایمیل بتواند قسمت های مختلف آن را تفکیک کند، از طرفی این کد نباید در متن پیام تکرار شده باشد، لذا معمولا از یک کد رندوم اختصاصی استفاده می شود.
- نکته مهم دیگر استفاده از تابع chunk_split و base64_encode است، به این صورت فایل ما برای انتقال به قطعات کوچکتری تقسیم شده و در چارچوب استاندارد RFC 2045 قابل انتقال است.
- همانطور که ملاحظه می کنید، در سربرگ های اولیه، مقادیر multipart/mixed را برای Content-Type در نظر گرفته ایم که این کار به دلیل ضمیمه بودن فایل به ایمیل است.
- در دو قسمت میانی کد، دو نوع متن به صورت plain text و text html ارسال کرده ایم که شما بنا بر ضرورت می توانید از هر دو یا تنها از یک روش استفاده کنید.
- نکته مهم دیگر استفاده از application/zip برای Content-Type در قسمت مربوط به فایل ضمیمه است، برای بدست آوردن Content-Type فایل های مختلف با فرمت های متفاوت، کافی است آدرس فایل خود را در سرور یا در لوکال هاست در کد زیر به جای متغیر فرضی file جایگزین کرده و آن را اجرا کنید، خروجی، Content-Type فایل شما را نشان می دهد:
<?php
//تابع نمایش نوع فایل
function my_mime_content_type($filename){
    $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('.',$filename)));
        if (array_key_exists($ext, $mime_types)) {
            return $mime_types[$ext];
        }
        else {
            return 'application/octet-stream';
        }
}
//آدرس فایل شما
$filename = 'image/file.gif';
//خروجی
echo my_mime_content_type($filename);
?>

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


اگرچه کاربرد تابع mail در php بسیار آسان و ساده است، اما این تابع تنها موارد اولیه را پوشش می دهد، به فرض امکان استفاده از SMTP به صورت authentication یا بررسی نام کاربری و کلمه عبور وجود ندارد، یا نمی توان سرور ارسال ایمیل را تغییر داد و محدودیت های دیگری از این دست، لذا برنامه نویسان php بسته ها و کلاس های دیگری بدین منظور نوشته اند که یکی از معروف ترین آنها کلاس phpmailer است، علاوه بر کلاس phpmailer بسته ایمیل  PEAR نیز برای php وجود دارد که البته به دلیل قدرت و انعطاف پذیری کلاس phpmailer کم تر مورد استفاده قرار می گیرد.
برای شروع آموزش این قسمت ابتدا کلاس مذکور را از لینک زیر دریافت کنید:
http://code.google.com/a/apache-extras.org/p/phpmailer
به دلیل مسدود بودن خدمات code گوگل برای ip های ایران، می توانید آخرین نسخه آن را از لینک زیر نیز دریافت کنید:
دانلود کلاس phpmailer نسخه 5.2.1 - حجم 50 کیلوبایت
در نسخه بالا برخی فایل های غیر ضروری  مربوط به تست های جانبی کلاس، نسبت به نسخه اصلی حذف شده اند تا از سردرگمی کاربران در مواجه با تعداد زیاد فایل های این بسته جلوگیری شود، زبان فارسی نیز برای خطاها، در قسمت language قرار داده شده است که می توانید با اعمال تغییراتی در فایل class.phpmailer.php از آن نیز استفاده کنید، یادآور می شویم اگر می خواهید این کلاس را به همراه تمام فایل های جانبی در اختیار داشته باشید، بهتر است نسخه سایت گوگل را دریافت کنید، اما اگر داشتن فایل ها و مثال های اصلی برایتان مهم است و چندان اهل کنجکاوی در موارد اضافی و جانبی نیستید، این بسته نیز کامل و مناسب است.
استفاده از کلاس بالا بسیار ساده و آسان است، کافی است مطابق الگوی زیر موارد مورد نظر را با توجه به سرور خود تنظیم کرده و فایل را اجرا نمائید.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>وبگو | ارسال ایمیل با کلاس PHPMailer</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- https://webgoo.ir -->
</head>
<body>
<?php
require_once('class.phpmailer.php');
$mail = new PHPMailer(true);
$mail->IsSMTP();
try {    
  $mail->Host       = "mail.example.com"; // آدرس SMTP سرور شما
  $mail->SMTPAuth   = true;                  // استفاده از SMTP authentication
  $mail->Username   = "yourname@example.com"; // نام کاربری SMTP
  $mail->Password   = "************";        // کلمه عبور SMTP
  $mail->AddReplyTo('yourname@example.com', 'Your Name'); // افزودن پاسخ به ارسال کننده
  $mail->AddAddress('username@example.com', 'User Name'); // تنظیم آدرس گیرنده ایمیل
  $mail->SetFrom('yourname@example.com', 'Your Name'); // تنظیم قسمت ارسال کننده ایمیل
  $mail->Subject = 'PHPMailer تست'; // موضوع ایمیل
  $mail->AltBody = 'برنامه شما از این ایمیل پشتیبانی نمی کند، برای دیدن آن، لطفا از برنامه دیگری استفاده نمائید'; // متنی برای کاربرانی که نمی توانند ایمیل را به درستی مشاهده کنند
  $mail->CharSet = 'UTF-8'; // یونیکد برای زبان فارسی
  $mail->ContentType = 'text/html'; // استفاده از html  
  $mail->MsgHTML('<html>
<body>
این یک <font color="#CC0000">تست</font> است!
</body>
</html>'
); // متن پیام به صورت html
  //$mail->AddAttachment('images/phpmailer.gif'); // ضمیمه کردن فایل
  $mail->Send(); // ارسال
  echo "پیام با موفقیت ارسال شد\n";
}
catch (phpmailerException $e) {
    echo $e->errorMessage(); // پیام خطا از phpmailer
}
catch (Exception $e) {
    echo $e->getMessage(); // سایر خطاها
}
?>
</body>
</html>
توضیح:
- همانطور که گفتیم ارسال ایمیل با کلاس phpmailer بسیار آسان و کاربردی است، کافی است ابتدا فایل اصلی برنامه یعنی class.phpmailer.php را در صفحه خود وارد کنید (با استفاده از require یا include)، سپس موارد مورد نیاز را مطابق با سرور و حساب خود تنظیم نمائید.
- در قسمت IsSMTP مشخص می کنیم که می خواهیم از SMTP برای ارسال ایمیل استفاده کنیم و برای استفاده از این امکان باید آدرس میل سرور، نام کاربری و کلمه عبور را مطابق الگو تکمیل نمائید.
- قسمت AltBody برای کسانی است که برنامه مدیریت ایمیل آنها تنها از متن ساده پشتیبانی می کند و امکان دیدن ایمیل های html را ندارند.
- قسمت MsgHTML متن پیام به صورت html را در خود جای می دهد، این متن هم می تواند با فراخوانی یک فایل جانبی (با تابع file_get_contents) باشد یا اینکه به صورت مستقیم وارد شود، به فرض در هنگام کار با فرم های ایمیل می توان متن دریافتی از فرم را به یک متغیر نسبت داده و متغیر را به عنوان محتوای ایمیل ارسالی در نظر گرفت.
- اگر نیاز به ضمیمه کردن فایل یا فایل هایی در ایمیل خود دارید، می توانید از قسمت AddAttachment که در مثال بالا غیر فعال شده است، استفاده کنید، ذکر این نکته ضروری است که فایل شما باید از قبل بر روی سرور قرار گرفته باشد و سپس آدرس آن به صورت داینامیک جایگزین شود که خود نیاز به کمی مهارت در برنامه نویسی php دارد.

استفاده از SMTP گوگل برای ارسال ایمیل در php


با استفاده از کلاس PHPMailer شما می توانید از سایر سرورهای SMTP که در آنها حساب کاربری دارید نیز برای ارسال ایمیل استفاده نمائید، البته در عمل سرویس های ایمیل معمولا پس از مدتی برخی از پورت های عمومی خود را محدود کرده یا تغییر می دهند؛ با این وجود یکی از پرکاربردترین این سرورها، سرویس ایمیل سایت گوگل است که تقریبا محدودیت های آن از سایر موارد مشابه کم تر است، البته در لحظه ای که آین آموزش نوشته می شود، ظاهرا پورت 465 SSL آن برای برنامه های جانبی مسدود شده است و خطای timeout می دهد، اما پورت 587 TLS همچنان کار می کند، در کنار این دو پورت امن، پورت 25 نیز وجود دارد که نیازی به رمزنگاری ندارد، برای اینکه این کد در سرور شما به درستی کار کند، بهتر است همه موارد را بررسی کنید، ارسال ایمیل از این طریق محاسن و در عین حال معایبی دارد، بهترین مزیت آن این است که محدودیت برخی از هاست های اشتراکی را ندارد، توضیح اینکه در بیشتر هاست ها برای ارسال ایمیل محدودیت هایی به صورت روزانه و یا ساعتی قائل می شوند، ظاهرا و به گفته تیم پشتیبانی گوگل، در سرویس این شرکت روزانه بالغ بر 2000 ایمیل از یک اکانت قابل ارسال است، اما معایب این سرویس این است که ممکن است از طرف گوگل پورت های آن مسدود شود یا بدون اطلاع قبلی تغییر پیدا کند و یا به ip های برخی کشورها سرویس ندهد و... که این استقلال برنامه ما را تحت تاثیر قرار می دهد، به هر صورت تصمیم به استفاده یا عدم استفاده از این امکان را به عهده شما می گذاریم.
بدین منظور لازم است الگوی بالا را به شکل زیر تغییر دهید:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>وبگو | ارسال ایمیل با کلاس PHPMailer و سایت گوگل</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- https://webgoo.ir -->
</head>
<body>
<?php
require_once('class.phpmailer.php');
$mail = new PHPMailer(true);
$mail->IsSMTP();
try {
  $mail->Host       = "smtp.gmail.com"; // آدرس SMTP سایت گوگل        
  $mail->SMTPAuth   = true;                  // استفاده از SMTP authentication
  $mail->SMTPSecure = "tls";                 // استفاده از پروتکل امن    
  $mail->Port       = 587;                   // درگاه خروجی سرویس ایمیل گوگل  
  $mail->Username   = "yourname@gmail.com"; // نام کاربری حساب گوگل
  $mail->Password   = "************";        // کلمه عبور حساب گوگل
  $mail->AddReplyTo('yourname@example.com', 'Your Name'); // افزودن پاسخ به ارسال کننده
  $mail->AddAddress('username@example.com', 'User Name'); // تنظیم آدرس گیرنده ایمیل
  $mail->SetFrom('yourname@example.com', 'Your Name'); // تنظیم قسمت ارسال کننده ایمیل
  $mail->Subject = 'PHPMailer تست'; // موضوع ایمیل
  $mail->AltBody = 'برنامه شما از این ایمیل پشتیبانی نمی کند، برای دیدن آن، لطفا از برنامه دیگری استفاده نمائید'; // متنی برای کاربرانی که نمی توانند ایمیل را به درستی مشاهده کنند
  $mail->CharSet = 'UTF-8'; // یونیکد برای زبان فارسی
  $mail->ContentType = 'text/html'; // استفاده از html  
  $mail->MsgHTML('<html>
<body>
این یک <font color="#CC0000">تست</font> است!
</body>
</html>'
); // متن پیام به صورت html
  //$mail->AddAttachment('images/phpmailer.gif'); // ضمیمه کردن فایل
  $mail->Send(); // ارسال
  echo "پیام با موفقیت ارسال شد\n";
}
catch (phpmailerException $e) {
    echo $e->errorMessage(); // پیام خطا از phpmailer
}
catch (Exception $e) {
    echo $e->getMessage(); // سایر خطاها
}
?>
</body>
</html>
پس از اجرای کد برای اولین بار، ممکن است سرویس گوگل دسترسی برنامه را مسدود کند تا از شما مجوزهای لازم را دریافت نماید، بدین جهت اگر با خطای authentication مواجه شدید، لازم است که به ایمیل خود مراجعه کرده و با پیروی از دستورالعمل پیام ارسالی از طرف گوگل، مبنی بر تلاش برای استفاده از حساب شما در یک برنامه جانبی، اجازه استفاده از حساب کاربریتان را به برنامه خود بدهید و از نو آن را اجرا کنید، توجه کنید که به اشتباه بر روی لینک ها کلیک نکنید، در غیر این صورت برنامه شما ممکن است مسدود شود و برای ارسال ایمیل از این طریق با مشکل مواجه شوید.

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


برای ارسال ایمیل از طریق لوکال هاست و برنامه سرور محلی WampServer، با استفاده از SMTP سرویس ایمیل گوگل یا همان GMail، ابتدا لازم است که آخرین نسخه wamp را روی سیستم خود نصب کنید، این برنامه را می توانید از لینک زیر دریافت نمائید.
www.wampserver.com
پس از نصب برنامه، به دلیل استفاده گوگل از پروتکل های امن و عدم پشتیبانی wamp (به طور پیش فرض) از این امکان، باید تغییراتی در فایل اصلی php.ini اعمال نمائید تا ایمیل شما از این طریق قابل ارسال باشد، لذا پوشه ای که برنامه را در آن نصب کرده اید باز کرده و آدرس زیر را ادامه دهید تا به فایل php.ini برسید.
\bin\apache\apache*.*.**\bin
در این فایل با استفاده از نت پد (notepad) یا هر ویرایشگر متنی دیگر و با کمک قابلیت کلمه یاب یا Find، به دنبال عبارت openssl بگردید تا به خط مربوط به extension=php_openssl.dll برسید، اگر در ابتدای این خط علامت ; بود، آن را حذف کنید و فایل خود را ذخیره کرده و برنامه WampServer را (اگر در حال اجرا بود) بسته و مجددا اجرا کنید یا از امکان شروع مجدد آن استفاده نمائید، اکنون اگر تابع ()phpinfo را در یک فایل php خروجی بگیرید، در قسمت Phar امکان OpenSSL support باید فعال یا enabled باشد، در غیر این صورت در هنگام ارسال ایمیل از طریق phpmailer و wamp، پیام زیر را دریافت خواهید کرد.
Warning: stream_socket_enable_crypto() [streams.crypto]: this stream does not support SSL/crypto
حال همه چیز آماده است تا از کلاس PHPMailer و SMTP گوگل استفاده نمائیم.
در پایان مجددا یادآور می شویم که ممکن است برای اولین بار، گوگل کد شما را مسدود کند تا مجوز اجازه و دسترسی برنامه را از شما دریافت نماید، لذا اگر با این خطا در اکانت gmail خود مواجه شدید، باید از دستورالعمل آن پیروی کرده و مجوز دسترسی از حساب خود را به برنامه بدهید.
sectionدسته بندی: آموزش کاربردی » PHP
related مطالب بیشتر:
» دریافت و نمایش پیج رنک گوگل با PHP
» ارسال پارامتر به URL و دریافت مقادیر با PHP
» نمایش آمار بازدیدها با PHP بدون استفاده از دیتابیس
» تبدیل تاریخ میلادی، شمسی با مبدل JDF در PHP
» نحوه نمایش متن و تصاویر اتفاقی در PHP و MySQL
commentنظرات (۱۲۰ یادداشت برای این مطلب ارسال شده است)
more یادداشت های جدید بر اساس تاریخ ارسال در انتهای یادداشت های موجود نمایش داده می شوند.
نویسنده: فاطمه
زمان: ۱۳:۲۱:۲۲ - تاریخ: ۱۳۹۲/۰۷/۲۳
سلام. 1سوال داشتم. من تو قسمت تماس با ما یه فرم درست کردم با ورودی های نام آدرس ایمیل و متن پیام. میخوام وقتی دکمه ارسال رو میزنه پیام به آدرس ایمیلم ارسال بشه. چیکار کنم؟ یه توضیح بدم؟ فعلا دارم روی ومپ کار می کنم. اما میخوام مطمئن شم درست کار میکنه و نظر رو به ایمیلم ارسال می کنه؟
پاسخ: 
سلام
ارسال ایمیل در لوکال هاست نیاز به تنظیمات خاصی دارد که در انتهای آموزش برای WampServer گفته شده.
نویسنده: مسعود
زمان: ۱۵:۴۴:۲۴ - تاریخ: ۱۳۹۲/۰۸/۱۲
با سلام . یه سوال در مورد کلاس نویسی داشتم ؟
میخواستم بدونم تفاوت parent با self چیه و کار این دو تا چیه ؟
در مورد تابع constrauct هم میخواستم یه توضیحی بدین ممنون میشم
پاسخ: 
سلام
در PHP دو نام به صورت محفوظ و از پیش تعریف شده (reserved) در مورد بحث کلاس وجود دارد، self و parent که هر کدام معنی و کاربرد خاصی دارند:
self : اشاره به کلاسی دارد که در آن استفاده می شود و معمولا برای دریافت عناصر استاتیک به کار می رود، مثال:
<?php
class Test{
private $num;

private function Method_1($value){
$this->num = $value * 2;
}

public function Method_2($value){
self::Method_1($value);
return $this->num;
}
}
$call = new Test();
echo $call->Method_2(20);
?>
خروجی کد بالا برابر 40 خواهد بود.
parent : اشاره به کلاس والد دارد (معمولا در حالتی که کلاس حاضر از کلاس دیگری extends شده باشد)، مثال:
<?php
class Test{
public $num;

public function Method_1($value){
$this->num = $value * 2;
}
}
class Test_2 extends Test{
public function Method_2($value){
parent::Method_1($value);
return parent::$this->num;
}
}
$call = new Test_2();
echo $call->Method_2(20);
?>
خروجی این مثال نیز برابر 40 خواهد بود.
construct : نامی قراردادی برای متدی است که به همراه فراخوانی کلاس اجرا می شود، در واقع کاربرد اصلی این متد اجرای عناصری است که باید در ابتدای فراخوانی کلاس و از پیش پردازش شوند، مثال:
<?php
class Test{
private $num;

public function __construct(){
$this->num = 50;
}

public function EchoIt(){
return $this->num;
}
}
$call = new Test();
echo $call->EchoIt();
?>
که خروجی برابر 50 خواهد بود.
نویسنده: مسعود
زمان: ۰۷:۲۷:۵۲ - تاریخ: ۱۳۹۲/۰۸/۱۴
بسیار بسیار آموزنده و عالی بود . واقعا ممنونم استاد
نویسنده: مجتبی
زمان: ۰۱:۱۲:۱۲ - تاریخ: ۱۳۹۲/۰۸/۱۷
با سلام و عرض خسته نباشید
خیلی خیلی از بابت آموزشتون ممنونم،
فقط یک سوال ازتون داشتم، ممنون میشم بهم جوابش بدید
من از localhost استفاده می کنم از اکانت جی میل نمی تونم به اکانت یاهو میل بزنم در صورتیکه به میل سرورهای دیگه مثل میهن میل که ایرانی هستش به راحتی ایمیل ارسال می کنه
در مورد ارسال ایمیل به یاهو هم بگم بعد اجرای کد php ، تو inbox جی میل ، ایمیلی با پیغام
Delivery to the following recipient failed permanently:
mojtaba****[at]yahoo.com
با ذکر توضیحاتی میده
ازتون می خواستم در این زمینه منو راهنمایی کنید
پاسخ: 
سلام
این مشکل نیاز به بررسی های بیشتر دارد، ممکن است ایراد از یک اشتباه تایپی ساده، بلاک شدن IP شما توسط yahoo، تنظیمات مربوط به smtp سرور در لوکال هاست و... باشد.
نویسنده: مجتبی
زمان: ۰۹:۵۵:۰۸ - تاریخ: ۱۳۹۲/۰۸/۱۷
سلام و تشکر فراوان از پاسخ سریعتون، متوجه بلاک شدن IP نشدم، در حال حاضر اون ایمیل یاهو داره کار میکنه، بدون هیچ گونه ارور
این ایمیل رو جی میل بهم میده ، ممنون میشم کمکم کنید
Delivery to the following recipient failed permanently:
Technical details of permanent failure:
Google tried to deliver your message, but it was rejected by the server for the recipient domain yahoo.com by mta7.am0.yahoodns.net. [66.196.118.33].
The error that the other server returned was:
554 Message not allowed - [320]
پاسخ: 
سلام
همان طور که اشاره شد، یاهو (به هر دلیل) ایمیل شما را قبول نمی کند، موارد زیر را بررسی کنید:
- تاریخ و زمان سیستم خود را تنظیم نمائید.
- محتوایی مانند کدها یا کاراکترهای غیر مجاز ارسال نکنید.
- چند آدرس گیرنده مختلف را تست کنید.
- اگر به پراکسی دسترسی دارید، ایمیل خود را با IP آن ارسال کنید.
- اگر به سرور آنلاین دسترسی دارید، ایمیل را از این طریق ارسال کنید.
نویسنده: حامد
زمان: ۱۸:۰۰:۰۸ - تاریخ: ۱۳۹۲/۰۹/۰۲
سلام
از آموزش ممنونم. فقط برا من یه مشکل داره اونم اینکه بعد از ارسال فرم این پیغام رو میده :
Invalid address: $mail
پاسخ: 
سلام
به هر دلیل متغیر mail با مقادیر متناظر آن ست نشده است، باید ببینید چه خطایی در کدنویسی وجود دارد.
نویسنده: زانیار
زمان: ۱۳:۴۴:۲۴ - تاریخ: ۱۳۹۲/۰۹/۰۷
با سلام واقعا ممنون از وب سایت عالیتون من سه تا سوال داشتم
اول اینکه اگه بخوام با همین روش به چند ایمیل در یک زمان ایمیل ارسال کنم باید چطوری این کار رو بکنم؟
دوم اینکه لطفا بفرمایید چطوری با پی اچ پی می تونم یه آرشیو برای وب سایتم بسازم؟
و سومین سوال اینکه من با توجه به آموزش های شما یه وب سایت ساختم اما نمیدونم چطوری مثل وردپرس براشون دسته بندی قرار بدم لطفا در این مورد هم راهنمایی بفرمایید؟
با تشکر. ببخشید زیاد سوال پرسیدم اما دوست دارم یاد بگیرم :ی
پاسخ: 
سلام
در رابطه با سوال اول می توانید آدرس ها را در یک آرایه تعریف و از کلید و مقدار آرایه در حلقه foreach استفاده کرده و برای تک تک آدرس ها عمل ارسال ایمیل را انجام دهید (آدرس ها را در قسمت AddAddress قرار دهید).
در رابطه با سوال های دوم و سوم، پاسخ روشنی وجود ندارد، در واقع باید برنامه نویسی بلد باشید که خود نیاز به شروع از مقدمات و تمرین و تکرار دارد.
نویسنده: ehsan
زمان: ۲۰:۵۱:۵۸ - تاریخ: ۱۳۹۲/۰۹/۱۸
سلام
بازم مثل همیشه مطلب مفید و کاربردی
من با استفاده از کلاس PHPMailer و تمام مراحلی که گفتین تونستم پیغام پیام با موفقیت ارسال شد هم در سرور و هم در لوکال هاست ببینم ولی هر چقد خواستم تا از طریق فرم تماس و کلاس PHPMailer ایمیل بفرستم نشد می شه یه راهنمایی کوچیک کنید ممنون می شم
پاسخ: 
سلام
لطفا مشکل را دقیق تر توضیح دهید، بدون دیدن نمونه سورس کدها یا شرح خطای دریافتی، خیلی نمی توان کمکی کرد.
نویسنده: ehsan
زمان: ۱۸:۵۶:۲۰ - تاریخ: ۱۳۹۲/۰۹/۲۰
سلام مجدد
مشکل قبلی حل کردم اما مشکل جدید اینه که هر بار که ایمیل فرستاده می شه در inbox به همراه ایمیل ارسال شده یک ایمیل دیگه که
Mail Delivery Subsystem
This is an automatically generated Delivery Status Notification
که با این عنوان است فرستاده می شه و گاهی اوقات به جای یک دونه چند تا می یاد ممنون می شم کمک کنید
پاسخ: 
سلام
به نظر سرور ارسال کننده ایمیل (به هر دلیل، به طور مثال هک شدن اکانت) تلاش دارد که ایمیل شما را به آدرس هایی ارسال (یا Forward) کند که وجود خارجی ندارند و در نتیجه به مقصد نمی رسند! اگر از SMTP گوگل استفاده می کنید، مسیر زیر را دنبال کنید:
- Settings
- ForwardingPOP/IMAP
- forward email ها را در صورت وجود حذف کنید.
- تنظیمات را ذخیره و از gmail خارج شوید.
در صورتی که از هاست شخصی استفاده می کنید، مسئله را با پشتیبانی مطرح کنید.
نویسنده: ehsan
زمان: ۲۰:۲۶:۳۰ - تاریخ: ۱۳۹۲/۰۹/۲۱
سلام
ممنون که جواب می دین من ایمیلم چک کردم طبق مسیری که گفتین forward email نبود ممکن در کد مشکلی باشه من کد phpmailer که گذاشته بودین و چند خط کد که اضافه کردم
اینه:
<?php
if (isset($_POST['submit']))
{

$message=
'name: '.$_POST['name'].'<br/>
mail: '.$_POST['mail'].'<br/>
topic: '.$_POST['topic'].'<br/>
message: '.$_POST['message'].'
';

require_once('class.phpmailer.php');
$mail = new PHPMailer(true);
$mail->IsSMTP();

$mail->Host = "smtp.gmail.com"; // آدرس SMTP سایت گوگل
$mail->SMTPAuth = true; // استفاده از SMTP authentication
$mail->SMTPSecure = "tls"; // استفاده از پروتکل امن
$mail->Port = 587; // درگاه خروجی سرویس ایمیل گوگل
$mail->Username = "username@gmail.com"; // نام کاربری حساب گوگل
$mail->Password = "********"; // کلمه عبور حساب گوگل
//$mail->AddReplyTo('yourname@example.com', 'Your Name'); // افزودن پاسخ به ارسال کننده
$mail->AddAddress('username@gmail.com', 'User Name'); // تنظیم آدرس گیرنده ایمیل
$mail->SetFrom($_POST['mail'],$_POST['name']); // تنظیم قسمت ارسال کننده ایمیل
$mail->Subject = 'تست ایمیل'; // موضوع ایمیل
$mail->AltBody = 'برنامه شما از این ایمیل پشتیبانی نمی کند، برای دیدن آن، لطفا از برنامه دیگری استفاده نمائید'; // متنی برای کاربرانی که نمی توانند ایمیل را به درستی مشاهده کنند
$mail->CharSet = 'UTF-8'; // یونیکد برای زبان فارسی
$mail->ContentType = 'text/html'; // استفاده از html
$mail->MsgHTML($message); // متن پیام به صورت html
//$mail->AddAttachment('images/phpmailer.gif'); // ضمیمه کردن فایل
// ارسال
$result = $mail->Send();
$message = $result? 'پیام شما با موفقیت ارسال شد' :'خطا در ارسال پیام';
unset($mail);
}
?>
بازم ممنون که توجه می کنین
پاسخ: 
سلام
مشکلی در کدها دیده نشد!
برای رفع این مشکل باید متن کامل پاسخ سرور ایمیل گوگل را بررسی کرد.
نویسنده: ehsan
زمان: ۱۵:۳۳:۲۴ - تاریخ: ۱۳۹۲/۰۹/۲۳
سلام
Mail Delivery Subsystem <mailer-daemon@googlemail.com>
This is an automatically generated Delivery Status Notification

THIS IS A WARNING MESSAGE ONLY.

YOU DO NOT NEED TO RESEND YOUR MESSAGE.

Delivery to the following recipient has been delayed:

username@example.com

Message will be retried for 2 more day(s)

Technical details of temporary failure:
The recipient server did not accept our requests to connect. Learn more at http://support.google.com/mail/bin/answer.py?answer=7720
[(0) example.com. [2606:2800:220:6d:26bf:1447:1097:aa7]:25: Connection timed out]
[(0) example.com. [93.184.216.119]:25: Connection timed out]
این قسمتی از پاسخ سرور ایمیل گوگل است من دقیقا متوجه نمی شم چی می گه ممنون می شم کمکم کنید
پاسخ: 
سلام
ظاهرا آدرس دریافت کننده ایمیل به صورت
username@example.com
است که پس از ارسال ایمیل توسط سرور گوگل سایت
example.com
خطای
Connection timed out 
می دهد.
اینکه دلیل ارسال ایمیل به این آدرس چیست ممکن است یک اشتباه در تنظیم کدهای PHP مربوطه یا مواردی دیگر باشد.
نویسنده: ehsan
زمان: ۲۱:۳۲:۴۸ - تاریخ: ۱۳۹۲/۰۹/۲۴
سلام
ممنون که با حوصله مشکلات بررسی کرده وجواب می دین
نویسنده: مریم
زمان: ۱۳:۳۴:۰۳ - تاریخ: ۱۳۹۲/۰۹/۳۰
سلام. با تشکر از آموزشاتون.
من کد شما رو برای ارسال ایمیل از طریق اس ام تی پی گوگل رو تو فایل موجود در سرورم کپی کردم و جاهای مورد نیاز رو تغییر دادم. ولی با این ارور مواجه شدم:
SMTP Error: Could not connect to SMTP host.
مشکل از کجاست؟
و اینکه اگه بخوام از اس ام تی پی سرور خودم استفاده کنم اصلا نمیدونم باید چه تنظیماتی انجام بدم.
ممنون
پاسخ: 
سلام
ممکن است extension مربوط به php_openssl.dll در سرورتان غیر فعال یا خطایی در کدها وجود داشته باشد، برای کسب اطلاعات بیشتر قسمت زیر را به کدها اضافه کنید:
$mail->SMTPDebug = 1;
برای ارسال ایمیل از طریق SMTP هاستتان، باید حساب ایمیل را از طریق کنترل پنل ایجاد و از اطلاعات آن (آدرس، نام کاربری، کلمه عبور و...) استفاده کنید.
نویسنده: محمد ف
زمان: ۰۶:۱۶:۴۲ - تاریخ: ۱۳۹۲/۱۰/۲۰
ببخشید من این کد فرم تماس با منه ، اما متن ارسالی در outlook با فرمت text plain و ناخوانا نشان میده ، چطوری متن دریافتی به فرمت html بشه و در outlook فونت ها بصورت خوانا و یونیکد 8 نشون بده ... ممنون میشم کد تصحیح شده را برام بزارید ( من زیاد از php سر در نمیارم و این کد هم آماده از یکی از سایت ها پیدا کردم). با تشکر
حذف شد
پاسخ: 
سلام
هر چند رفع خطای اسکریپت های آماده باید از سایت ارائه دهنده کد درخواست شود، با این حال؛ قسمت مربوط به header ها را به شکل زیر تغییر دهید:
$headers = "Content-type: text/html; charset=utf-8 \r\n";
$headers .= "From: $from \r\n";
$headers .= "Reply-To: $from \r\n";
نویسنده: محمد ف
زمان: ۲۱:۱۹:۳۶ - تاریخ: ۱۳۹۲/۱۰/۲۰
ممنون از پاسختون . با کدی که شما گفتید فرمت html شد و متن ایمل فارسی و خوانا شد ولی 2 مشکل وجود داره
1 - متن ایمل پشت سر هم شده در حالی که در قبل از حل مشکل متن بصورت چند ردیفی بود مثلا بجای اینکه در یک ردیف نام و نام خانوادگی و در یک ردیف شماره تلفن باشه پشت سرهم و در یک خط افقی این اطلاعات رو میاره
مشکل دوم اینکه - در قسمت from بجای درج ایمیل ارسال کننده نام سرور میاد
ممنون میشم در این موارد هم راهنمایی فرمایید.
پاسخ: 
مشکل نمایش محتوا را باید با افزودن تگ <br> به محتوا رفع کنید، زمانی که ایمیل را به صورت HTML ارسال می کنید، نحوه نمایش محتوای نهایی نیز با تگ های HTML کنترل می شود!
در مورد مشکل دوم باید ببینید متغیر from با چه مقداری ست می شود، این مقدار باید آدرس ایمیل ارسال کننده یا نام او باشد.
more لطفا پیش از ارسال یادداشت نکات زیر را مد نظر داشته باشید:
- مواردی که به کلی خارج از موضوع این مطلب هستند را در فرم منوی "تماس با ما" مطرح و پاسخ را از طریق ایمیل دریافت کنید.
- به سوالات کلی، مبهم، غیرضروری و مشکلاتی که تلاشی برای رفع آن نکرده باشید پاسخ خاصی داده نخواهد شد.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین قرار دهید تا امکان تست و بررسی وجود داشته باشد.
- تمام یادداشت ها بررسی و برای هر کاربر زمان مشخصی جهت پاسخگویی در نظر گرفته می شود، لذا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.




4 × 4
 refresh
نکته:
با توجه به تاریخ نگارش آموزش های سایت و پیشرفت تکنولوژی های مرتبط با وب در سالیان اخیر، محتوای برخی از مطالب قدیمی ممکن است نیاز به ویرایش و به روزرسانی داشته باشد که این کار هم زمان با تهیه نسخه جدید «وبگو» به مرور در حال انجام است، لطفا در استفاده از مطالب سایت به این نکته دقت داشته و حتی المقدور از چند منبع مختلف استفاده نمائید.
آخرین دیدگاه ها
form حامد
در:
عالی بود
۲۱:۳۸:۳۱ ۱۳۹۸/۱۱/۰۷

form ناشناس
در:
سلام خیلی ممنون بابت پاسخ سریعتون خیلی دنبال همین دو خط کد بودم برای یادگیری سریع ریجکس ولی با سرچ پیدا نکردم و...
۱۸:۰۳:۴۳ ۱۳۹۸/۱۱/۰۷

form فرید
در:
درود بشما، میخواستم بدونم مثل کلمه @، کلمه ایی ساین هم داریم؟ با تشکر
۱۲:۱۹:۰۷ ۱۳۹۸/۱۱/۰۷

form ناشناس
در:
سلام میشه لطفا به سوالم جواب بدید من می خوام با استفاده از عبارات با قاعده تمام تگ های html رو تشخیص بدم...
۱۰:۱۳:۰۵ ۱۳۹۸/۱۱/۰۷

form PewDiePie
در:
سلام چطور می تونم این کد رو یه لینک هم بهش اضافه کنم یعنی این که وقتی عکس رو می بینی طرف بتونه...
۲۳:۳۶:۲۶ ۱۳۹۸/۱۱/۰۶

form رسول
در:
سلام میخوام بجای نمایش متن، متن موجود در یه لینکو بهم نشون بده ممنون میشم کمکم کنید
۱۳:۳۸:۱۸ ۱۳۹۸/۱۱/۰۶

form حسن
در:
من مطابق کد نوشته شده شما میخواستم آدرس
۱۴:۱۰:۱۳ ۱۳۹۸/۱۱/۰۵

form saemrezaei
در:
سلام واقعا عالییه خیلی استفاده کردم به وبلاگم سر بزن لطفا.
۱۳:۳۷:۳۴ ۱۳۹۸/۱۱/۰۵

form نصراله رضایی
در:
سلام در ادمین های گذشته که باز می کنم تصاویر مشاهده نمی شود و من را به آدرس Huge domains.com ارجاع می...
۲۲:۳۹:۵۳ ۱۳۹۸/۱۱/۰۴

form نقدی زاده
در:
واقعا مرسی یه overflow-y:hidden به body دادم اسکرل افقی برای صفحه نمایش تبلت از بین رفت
۱۴:۴۴:۱۳ ۱۳۹۸/۱۱/۰۴

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

form امین
در:
سلام تشکر بابت راهنماییتون. منظور من این بود که: الان با ثبت نام کاربر a در سایت اطلاعاتش در دیتابیس ثبت میشه و یک پوشه...
۰۳:۱۲:۴۰ ۱۳۹۸/۱۱/۰۲

form شریفی
در:
سلام معنی متن زیر چیست؟
۱۸:۲۸:۰۹ ۱۳۹۸/۱۱/۰۱

form امین
در:
سلام خسته نباشید یه اسکریپت دارم که وقتی کاربر ثبت نام میکنه یه پوشه و محتواش ایجاد میشه. میخوام یه صفحه با هر ثبت نام...
۱۴:۱۸:۵۱ ۱۳۹۸/۱۰/۳۰

form Admin
در:
سلام دوست عزیز. میشه بگویید چگونه میتوان در وبلاگ کادری را باز کرد که بازدید کنندگان بتوانند در آن چیزی بنویسند. ممنون میشم...
۱۱:۲۸:۵۰ ۱۳۹۸/۱۰/۳۰
آگهی