توی خیلی از انجمنهای برنامه نویسی به این سؤال برخوردم که چطور باید با PHP از حساب کاربری Gmail ایمیل ارسال کنیم. عدهای هم که میدونستند چطور باید این کار را بکنند اکثر ناموفق بودند. تصمیم گرفتم این مطلب را بنویسم تا مشکل خیلی از دوستان حل بشه.
برای ارسال ایمیل از Gmail برخلاف حالتی که از طریق وب سرور و یک MTA مثل Sendmail ایمیل ارسال میکنیم ، باید از SMTP استفاده کنیم. لازم هم نیست خیلی در مورد SMTP بدونیم و کلاس PHPMailer به خوبی SMTP را پشتیبانی میکنه. پس اولین کار اینه که PHPMailer را دانلود کنیم و بسته به مسیری که قرار دادیمش توی فایل ارسال ایمیل صداش کنیم. حواستون باشه که توی Package ی که دانلود میکنید یک فایل smtp.php هم هست که باید اون را هم در کنار فایل phpmailer.php قرار بدین.
دو نکته مهم :
۱ – اولین نکته مهمی که در رابطه با Gmail وجود داره این هست که Gmail از SSL/TLS استفاده میکنه.TLS روی پورت 587 هست و توی کد بایستی به درستی تنظیم بشه.
۲ – دومین نکته مهمی که وجود داره بحث امنیت بالای خود Gmail هست. Gmail به شدت روی IP درخواست های ورود (در حالت SMTP هم شما مثل وب Login میکنید) حساس هست و مثلاً اگه شما از حساب Gmail خودتون توی ایران استفاده میکنید و سعی کنید با SMTP یک ایمیل از سرر خودون که مثلاً در انگلستان هست ارسال کنید. ۹۹ درصد Gmail مانع از Authentication پرتوکل SMTP میشه و خطای Authentication خواهید گرفت. یک ایمیل هم با افتخار از Gmail براتون ارسال میشه که شخص دیگری با پسورد صحیح شما از یک جای دیگه سعی کرده وارد بشه و ما جلوش را گرفتیم !!! :(. این موضوع دو تا راه حل داره :
راه حل اول : حساب کاربری Gmail را روی سرور خودتون بسازین و همیشه هم از همون سرور و IP درخواست SMTP بدین.
راه حل دوم : توی تنظیمات حساب کاربری گوگل در بخش Security → Account Permissions آیتم Access for less secure apps را Enabled کنین (این تغییر تا زمان نوشته شدن این مطلب وجود داشت و ممکنه بعد از مدتی مکانش یا حالتش عوض بشه یا حتی gmail بخواد که شما IP های معتبر مد نظرتون را تعیین کنین).
و اما کد :
error_reporting(E_ALL); ini_set('display_errors','1'); require("phpmailer.php"); $mailObj = new phpmailer(); $mailObj->IsSmtp(); $mailObj->SMTPSecure = "tls"; $mailObj->Host = "smtp.gmail.com"; $mailObj->Port = "587"; $mailObj->SMTPAuth = true; $mailObj->Username = "username@gmail.com"; $mailObj->Password = "password"; $mailObj->SMTPDebug = true; $mailObj->CharSet = "utf-8"; $mailObj->FromName = "Fullname"; $mailObj->From = "username@gmail.com"; $mailObj->AddAddress("recipient@domain.com",""); $mailObj->Subject = "=?UTF-8?B?".base64_encode("عنوان فارسی نامه")."?="; $mailObj->Body = "متن نامه"; $mailObj->Send(); if ($mailObj->ErrorInfo != "") throw new Exception($mailObj->ErrorInfo); else echo "Mail sent."; unset($mailObj);
پی نوشت : با وجود بررسی و دقتی که من در چگونگی حل مشکل ارسال از طریق Gmail SMTP داشتم باز هم یکی از دوستان مشکل داشتند که پس از بررسی متوجه ۲ نکته شدم ، توجه داشته باشید که فقط زمانی این دو نکته را اعمال کنید که خطای Authentication Failure بگیرین یا توی برگشتی Debug جمله Please log in via your web browser بگیرین و در ضمن اگه نکته ۱ مشکل را حل کرد نیاز به اعمال نکته ۲ نیست :
نکته ۱ : پس از ورود به حساب gmail روی این لینک https://www.google.com/accounts/DisplayUnlockCaptcha کلیک کنید و Accept کنید.
نکته ۲ : گذرواژه خودتون را عوض کنید و گذرواژهای شامل حروف کوچک و بزرگ ، اعداد و علایم با طول حداقل ۸ کاراکتر انتخاب کنید.
مدیر جان دستت درد نکنه/خیلی کمکم کردی/سه چهارروز بود بدجور گیر کرده بودم.البته هرجای سایت رو مینویسم میرم جلو به مشکل جدید بر میخورم ولی خوبه که مهندسهایی مثل شما رو داریم که مشکلامون رو برطرف میکنن/
شما لطف دارین.
برای حل مشکل لاگین میتونین از App Password استفاده کنین
https://support.google.com/accounts/answer/185833?hl=en
لطفا سورسشو بزارید
متوجه نمیشم. من که سورس کدش را گذاشتم.
سلام و ممنون از پستی که گذاشتید.
من مسالم چیز دیگری است و در واقع موقع ارسال خطای دیگری میگیرم که مربوطه به connection هست!
من اسکریپمو روی سرور VPS اجرا میکنم و بعد از حدود یک دقیقه تاخیر پیام خطای زیر رو میگیرم:
SMTP ERROR: Failed to connect to server: Network is unreachable (101)
SMTP connect() failed.
نظری دارید؟
به نظر شما این به تنظیمات سرور من ربط داره؟!
به نظر من باید روی یک سرور دیگه بررسی کنید. احتمال میدم مشکل از سرور شما باشه و ممکنه Gmail در واقع IP شما را Banned کرده باشه.
با سلام
من از library email کدیگنایتر استفاده میکنم همه ی نکاتی هم که ذکر کردید و توی کلاسش ست کردم.اولش خطای authentication میداد رمزم و عوض کردم تنظیمات جی میلی که در بالا ذکر کردید و انجام دادم.الان دیگه هیچ پیغام خطایی نمیده ولی متاسفانه هیچ ایمیلی هم ارسال نمیکنه درصورتی که ادعا میکنه ایمیل فرستاده شده.تنطیمات ومپ سرور هم انجام دادم .و فایل sendmail و اضافه کردم.اما موفق نبودم.بنظرتون مشکل از کجاست؟
از کجا میتونم بفهمم که جی میل،IP منو Banned کرده؟؟؟؟؟؟؟
متاسفانه از Code Igniter تا حالا استفاده نکردم. به نظرم بهتره از همون PHPMailer استفاده کنید و بررسی کنید ببینین چه خطایی میگیرین یا شاید بدون مشکل ارسال شد. خیلی بعیده که مشکل از banned شدن باشه اما میتونین از طیق این لینک مشکلات ارسال ایمیل را با گوگل حل کنید.
ممنون به خاطر سایت خوبتون
من هنگام ارسال ایمیل خطای Message could not be sent.Mailer Error: Invalid address: (From): root@localhost واسم میاد
میدونین علتش چیه؟
شما آدرس From را root@localhost زدین ! و طبیعیه که خطا میده. باید آدرس ایمیل From صحیح باشه و برای سرویس دهنده SMTP معتبر باشه ، شما از طریق Google نمیتونید با From یک آدرس دیگه ایمیل ارسال کنید چون Google یک Open Relay نیست و برای استفاده از SMTP نام کاربری و گذرواژه ازتون میخواد که باید مربوط به همون آدرس ایمیل From باشه.
سلام
ممنون از اطلاعات خوبی که داده اید
ممکنه بفرمایید چطور میتونم با php و پرتکول pop3 به inbox دسترسی پیدا کنم.
در واقع ایمیل دریافت کنم؟
به نظرم POP3 قدیمی شده و الان همه سرویس دهنده ها از IMAP پشتیبانی میکنند ، برای IMAP از این نمونه کد استفاده کنین:
http://www.wellho.net/resources/ex.php4?item=h401/mailme.php
اگه وقت پیدا کنم حتما خودم یک نمونه از خودم توی وبلاگ میگذارم.