parsgreen.com
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" />
<!-- http://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" />
<!-- http://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
» آموزش ساخت نقشه سایت (Sitemap) با php و xml
» نحوه نمایش متن و تصاویر اتفاقی در php و mysql
» نمایش قسمتی از متن و پاراگراف با php
» ارسال پارامتر به URL و دریافت مقادیر با PHP
commentنظرات (۱۱۰ یادداشت برای این مطلب ارسال شده است)
نویسنده: سمیه
زمان: ۱۰:۱۷:۱۴ - تاریخ: ۱۳۹۱/۰۵/۰۹
سلام بر مدیر سایت
آموزش های 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 (تحت عنوان تبدیل تاریخ میلادی به شمسی) وجود دارد، کافی است عبارت "تاریخ" را در قسمت جستجو وارد کنید.
در رابطه با سوال آخر و اینکه کدهای امنیتی چه کاربردی دارند، دلیل استفاده از این کدها جلوگیری از ارسال هرزنامه توسط برنامه های خزنده است، توضیح اینکه افراد مختلف با انگیزه های متفاوت اقدام به ایجاد برنامه هایی می کنند که در سایت ها و وبلاگ های مختلف به دنبال فرم های ارسال نظر (یا هر فرم دیگری) می گردنند و در صورت پیدا کردن، موارد را به صورت فرضی یا تبلیغاتی پر کرده و ارسال می کنند! برای جلوگیری از این نوع برنامه ها از کدهای امنیتی استفاده می شود.
paged صفحه 1 از 8




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

3 × 4
 refresh
آگهی
seonab.com
طراحی نرم افزار اندروید
رنگین کمان عکس
Ranginkamaan.com

آرشیو عکس های باکیفیت با موضوعات متنوع...