شما عضو این انجمن نبوده یا وارد نشده اید. لطفا برای مشاهده کامل انجمن و استفاده از آن وارد شوید یا ثبت نام کنید .

امتیاز موضوع:
امتیاز موضوع:
  • 34 رأی - میانگین امتیازات: 2.71
  • 1
  • 2
  • 3
  • 4
  • 5
ارسال ایمیل با php و کلاس phpmailer
#1
ارسال ایمیل از طریق برنامه های سمت سرور و از جمله php، یکی از رایج ترین مباحث کاربردی در نوع خود است که دیر یا زود برنامه نویس زبان php یا لااقل علاقمند استفاده از آن را درگیر خود می کند، اگرچه php به طور پیش فرض توابعی برای ارسال ایمیل در مفسر خود گنجانده است، اما گستره استفاده از این امکان و نیازهای کاربران به حدی است که نمی توان تنها بر آن متکی بود، از طرفی بحث ارسال ایمیل با توجه به محدودیت ها و قابلیت های سرورهای مختلف، گاهی پتانسیل تبدیل شدن به یک مشکل به ظاهر پیچیده را دارد و این چیزی است که بعضا فکر و ذهن برخی از کاربران را مشغول خود می کند، به همین خاطر در این آموزش قصد داریم در حد امکان بپردازیم به نحوه ارسال ایمیل با php و کلاس phpmailer، با این امید که مفید واقع شود.

ارسال ایمیل در php با تابع mail
برای ارسال ایمیل در php روش های مختلفی وجود دارد، ساده ترین راه،  ارسال ایمیل با استفاده از تابع درونی و از پیش تعریف شده ()mail و SMTP بدون بررسی نام کاربری و رمز عبور (authentication) است، معمولا، کافی است این تابع را با چند آرگومان فراخوانی کنید تا ایمیل شما ارسال شود، به طور مثال:

*محتوای این قسمت تنها برای اعضای انجمن قابل مشاهده می باشد. *

توضیح:
- تابع mail به صورت از پیش تعریف شده در php وجود دارد و تنها کافی است آن را با تکمیل پارامترها، فراخوانی کنیم.
- کارکرد صحیح این تابع، تا حدود زیادی بستگی به تنظیم درست موارد مورد نیاز آن در فایل php.ini دارد (از جمله smtp_port ،SMTP ،sendmail_from در سرورهای ویندوز و sendmail_path در سرورهای لینوکس)، در سرورهای اشتراکی، معمولا دسترسی به فایل اصلی php.ini امکان پذیر نیست، بنابراین اگر نتوانید با تابع mail ایمیل ارسال کنید، به احتمال زیاد تنظیمات این فایل به درستی انجام نشده است یا سرور هاست شما، قابلیت ارسال ایمیل را محدود کرده است که باید با پشتیبانی خود در این مورد تماس بگیرید.
- همانطور که ملاحظه می کنید، این تابع سه پارامتر اصلی و چند پارامتر فرعی را می تواند در هنگام ارسال ایمیل پوشش دهد، پارامترهای اصلی آدرس ایمیل دریافت کننده، موضوع و متن پیام است، پارامترهای اضافی به صورت سربرگ ها قابل استفاده هستند که به طور مثال می توانند به صورت زیر باشند:


*محتوای این قسمت تنها برای اعضای انجمن قابل مشاهده می باشد. *

- علامت r\n\ در کدهای بالا برای ایجاد یک خط جدید استفاده می شوند.
- MIME یک استاندارد اینترنتی برای ارسال و دریافت ایمیل است (Multipurpose Internet Mail Extensions)، همچنین است SMTP که مخفف (Simple Mail Transfer Protocol) است.

ارسال ایمیل به صورت html با تابع mail
تابع mail علاوه بر ارسال ایمیل به صورت متن ساده یا plain text برای ارسال متون به صورت صفحات html نیز قابل استفاده است، بدین منظور دو کار را باید در هنگام ارسال ایمیل انجام دهیم:
1- متن پیام ما باید به صورت یک کد html باشد، درست شبیه صفحات ساده وب که به صورت html هستند.
2- در قسمت سربرگ ها که در بالا عنوان شد، سربرگ زیر را برای پشتیبانی از زبان فارسی، به کد خود اضافه کنیم:


*محتوای این قسمت تنها برای اعضای انجمن قابل مشاهده می باشد. *

به طور مثال:

*محتوای این قسمت تنها برای اعضای انجمن قابل مشاهده می باشد. *

البته ارسال سربرگ های اضافی همیشه هم ضروری نیست، برخی از سرویس های ایمیل به طور پیش فرض از یونیکد utf-8 استفاده می کنند، اما برای اطمینان از اینکه ایمیل شما در همه سیستم ها خوانا و قابل استفاده باشد، بهتر است سربرگ utf-8 را همراه ایمیل خود ارسال کنید.

ارسال فایل ضمیمه با تابع mail در php
ارسال ایمیل بدون فایل های ضمیمه یا همان attachment با تابع mail در php کار چندان سختی نیست، اما اگر بخواهیم به همین صورت فایل ها را نیز به همراه نامه الکترونیک خود ضمیمه کنیم، باید چند کار دیگر را نیز انجام دهیم که در ادامه خواهیم گفت؛ ابتدا کد زیر را در نظر بگیرید:

*محتوای این قسمت تنها برای اعضای انجمن قابل مشاهده می باشد. *

کد بالا با استفاده از تابع 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 فایل شما را نشان می دهد:


*محتوای این قسمت تنها برای اعضای انجمن قابل مشاهده می باشد. *

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

برای شروع آموزش این قسمت ابتدا کلاس مذکور را از لینک زیر دریافت کنید:

دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.

به دلیل مسدود بودن خدمات code گوگل برای ip های ایران، می توانید آخرین نسخه آن را از انتهای این مقاله دانلود کنید.

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

استفاده از کلاس بالا بسیار ساده و آسان است، کافیست مطابق الگوی زیر موارد مورد نظر را با توجه به سرور خود تنظیم کرده و فایل را اجرا نمائید.

*محتوای این قسمت تنها برای اعضای انجمن قابل مشاهده می باشد. *

توضیح:
- همانطور که گفتیم ارسال ایمیل با کلاس 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 های برخی کشورها سرویس ندهد و... که این استقلال برنامه ما را تحت تاثیر قرار می دهد، به هر صورت تصمیم به استفاده یا عدم استفاده از این امکان را به عهده شما می گذاریم.

بدین منظور لازم است الگوی بالا را به شکل زیر تغییر دهید:

*محتوای این قسمت تنها برای اعضای انجمن قابل مشاهده می باشد. *

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

ارسال ایمیل در لوکال هاست و WampServer
برای ارسال ایمیل از طریق لوکال هاست و برنامه سرور محلی WampServer، با استفاده از SMTP سرویس ایمیل گوگل یا همان GMail، ابتدا لازم است که آخرین نسخه wamp را روی سیستم خود نصب کنید، این برنامه را می توانید از لینک زیر دریافت نمائید.
دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.

پس از نصب برنامه، به دلیل استفاده گوگل از پروتکل های امن و عدم پشتیبانی wamp (به طور پیش فرض) از این امکان، باید تغییراتی در فایل اصلی php.ini اعمال نمائید تا ایمیل شما از این طریق قابل ارسال باشد، لذا پوشه ای که برنامه را در آن نصب کرده اید باز کرده و آدرس زیر را ادامه دهید تا به فایل php.ini برسید.

*محتوای این قسمت تنها برای اعضای انجمن قابل مشاهده می باشد. *

در این فایل با استفاده از نت پد (notepad) یا هر ویرایشگر متنی دیگر و با کمک قابلیت کلمه یاب یا Find، به دنبال عبارت openssl بگردید تا به خط مربوط به extension=php_openssl.dll برسید، اگر در ابتدای این خط علامت ; بود، آن را حذف کنید و فایل خود را ذخیره کرده و برنامه WampServer را (اگر در حال اجرا بود) بسته و مجددا اجرا کنید یا از امکان شروع مجدد آن استفاده نمائید، اکنون اگر تابع ()phpinfo را در یک فایل php خروجی بگیرید، در قسمت Phar امکان OpenSSL support باید فعال یا enabled باشد، در غیر این صورت در هنگام ارسال ایمیل از طریق phpmailer و wamp، پیام زیر را دریافت خواهید کرد.

*محتوای این قسمت تنها برای اعضای انجمن قابل مشاهده می باشد. *

حال همه چیز آماده است تا از کلاس PHPMailer و SMTP گوگل استفاده نمائیم.

در پایان مجددا یادآور می شویم که ممکن است برای اولین بار، گوگل کد شما را مسدود کند تا مجوز اجازه و دسترسی برنامه را از شما دریافت نماید، لذا اگر با این خطا در اکانت gmail خود مواجه شدید، باید از دستورالعمل آن پیروی کرده و مجوز دسترسی از حساب خود را به برنامه بدهید.


فایل‌(های) پیوست شده
.zip   PHPMailer5.2.1.zip (اندازه: 52/41 KB / تعداد دفعات دریافت: 6)
ثبت دامنه و فروش هاست، سامانه پیامک، طراحی سایت، خدمات شبکه
دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
  | دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.

sms: 10004673  - 500021995
پاسخ
 سپاس شده توسط mesterweb


موضوعات مرتبط با این موضوع…
موضوع نویسنده پاسخ بازدید آخرین ارسال
  ارسال ایمیل همراه با فایل ضمیمه به وسیله PHP saberi 0 196 ۹۷/۱/۱۵، ۰۱:۱۸ صبح
آخرین ارسال: saberi
  کلاس آماده برای نوشتن Regex saberi 0 180 ۹۷/۱/۱۵، ۱۲:۳۴ صبح
آخرین ارسال: saberi
  ارسال ایمیل انبوه با سرویس Mailgun در PHP saberi 0 247 ۹۷/۱/۱۴، ۱۱:۵۵ عصر
آخرین ارسال: saberi
  کلاس آماده برای Hash کردن پسورد در php saberi 0 203 ۹۷/۱/۱۴، ۱۱:۳۹ عصر
آخرین ارسال: saberi
  مشاهده یک صفحه php با آدرس های که به ایمیل ارسال میشه nex1music 6 567 ۹۶/۹/۹، ۱۰:۰۶ عصر
آخرین ارسال: نگار

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 1 مهمان