آموزش های وردپرس

در شرح پلاگین tiny mass mailer

بسم الله الرحمن الرحیم

سلام

ماه رمضان کریم تهنیت و شهادت اول مظلوم عالم تسلیت باد.

از این پس شرح برخی پروژه های وردپرس رو اینجا خواهم گفت تا شاید برای خودم و احیانا کس دیگه ای مفید واقع بشه و به کارش بیاد.

 

این بار میریم سراغ:

پلاگین TinyMass Mailer یا میلر ریز

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

  • اول اینکه پلاگین باید تا حد امکان ساده طراحی بشه تا کاربر رو گیج نکنه
  • هدف اصلی که باعث ساخت این پلاگین شد نیاز به ارسال ایمیل به کلیه یوزرهای سایت بود
  • استفاده از SMTPهای مختلف در آن واحد جهت

خب همه می دونیم که نمونه های مشابه توی بازار موجوده حتی بصورت رایگان و کاملتر،تا حدی که برخی خودشون رو جایگیزین مستقلی برای سرویس Mailchimp می دونن.

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

 

یکی از ویژگی هایی که این پلاگین داره این هست که قابلیت این رو داره که چندین اکانت SMTP بگیره و محدودیت ارسالشو در ساعت رو هم بگیره و بعد شروع به ارسال کنه،بدین صورت امکان اسپم شدن ایمیلها کم و بلاک شدن اکانتها ازبین میره.

 

جزئیات فنی پلاگین TinyMass Mailer یا میلر ریز

رسیدیم به جزئیات فنی و پیاده سازی.

1 اولین کاری که انجام دادم اسم پلاگین رو به “سیستم سازنده پلاگینی” که طراحی کردم دادم تا ساختار اولیه منوها،ادمین،Ajax،کد کوتاه و… همه و همه اتو ساخته بشن،این کار باعث صرفه جویی زیادی میشه،چرا که اکثر کارهای تکراری موجود در ساخت پلاگین حذف میشه.

 

2 اضافاتی که نیاز نبود رو از خروجی سیستم بالا حذف کردم و جاهایی رو کلا بخاطر پلاگین بازنوسی کردم(همیشه یک نوع کد کار رو راه نمیندازه)

 

3 جدولی برای ارسالها در نظر گرفتم،به این صورت:

"CREATE TABLE IF NOT EXISTS `$tiniymassm_sends` (
	      `id` 				bigint(20) NOT NULL AUTO_INCREMENT,
	      `last_user_id` 	varchar(200) NOT NULL,
	      `last_sent_time` 	varchar(200) NOT NULL,
	      `start_date` 		varchar(200) NOT NULL,
	      `end_date` 		varchar(200)  	NULL,
	      `smtp` 			varchar(200) 	NULL,
	      `text` 			text NOT NULL,
	      `subject` 		varchar(200) NOT NULL,
	      `state` ENUM( 'completed' , 'new' ,'canceled' ),
	      PRIMARY KEY (`id`)
	    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;"

این جدول وظیفه داره ارسالها رو نگه داره،چیزهایی مثل آخرین زمان ارسال،آخرین کاربری که ارسال براش انجام شده،شروع و پایان ارسال،موضوع و متن و حالت ارسال که جدید هست یا تمام و یا کنسل شده ؟

بخوانید:  کوئری از سفارشات ووکامرس

4 برای ارسال ایمیل تصمیم گرفتم از کلاس معروف PHPMailer استفاده کنم.

… چون تعداد SMTPها باید توسط کاربر وارد میشد پس گزینه ای گذاشتم برای وارد کردن تعداد توسط کاربر و بعد از اون به مقدار SMTPها تنظیمات مورد نظر رو ایجاد کردم.

هر SMTP با دکمه ای که کنارش گذاشتم قابلیت بررسی صحت تنظیمات رو داشت که برای این مورد از کد زیر استفاده کردم:

		$mail = new PHPMailer();
		$mail->IsSMTP();
		$mail->SMTPDebug = 0;  // debugging: 1 = errors and messages, 2 = messages only
		$mail->SMTPAuth = true;  // authentication enabled
		$mail->SMTPSecure = $secure; // secure transfer enabled REQUIRED for GMail
		$mail->Host = $host;
		$mail->Port = $port;
		$mail->Username = $user;
		$mail->Password = $pass;
		$mail->SetFrom($user, $user);
		$mail->Subject = 'SMTP Test From tinymassmailer';
		$mail->Body = 'SMTP Test From tinymassmailer';
		$mail->AddAddress($user);
		if(!$mail->smtpConnect()) {
			// return $mail->ErrorInfo;
			return 'Error!';
		} else {
			return  'OK!';
		}

خب حالا پلاگین باید در هر اجرای وردپرس از جدولی که ساخته شده بود اولین ارسال جدید رو واکشی کنه

		$tiniymassm_sends =$wpdb->prefix.'tiniymassm_sends';
		$result = $wpdb->get_results("SELECT * from $tiniymassm_sends where `state`='new' limit 1");
		//if no emails for send
		if(count($result) == 0) return;
		//

و آخرین ساعت ارسالش رو هم بررسی کنه و درصورتی که از از یک ساعت کمتر هست خاموش و در صورت بیشتر بودن از یک ساعت فعال بشه و با توجه به فیلد آخرین کاربر مابقی کاربرها رو ارسال کنه.

		//if one hour not ended
		if( (time() - $result[0]->last_sent_time) < 3600) return;
		//

برای تداخل اجرای همزمان به هنگام اجرا فایلی با نام .in_process ساخته میشه که پس از اجرا حذف میشه و درصورت وجود این فایل عملیات ارسال انجام نمیشه چرا که پرسه ی دیگه ای در حال انجام هست.

		//if sending is in process
		if(file_exists(_tinymassmailer_DIR.'.in_process')) return;
		//

در نهایت باید پس از اتمام کار به مدیریت اطلاع رسانی بشه و وضعیت کار به Completed تغییر پیدا کنه.

 

Related Posts

1 فکر در مورد “ در شرح پلاگین tiny mass mailer

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *