PDA

View Full Version : سوال: کنترل زمانی ارسال ایمیل



ندااحمدی
شنبه 05 آذر 1390, 16:58 عصر
می خواهم طوری ایمیل فرستاده شود که کنترل زمانی داشته باشد به عنوان مثال هر ایمیلی که فرستاده میشود پنج ثانیه صبر کند بعد ایمیل بعدی فرستاده شود

fakhravari
شنبه 05 آذر 1390, 17:13 عصر
System.Threading.Thread.Sleep(5000);

meisam3322
شنبه 05 آذر 1390, 18:03 عصر
یه حلقه دست کن، توی حلقه همانطور که دوستمون گفت از دستور Sleep استفاده کن. فراموش نکن که مقادیری که تابع Sleep میگیره بر حسب میلی ثانیه هست. باقی قضیه و کد نویسیش رو میتونی با هر ترفند و روشی که آشنایی انجام بدی. این اصول و الگوریتم کار بود.

موفق باشی

Javad_Darvish_Amiry
شنبه 05 آذر 1390, 18:32 عصر
اگه ارسال ایمیلِ مد نظرتون، توی ترید اصلی که داره پردازش HttpRequest جاری رو انجام میده باشه، Sleep کردن به احتمال زیاد باعث میشه سرور برنامه تون رو shut-down کنه (یا به خاطر execute-time طولانی برنامه یه خطا پرتاب کنه) که این امر بستگی داره به این که چقدر به منابع سرور دسترسی داشته باشید و سرور تو اون لحظه (اجرای کد ارسال ایمیل شما) چقدر مشغول باشه (با توجه به این که به احتمال زیاد دارین از shared hosting استفاده میکنید) و تعداد ایمیل هایی که میخواید بفرستید چقدر باشه. روش مطئن تر به نظر میرسه اینه که با HttpCache-Callback کار کنید. یعنی بعد از ارسال ایمیل اول یه آیتمی (هر چیزی، مثلا یه new object) به کش اضافه کنید با طول عمر 5 ثانیه؛ برای callbackش دوباره متود ارسال ایمیل فراخوانی بشه و اگه لیست، آیتم بعدی داشت به همین ترتیب ادامه بده تا لیست خالی بشه. یعنی بعد از هر ارسال، آیتمی به کش اضافه بشه و تو کالبکش دوباره متود ارسال فراخوانی بشه. این روش خاصیتش اینه که بعد از ارسال ایمیل اول، ترید جاری آزاد میشه و پردازش رکوئست جاری به پایان میرسه. سربار زیادی هم برای سرور نداره و احتمال shut-down برنامه خیلی میاد پایین. ولی در هر صورت دو تا نکته مهم هست: 1- اینکه اول روش بالا که دوستان توضیح دادن رو امتحان کنید (چون در هر صورت ساده تر و سر راست تر هست و ضمنا نتیجه هم بلافاصله مشخصه که چه تعداد ایمیل با موفقیت ارسال شد). و اگه نشد برید سراغ روش های دیگه از جمله روشی که بنده خدمتتون عرض کردم. 2- اینکه حتی در صورت روش دوم (که به نظر بهینه ترین روش هست) باز هم اگه روی shared server باشید، احتمال وجود مشکل هست. برای رهایی از مشکل توی مورد دوم، میتونید یه لاگ از ایمیل های ارسالی درست کنید و اونایی که ارسال نشدن رو دوباره بفرستید.

آپدیت:

در مورد کش که دوستمون دو سه تا پست پایین تر فرمودن، باید مطلبی رو اضافه کنم. ولی چون در راستای سوال اصلی نیست، بجای پست مجدد همینو آپدیت میکنم؛
خوب یکی این که شیئ که برای کش در نظر میگیرید باید خیلی سبک باشه؛ مثلا یه new object؛ دوم اینکه عمر شیئ تو کش رو باید بیارید پایین تا دچار مشکل حذف ناخواسته نشید؛ سوم اینکه چه حذف شیئ از کش طبق زمانبندی شما باشه و چه نباشه، callbackش فراخوانی میشه؛ پس در هر صورت شما امکان مدیریت رو دارید؛ میتونید تایم رو چک کنید و اگه حذف آیتم از کش ناخواسته بوده، کاری انجام نشه و صرفا سیکل حفظ بشه؛ برای اینکه تایم رو هم از دست ندید میتونید یه datetime استاتیک داشته باشید، که تو کل اپلیکیشن اشتراک گذاشته بشه؛ از طرف دیگه، کدی که جناب نیری (ابیدار) ارائه کردن، از System.Timers.Timer استفاده میکنن که هزینه اش برای برنامه خیلی گزاف تر از اینه که یه object سبک رو بخواد تو کش نگه داره؛ یعنی احتمال اینکه بخاطر تایمر مورد نظر، کل اپلیکیشن shut-down بشه خیلی بیشتر از اینه که یه new object بخواد از کش پاک بشه (البته مدیریت کش دست شماست و بستگی به این هم داره که شما کلا تو برنامه چه رفتاری نسبت به کش داشتین؛ اما خود این هم مزیته؛ چون کنترل کش دست ماست؛ میتونیم مدیریتش کنیم؛ طوری برنامه ریزی کنیم که احتمال پاک شدن شیئمون خیلی بیاد پایین؛ اما مدیریت Timer دست ما نیست. سرور هر وقت تشخیص داد، میتونه کل اپلیکیشن رو بخوابونه). همه این صحبتا در شرایطی هست که شما روی سرور اشتراکی باشید یا مثلا VPS ارزون قیمت. اما اگه یه سرور اختصاصی یا مجازی مناسب داشته باشیم، یا حتی روی یه اشتراکی خوب و درست و حسابی باشیم، این مشکلاتو نداریم و راه حل جناب نیری بسیار هم ایده آل هست. -که سرور خوب هم معمولا تو ایران گیر نمیاد. سرور x که خیلی هم اسم و رسم دار هست و قیمتاش هم از بقیه بالاتر، رو هر ماشین بین 250 تا 300 تا سایت رو میزبانی میکنه و الخ...-
در مورد راه حل های ارائه شده، من با این روش کار کردم، از روش ترید هم استفاده کردم؛ اما ترید جداگانه هم همون مشکلو داشت. در مورد راه حل آقای نیری هم یکی دیگه از دوستان 2 سال پیش یه پروژه ای رو با راه حل ایشون انجام داد، که به همون مشکل برخورد و مجبور شد کدش رو برگردونه به استفاده از cache-callback.
آرزوی سلامتی و موفقیت.

aserfg
شنبه 05 آذر 1390, 19:23 عصر
می خواهم طوری ایمیل فرستاده شود که کنترل زمانی داشته باشد به عنوان مثال هر ایمیلی که فرستاده میشود پنج ثانیه صبر کند بعد ایمیل بعدی فرستاده شود
استفاده از webtaskSchedule برای وظایف زمان بندی شده استفاده می شود . در همین سایت کتابخانه ای برای این کار معرفی شده است .

iman_ad
شنبه 05 آذر 1390, 20:12 عصر
webtaskSchedule گزینه مناسبی
من کلا تو دیتابیس یک جدول دارم که به جای اینکه از طوی برنامه مستقیم ایمیل بفرستم یک رکورد داخل دیتابیس ثبت می کنم که مشخصات ایمیلی که باید ارسال بشه در اون ثبت می شه مثل فرستنده، گیرنده، متن ایمیل و ...
بعد یک تسک تعریف می کنم که مثلا هر 30 ثانیه یکبار اجرا می شه بستگی به تنظیمات خودت می تونی تو هر اجرا هر چنتا ایمیل که خواستی بفرستی اگه موفقیت آمیز بود یک فلگ تو دیتابیس بزاری که ایمیل فرستاده شد اینطوری می تونی حتی تاریخ فرستاده شدن، تعداد دفعات تلاش برای فرستادن، ... لاگ کنی کلی ایده دیگه که می تونی اجرا کنی مثلا چندتا ترد تعریف کنی و با هر ترد از یک آدرس ایمیل ارسال کنی ...
http://abidar.codeplex.com/
اینم آدرس تسک آقای ابیدار
در ضمن روش کش خیلی مطمئن نیست چون ممکنه سرور برای خلاص شدن از سربار کش به صورت غیر مدیریت شده توسط شما پاک کنه.
در مورد روشی هم که توضیح دادم ممکنه مجبور شی زمان اجرای تسک بالا ببری به خاطر محدودیت های که هاستینگ ها ایجاد می کنن برای کرل تسک ولی معمولا فقط زمان اجرای تسک شما عقب می افته.

ندااحمدی
یک شنبه 06 آذر 1390, 16:20 عصر
این کدهای فرستادن ایمیل من است چطور باید کد بنویسم که این زمانبندی در فرستادن ایمیل رعایت شود
لطفا در کدهایش راهنمایی کنید
public void SendEmail(string Email ,string mBody ,string mSubject ,string message)
{
try{
hatra.lang ln = new hatra.lang(ref oMess);
string strBody=mBody;
string strSiteAddress = (new hatra.settings(ln.LangId.ToString(), ref oMess)).Settings_SiteAddress;
strBody=strBody.Replace("[Email]",Email);
strBody=strBody.Replace("[SiteAddress]",strSiteAddress);
System.Net.Mail.MailMessage objMailMsg=new System.Net.Mail.MailMessage();
System.Net.Mail.MailAddress addressFrom=new System.Net.Mail.MailAddress("info@"+strSiteAddress);
System.Net.Mail.MailAddress addressTo=new System.Net.Mail.MailAddress(Email);
objMailMsg.From=addressFrom;
objMailMsg.To.Add(addressTo);
objMailMsg.Subject=mSubject;
objMailMsg.Body=strBody;
objMailMsg.BodyEncoding=System.Text.Encoding.UTF8;
objMailMsg.IsBodyHtml=true;
System.Net.Mail.SmtpClient smtp=new System.Net.Mail.SmtpClient();
smtp.Host="mail."+strSiteAddress;
smtp.Send(objMailMsg);
message = "ايميل با موفقيت ارسال شد";
oMess.addMessage(
hatra.MessageTypes.Message,
"SNSEEMM0169",
"ايميل با موفقيت ارسال شد",
"SendToNewsLetterMember",
hatra.MessageStatus.Successful
);

}catch(Exception ex){
oMess.addMessage(
hatra.MessageTypes.Error,
"SNSEEME0170",
"خطا در پايگاه داده: "+ex.Message.ToString(),
ex.Source,
hatra.MessageStatus.Fail
);

}

}