Arash Hacker

هک و امنیت

Arash Hacker

هک و امنیت

طبقه بندی موضوعی
آخرین نظرات

ارسال ایمیل با PHP

 سلام به کاربرای همیشه بیدار این وب با عرض تبریک و تهنیت سال 1404 و آرزوی صبر و شکیبایی در این ایام سخت. (مخصوصا دلار 100 هزار تومانی.) بگذریم. توو این پست قصد کردم که ارسال ایمیل با php رو بگم. البته یه نکته رو همینجا عرض کنم خدمتتون، این مطلب رو دوست عزیزم Attacker32 نوشته بود که من هم که حوصله نداشتم اومدم همون رو کپی کردم و یکم تغییر دادم و سپس گذاشتم تو وب :)


برای ارسال ایمیل با php راه های زیادی هست که راحت ترین راهش به نظرم از طریق تابع mail هه که توو این پست هم با این تابع می نویسیم.

خب این تابع رو باید  با چند تا آرگومان فراخوانی کنید. مثلاً:

<?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.ini تنظیم نیست یا سرور هاستتون، ارسال ایمیل رو محدود کرده :(

خب بریم سر عسل متلب، این تابع سه تا دونه پارامتر اصلی و چند تا فرعی رو میتونه موقع ارسال ایمیل پوشش بده. پارامتر های اصلی که آدرس ایمیل دریافت کننده و موضوع و متن پیامه، پارامتر های اضافی هم که به شکل سربرگ ها قابل استفاده هستن، به طور مثال: 
<?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 هم که یه استاندارد اینترنتی برای ارسال و دریافت ایمیله.
 
ارسال ایمیل به صورت html با تابع mail
از تابع mail علاوه بر ارسال ایمیل  به صورت متن ساده، برای ارسال متون به صورت صفحات html هم میشه استفاده کرد. برای همین دو تا کارو موقع ارسال ایمیل باید انجام بدیم. 
۱- متن پیام باید مثل یه کد html باشه.
۲- توو قسمت سربرگ هایی که بالا گفتیم باید سربرگ زیر رو هم به کدها اضافه کنیم تا از زبان فارسی پشتیبانی کنه:
<?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>");
    }
?>

 

ارسال فایل ضمیمه با تابع 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، علاوه بر متن ساده به صورت html قابلیت ارسال فایل ضمیمه هم داره.
قبل از هرچی موقع ارسال ایمیل با ضمیمه ما نیاز به سربرگی تحت عنوان boundary یا سرحد و کرانه داریم. برای تفکیک کردن بخش های مختلف یه ایمیل در استاندارد MIME باید از کدهای رندوم تحت عنوان boundary استفاده کنیم. سیستم دریافت کننده ایمیل باید بتونه قسمت های مختلف اونو تفکیک کنه، این کد نباید در متن پیام تکرار شده باشه، برای همین از یه کد رندوم اختصاصی استفاده میشه.
- یه نکته مهم دیگه این که استفاده از تابع chunk_split و Base64_encode هه که به این صورت فایل ما برای انتقال به قطعات کوچکتری تقسیم شده و در چارچوب استاندارد RFC2045 قابل انتقاله.
- نکته مهم تر اینکه استفاده از application/zip برای content-type در قسمت مربوط به فایل ضمیمه. برای به دست آوردن content-type فایل های مختلف با فرمت های متفاوت باید آدرس فایل خودمون رو توو سرور یا توو لوکال هاست در کد زیر به جای متغیر فرضی file جایگزین کرده و اونو اجرا کنیم تا خروجی contect-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);
?>

خب، اینم از مبحث ارسال ایمیل با php اگه مشکلی چیزی بود در خدمتیم :)

البته فکر کنم دیگه خیلی سخت و اصولی برای کاربرای آماتور شد:/


 ایران  پیروز و سربلند 
  • ۰۴/۰۱/۱۳
  • Arash Hacker

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی