سلام و خسته نباشید در این مطلب قصد دارم روش ارسال لینک فعالسازی اکانت از طریق ایمیل رو در Yii براتون آموزش بدم که اگه این آموزش رو یاد بگیرید هرگونه ایمیلی مثل اطلاع رسانی از پیغام جدید یا جواب دادن به مطلب شما در سایت و .. رو می تونید به راحتی برای پروژتون پیاده سازی کنید.
خب, برای این کار ابتدا ما از یک اکستنشن به نام smtp-mail که از لینک زیر می تونید دانلودش کنید استفاده میکنیم, البته من براتون فایل ویرایش شده ی خودمم قرار دادم که البته زیاد تغییری نکرده فقط charset = utf-8 و ارسال ایمیل با فرمت html و تنظیمات و شخصی سازیایی از این قبیلو انجام دادم که اگه خواستید می تونید از همین فایل خودم استفاده کنید.
http://www.yiiframework.com/extension/smtp-mail/
خب فایل رو که دانلود کردید پوشه ی smtpmail رو منتقل کنید به فولدر extension در مسیر protected/extension
حالا فایل تنظیمات main.php واقع در مسیر protected/config/main.php رو باز کنید و کد زیر رو به خط کامپوننت ها اضافه کنید:
توضیحات مختصر درباره ی کد بالا اینکه host در اینجا مسیر smtp مربوط به سایت یاهو هستش که اگه شما سایت خودتون رو بخواید بذارید به شکل smtp.yourdomin.com یا smtp.mail.domin.com یا بسته به سرور شما فرق میکنه مثلا برای جیمیل smtp.gmail.com هستش.
username هم آدرس ایمیلی که می خواید باهاش ارسال کنید (این آدرس حتما باید متعلق به تنظیمات host که در بالا گفتیم باشه)
password رمز عبور ایمیل شما
پورت هم می تونید تو گوگل سرچ کنید و پورد smtp سایتای مختلف رو پیدا کنید مثلا برای گوگل و یاهو همین 465 هست ولی واسه ی سایت شما ممکنه 25 باشه
حالا شما یک class در پوشه ی components واقع در protected/components ایجاد کنید (من اسمشو گذاشتم Tools.php)
محتوای این فایل به صورت زیر:
خب اسم این متد استاتیک رو mailSend گذاشتیم که پارامتر هایی که میگیره به ترتیب = ایمیل گیرنده, موضوع ایمیل, متن اصلی ایمیل هستش که جلوتر روش استفادشو بهتون آموزش میدم
یک فایل کلاس دیگه هم در این فولد components با نام Message ایجاد میکنیم (این کار صرفا برای راحتی کارامون در ارسال ایمیل هستش که پیغام هایی که می خوایم واسه ی هر موضوع خاصی بفرستیم مدیریت شده باشه)
محتوی فایل Message.php
خب این کلاس حاوی دوتا متد استاتیک هستش که اولی موضوع ایمیل ماست و دومی متن اصلی پیام که پارامترهایی میگیره که برای ساخت لینک فعالسازی بدردمون می خوره = اولیش که نام کاربرو میگیریم که خوش آمد بگیم دومی نام کاربری فرد که موقعه ی ثبت نام وارد کرده و سومی کد فعالسازی هست که در ادامه بهش میرسیم
این نکته هم در نظر بگیرید که لینک فعالسازی که من ساختم با توجه به حالت پیشفرض آدرس دهی های خود فریمورک هستش و اگه با urlmanager آدرس دهی رو تغییر دادین باید این لینک هم ویرایش کنین
حالا باید داخل جدول کاربرامون داخل دیتابیس حتما این فیلد هارو داشه باشیم
نام جدول در اینجا users گذاشتیم
فیلد نام کاربری حتما داشته باشه که ما username گذاشتیم
فیلد ایمیل حتما داشته باشه که ما اینجا اسمشو email گذاشتیم
فیلدی برای ثبت کد فعالسازی وجود داشته باشه که می خوایم کد random داخلش ذخیره کنیم که ما اینجا اسم این فیلد رو verifyaccountcode گذاشتیم
یک فیلدم به نام confirmed از نوع boolean داریم که پیشفرض بعداز ثبت نام 0 هستش که کاربر با کلیک روی لینک فعالسازی ارسال شده به 1 تغییر میکنه که باعث اکتیو شدن حساب کاربری میشه
خب حالا که جدولمون رو داریم میریم سراغ کنترلری که اکشن register و فعالسازی رو توش بنویسیم
من اینجا همون کنترلر اصلی یعنی site رو اینخاب میکنم و برای اکشن عضویت actionRegister و فعالسازی اکشن actionVerifyaccount($user,$code) رو قرار میدم که پارامتر اولش نام کاربر و پارامتر دوم کد فعالسازی هستش که قبلا برای کاربر ساختیم و از طریق لینک فعالسازی براش فرستادیم
اکشن عضویت:
در این اکشن با تابع rand() یک عدد تصادفی بین 1 تا 10000000 میسازیم و داخل متغییر $verifycode ذخیرش میکنیم
و در قسمت $model->verifyaccountcode کد فعالسازی رو که در بالا ساختیمو بهش میدیم تا داخل دیتابیس در جدول verifyaccountcode ذخیرش کنه که نیاز داریم بهش
دوتا متغییر با نام های $subject و $email می سازیم که داخلشون همون پیغام هایی که در Message.php قرار داده بودیمو فراخانی میکنیم ولی نکته ایی که اینجا هست اینه که باید به $email پارامتر های لازم رو بدیم تا لینک فعالسازی که میسازه درست باشه
$model->name نام کاربر هستش که موقعه ی ثبت نام وارد کرده که واسه ی خوش آمدگویی داخل ایمیلمون ازش استفاده میکنیم
$model->username نام کاربری کاربر هنگام ثبت نام هستش که ساخت لینک فعالسازی بهش نیاز داریم.
$verifycode که همون عدد تصادفی هستش که در بالا ساختیم و داخل دیتابیس ذخیرش کردیم حالا باید این کد رو هم با نام کاربری داخل لینک فعالسازی بفرستیم.
در کد زیر هم:
با دستور if هم بررسیش کردم اگه با موفقیت انجام شد پیغام های زیر رو بسازه
خب بقیه ی قسمتای کد هم که توضیح ندادم مربوط به ذخیره سازی اطلاعات کاربر در دیتابیس هستش که جدا از بحثه
تبریک میگم تا الان لینک فعالسازی رو برای کاربر مورد نظر به ایمیلش ارسال کردید (بدون اینکه وارد بخش اسپم بشه)
حالا لینکی که ساخته شده یک چیزی به شکل زیر هستش:
http://mysite.com/index.php?r=site/verif...de=2975159
حالا باید وقتی کاربر این لینک رو فراخوانی کرد ما بررسی کنیم پارامتر های user و code که برامون میفرسته آیا با مشخصاتی که کاربر موقعه ی ثبت نام وارد کرد مطابقت داره یا نه؟! اگه داشت که مقدار confirmed کاربر رو از 0 به 1 تغییر میدیم که به معنی فعال شدن حساب کاربریه
مثلا داخل لینک بالا باید بگردیم داخل دیتابیس ببینیم کاربری با نام کاربری username = myusername و verifyaccountcode = 2975159 وجود داره یا نه
اینم اکشنی که داخل کنترلر site با نام verifyaccount ساختیم
پارامترهای نام کاربری و کدفعالسازی رو از طریق لینک فعالسازی گرفتیم و در جدول users دنبال کاربری که دقیقا این دو مقدار رو داشته باشن میگیردیم و وقتی پیدا کردیم با دستور $user->confirmed = 1 ; مقدار این فیلد رو به 1 تبدیل و با دستور $user->update() اون رو ذخیره میکنیم که من در اینجا بررسی کردم اگه ذخیره شد پیغام به کاربر نشون بده که با موفقیت اکانتش فعال شده و به بخش login فرستادمش
یک نکنته هم که یادم نرفته داخل فایل php.ini دنبال خط extension=php_openssl.dll بگردین و اگه قبلش ; بود حتما برش دارید
اگه سوال یا مشکلی بود من در خدمتم موفقو پیروز باشید
خب, برای این کار ابتدا ما از یک اکستنشن به نام smtp-mail که از لینک زیر می تونید دانلودش کنید استفاده میکنیم, البته من براتون فایل ویرایش شده ی خودمم قرار دادم که البته زیاد تغییری نکرده فقط charset = utf-8 و ارسال ایمیل با فرمت html و تنظیمات و شخصی سازیایی از این قبیلو انجام دادم که اگه خواستید می تونید از همین فایل خودم استفاده کنید.
http://www.yiiframework.com/extension/smtp-mail/
خب فایل رو که دانلود کردید پوشه ی smtpmail رو منتقل کنید به فولدر extension در مسیر protected/extension
حالا فایل تنظیمات main.php واقع در مسیر protected/config/main.php رو باز کنید و کد زیر رو به خط کامپوننت ها اضافه کنید:
// application components 'components'=>array( 'Smtpmail'=>array( 'class'=>'application.extensions.smtpmail.PHPMailer', 'Host'=>"smtp.mail.yahoo.com", 'Username'=>'myemail@yahoo.com', 'Password'=>'myemailpassword', 'Mailer'=>'smtp', 'Port'=>465, 'SMTPAuth'=>true, ),
توضیحات مختصر درباره ی کد بالا اینکه host در اینجا مسیر smtp مربوط به سایت یاهو هستش که اگه شما سایت خودتون رو بخواید بذارید به شکل smtp.yourdomin.com یا smtp.mail.domin.com یا بسته به سرور شما فرق میکنه مثلا برای جیمیل smtp.gmail.com هستش.
username هم آدرس ایمیلی که می خواید باهاش ارسال کنید (این آدرس حتما باید متعلق به تنظیمات host که در بالا گفتیم باشه)
password رمز عبور ایمیل شما
پورت هم می تونید تو گوگل سرچ کنید و پورد smtp سایتای مختلف رو پیدا کنید مثلا برای گوگل و یاهو همین 465 هست ولی واسه ی سایت شما ممکنه 25 باشه
حالا شما یک class در پوشه ی components واقع در protected/components ایجاد کنید (من اسمشو گذاشتم Tools.php)
محتوای این فایل به صورت زیر:
<?php class Tools { public static function mailSend($to,$subject, $message) { $mail = Yii::app()->Smtpmail; $mail->SetFrom('myemail@yahoo.com', 'متن دلخواه'); $mail->Subject = $subject; $mail->MsgHTML($message); $mail->SMTPSecure = 'ssl'; $mail->SMTPDebug=1; $mail->AddAddress($to, ""); return $mail->Send(); } }
خب اسم این متد استاتیک رو mailSend گذاشتیم که پارامتر هایی که میگیره به ترتیب = ایمیل گیرنده, موضوع ایمیل, متن اصلی ایمیل هستش که جلوتر روش استفادشو بهتون آموزش میدم
یک فایل کلاس دیگه هم در این فولد components با نام Message ایجاد میکنیم (این کار صرفا برای راحتی کارامون در ارسال ایمیل هستش که پیغام هایی که می خوایم واسه ی هر موضوع خاصی بفرستیم مدیریت شده باشه)
محتوی فایل Message.php
<?php class Message { public static function subjectVerifyAccount() { return 'فعالسازی حساب کاربری سایت mysite.com'; } public static function verifyAccount($name,$user,$verifycode) { return '<p style="direction: rtl;">'.$name.' عزیز از انتخاب سایت ما تشکر می نماییم. </p><br><p style="direction: rtl;">لطفا برای فعالسازی اکانت کاربری خود برروی لینک زیر کلیک و یا آن را در آدرس بار مرورگر خود کپی و بارگذاری کنید.</p><br><a href="'.Yii::app()->homeUrl.'index.php?r=site/verifyaccount&user='.$user.'&code='.$verifycode.'">'.Yii::app()->homeUrl.'index.php?r=site/verifyaccount&user='.$user.'&code='.$verifycode.'</a>'; } }
خب این کلاس حاوی دوتا متد استاتیک هستش که اولی موضوع ایمیل ماست و دومی متن اصلی پیام که پارامترهایی میگیره که برای ساخت لینک فعالسازی بدردمون می خوره = اولیش که نام کاربرو میگیریم که خوش آمد بگیم دومی نام کاربری فرد که موقعه ی ثبت نام وارد کرده و سومی کد فعالسازی هست که در ادامه بهش میرسیم
این نکته هم در نظر بگیرید که لینک فعالسازی که من ساختم با توجه به حالت پیشفرض آدرس دهی های خود فریمورک هستش و اگه با urlmanager آدرس دهی رو تغییر دادین باید این لینک هم ویرایش کنین
حالا باید داخل جدول کاربرامون داخل دیتابیس حتما این فیلد هارو داشه باشیم
نام جدول در اینجا users گذاشتیم
فیلد نام کاربری حتما داشته باشه که ما username گذاشتیم
فیلد ایمیل حتما داشته باشه که ما اینجا اسمشو email گذاشتیم
فیلدی برای ثبت کد فعالسازی وجود داشته باشه که می خوایم کد random داخلش ذخیره کنیم که ما اینجا اسم این فیلد رو verifyaccountcode گذاشتیم
یک فیلدم به نام confirmed از نوع boolean داریم که پیشفرض بعداز ثبت نام 0 هستش که کاربر با کلیک روی لینک فعالسازی ارسال شده به 1 تغییر میکنه که باعث اکتیو شدن حساب کاربری میشه
خب حالا که جدولمون رو داریم میریم سراغ کنترلری که اکشن register و فعالسازی رو توش بنویسیم
من اینجا همون کنترلر اصلی یعنی site رو اینخاب میکنم و برای اکشن عضویت actionRegister و فعالسازی اکشن actionVerifyaccount($user,$code) رو قرار میدم که پارامتر اولش نام کاربر و پارامتر دوم کد فعالسازی هستش که قبلا برای کاربر ساختیم و از طریق لینک فعالسازی براش فرستادیم
اکشن عضویت:
public function actionRegister() { $model = new Users(); $verifycode = rand(1,10000000); $model->confirmed = 0; if(isset($_POST['Users'])) { $model->attributes = $_POST['Users']; $model->verifyaccountcode = $verifycode; $subject = Message::subjectVerifyAccount(); $email = Message::verifyAccount($model->name,$model->username,$verifycode); if(Tools::mailSend($model->email, $subject, $email)) { Yii::app()->user->setFlash('verifyaccount','لینک فعالسازی برای ایمیل شما ارسال گشت لطفا به ایمیل خود مراجعه کنید.'); }else{ Yii::app()->user->setFlash('verifyaccount','مشکلی در ارسال ایمیل فعالسازی برای شما به وجود آماده است.'); } if($model->save()) { $this->redirect(array('login')); } } $this->render('register', compact('model')); }
در این اکشن با تابع rand() یک عدد تصادفی بین 1 تا 10000000 میسازیم و داخل متغییر $verifycode ذخیرش میکنیم
و در قسمت $model->verifyaccountcode کد فعالسازی رو که در بالا ساختیمو بهش میدیم تا داخل دیتابیس در جدول verifyaccountcode ذخیرش کنه که نیاز داریم بهش
دوتا متغییر با نام های $subject و $email می سازیم که داخلشون همون پیغام هایی که در Message.php قرار داده بودیمو فراخانی میکنیم ولی نکته ایی که اینجا هست اینه که باید به $email پارامتر های لازم رو بدیم تا لینک فعالسازی که میسازه درست باشه
$model->name نام کاربر هستش که موقعه ی ثبت نام وارد کرده که واسه ی خوش آمدگویی داخل ایمیلمون ازش استفاده میکنیم
$model->username نام کاربری کاربر هنگام ثبت نام هستش که ساخت لینک فعالسازی بهش نیاز داریم.
$verifycode که همون عدد تصادفی هستش که در بالا ساختیم و داخل دیتابیس ذخیرش کردیم حالا باید این کد رو هم با نام کاربری داخل لینک فعالسازی بفرستیم.
در کد زیر هم:
if(Tools::mailSend($model->email, $subject, $email))متدی که در فایل Tools.php ساخته بودیم رو فراخوانی کردیم و پارامترهای مورد نیازشو بهش دادیم = ایمیلی که کاربر برای ثبت نام وارد کرده, موضوع ایمیل(در بالا توضیحش دادم), متن کامل پیام(در بالا توضیحش دادم)
با دستور if هم بررسیش کردم اگه با موفقیت انجام شد پیغام های زیر رو بسازه
خب بقیه ی قسمتای کد هم که توضیح ندادم مربوط به ذخیره سازی اطلاعات کاربر در دیتابیس هستش که جدا از بحثه
تبریک میگم تا الان لینک فعالسازی رو برای کاربر مورد نظر به ایمیلش ارسال کردید (بدون اینکه وارد بخش اسپم بشه)
حالا لینکی که ساخته شده یک چیزی به شکل زیر هستش:
http://mysite.com/index.php?r=site/verif...de=2975159
حالا باید وقتی کاربر این لینک رو فراخوانی کرد ما بررسی کنیم پارامتر های user و code که برامون میفرسته آیا با مشخصاتی که کاربر موقعه ی ثبت نام وارد کرد مطابقت داره یا نه؟! اگه داشت که مقدار confirmed کاربر رو از 0 به 1 تغییر میدیم که به معنی فعال شدن حساب کاربریه
مثلا داخل لینک بالا باید بگردیم داخل دیتابیس ببینیم کاربری با نام کاربری username = myusername و verifyaccountcode = 2975159 وجود داره یا نه
اینم اکشنی که داخل کنترلر site با نام verifyaccount ساختیم
public function actionVerifyaccount($user,$code) { $criteria = new CDbCriteria; $criteria->addColumnCondition(array( 'username' => $user, 'verifyaccount' => $code )); $user = Users::model()->find($criteria); $user->confirmed = 1; if($user->update()) { Yii::app()->user->setFlash('verifysuccess','اکانت شما با موفقیت فعال شد. می توانید از طریق فرم زیر وارد حساب کاربری خود شوید.'); $this->redirect(array('login')); }else{ Yii::app()->user->setFlash('verifysuccess','خطا در فعالسازی!')); $this->redirect(array('login')); } }
پارامترهای نام کاربری و کدفعالسازی رو از طریق لینک فعالسازی گرفتیم و در جدول users دنبال کاربری که دقیقا این دو مقدار رو داشته باشن میگیردیم و وقتی پیدا کردیم با دستور $user->confirmed = 1 ; مقدار این فیلد رو به 1 تبدیل و با دستور $user->update() اون رو ذخیره میکنیم که من در اینجا بررسی کردم اگه ذخیره شد پیغام به کاربر نشون بده که با موفقیت اکانتش فعال شده و به بخش login فرستادمش
یک نکنته هم که یادم نرفته داخل فایل php.ini دنبال خط extension=php_openssl.dll بگردین و اگه قبلش ; بود حتما برش دارید
اگه سوال یا مشکلی بود من در خدمتم موفقو پیروز باشید