Forum
Arkadaşlar Otomatik mail gönderme projesinde bitime geldim yalnız bir
detay da takıldım, mailler istediğim kadar gönderebiliyorum,istediğim
tarihte başlatabiliyorum,fakat aynı tarihte başlattıklarımı sıraya
koymak istiyorum öneğin birisi gönderdi onun ki gitsin, bir başka
kullanıcı gönderdiği zaman ise daha öncekinin gönderimi bitene kadar
kuyrukta yazsın. bunu nasıl yapabilirm.
Servis içerisinde şöyle bir kontrol yapılabilir mesela. Gönderimi başlayan maillerini durumunu 1 olarak update edin, gönderim tamamlandıktan sonra durumu 2 olarak tekrar update edin.
Böylece gönderim yapmadan önce durumu 1 olanları check edersiniz. 1 olan varsa gönderim yapmazsınız. Böylece sistemde gönderim halinde olan işler bitmeden yeni bir gönderimi başlatmamış olursunuz.
Teşekkürler uygulamaya dahil atcem. Umarım istediğim sonucu alırım.
Sizin Dediğiniz Şekilde yaptım fakat şimdide şöyle bir mantık hatasıyla karşılaştım;
Maili istediğim kadar
gönderebiliyorum, fakat 2. kişiye göndermek istediğimde mail sınırsız
döngüye giriyor ve devamlı mail gönderiyor. Yaptığım mantık ise; Mail
web serviste ki timer nesnesi ile belirlenen süre aralıklarında mail
gönderiyor, her gönderimi kaç adet olcağını web formdan seçip değişkene
atıyorum ve gönderim bittiğinde gönderilen veriyle karşılaştırıp
bittiyse sonuc değişkenine 1 yazdırıyorum. Klasik oto mail gönderme
mantığı. tek tek gönderdiğimde de sorun yok gayet güzel bir şekilde
maillerim yerlerine ulaşıyor. Benim problemim üst üste birden fazla mail
gönderdiğimde ilkinden sonra 2. sinin sonsuz döngüye girmesi. Bunu
nasıl engelleyebilirm yardımlarınızı bekliyorum.
Kodlara bakabilir miyim.
Sınırsız döngüye girmek gibi birşey söz konusu değil. Bir yerde yanlış yapıyorsunuzdur.
Timer elapsed eventinde gönderim yapılır. Fakat bu gönderimi yapması içinde veritabanında gönderim bekleyen var mı diye bakar. Yoksa gönderim yapmaz. Böylece her elapsed durumunda sadece gönderim var mı diye check etmiş olur. Servis durmaz, sürekli aktif olur. Bekleyen mail varsa gönderir. Her gönderiminde o maili gönderildi olarak işaretler (update status = 1)
Ferhat Bey Web servis kodlarım şu şekilde;
public void Main()
{
timer1.Interval = 10000;
timer1.Elapsed += new ElapsedEventHandler(SaatMail);
timer1.Start();
}
public void SaatMail(object sender, ElapsedEventArgs e)
{
//kayıt yapılan en son değeri dataread yardımıyla çekerek, mail gonder servisine gönderiyor.
SqlConnection baglanti = new SqlConnection("");
SqlCommand komut = new SqlCommand("select
OtoMailID,Adet,BasTarih,Aciklama,Kime from OtoMail where Sonuc=0 ",
baglanti);
baglanti.Open();
SqlDataReader dr = komut.ExecuteReader();
if (dr.Read())
{
Sayi = Convert.ToInt32(dr["Adet"]);
Kime = (dr["Kime"].ToString());
BasTarih = Convert.ToDateTime(dr["BasTarih"]);
OtoMailID = Convert.ToInt32(dr["OtoMailID"]);
Aciklama = (dr["Aciklama"].ToString());
dr.Dispose();
}
//istenilen sayı kadar mail gödnermeye yarıyor.
mailgonder(Sayi, Kime, islemdeger, Aciklama);
baglanti.Close();
}
private void mailgonder(int Sayi, string Kime, int islemdeger, string Aciklama)
{
MailMessage mvMail = new MailMessage();
mvMail.To = Kime;
mvMail.From = "[email protected]";
mvMail.Body = Aciklama;
mvMail.Subject = "OTOMATİK BİLGİLENDİRME MAİL";
SmtpMail.SmtpServer = "mailserver.info.com";
//Baslama Tarih Karşılaştırmasını Burdan Başlat
BasTarih = Convert.ToDateTime(BasTarih);
Suan = DateTime.Now;
Suan1 = Suan.ToString("dd.MM.yyyy");
BasTarih1 = BasTarih.ToString("dd.MM.yyyy");
if (Suan1 == BasTarih1)
{
SmtpMail.Send(mvMail);
i++;
if (i == Sayi)
{
SqlConnection baglanti5 = new SqlConnection(@"");
SqlCommand ekle = new SqlCommand("update OtoMail set Sonuc=@Sonuc where
OtoMailID=@OtoMailID ", baglanti5);
baglanti5.Open();
ekle.Parameters.AddWithValue("@Sonuc", 1);
ekle.Parameters.AddWithValue("@OtoMailID", OtoMailID);
ekle.ExecuteNonQuery();
islemdeger = 1;
baglanti5.Close();
baglanti5.Dispose();
ekle.Dispose();
timer1.Dispose();
timer1.Close();
timer1.Enabled = false;
timer1.Stop();
}
}
veri tabanına girdiğim kayıtları 0 olarak kaydediyorum burdan sonuc 0
olanları mail gönderiyorum eğer adet hücremdeki değer sağlanıyorsa
sonuc değişkenini 1 yapıyorum .
Default sayfamda ise sadece istenen değerleri vt ekliyorum ve servisi çağırıyorum.
sqlcommand'da where sonuc= 0 diyerek, gönderilmek üzere bekleyen mailleri check ediyorsunuz. fakat daha sonra sadece tek kayıt için işlem yapıyorsunuz. bu sorgu sonucunda birden fazla gönderim bekleyen data dönebilir. if(dr.Read()) yerine while döngüsüyle kayıt olduğu sürece bu işlemi yapmanız gerekir.Yani. if(dr.Read()) yerine şunu kullanın.
while(dr.Read())
{
//
}
mailgonder(Sayi, Kime, islemdeger, Aciklama); metodunu da while kodunun içine koyun. yani her kayıtta gönderim işlemini yapsın.
Sizin dediğiniz yöntemle yaptım fakat bu seferde sınırsız mail gönderiyor.
Ben size kendi projem için yazdığım mail gönderme "windows service" ini göstereyim. Kodları inceleyip kendinize göre düzenlersiniz. Her gün binlerce mail gönderiyor son 1 senedir. Herhangi bir problem yaşamadım.
partial class OykuMailServisi : ServiceBase
{
public OykuMailServisi()
{
InitializeComponent();
}
Timer timer = new Timer();
protected override void OnStart(string[] args)
{
// TODO: Add code here to start your service.
timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
timer.Interval = 60000;
timer.Enabled = true;
WriteEvent("Servis basladi.");
}
protected override void OnStop()
{
// TODO: Add code here to perform any tear-down necessary to stop your service.
timer.Enabled = false;
WriteEvent("Servis durduruldu.");
}
private void OnElapsedTime(object source, ElapsedEventArgs e)
{
StartMailing.Gonder();
}
private System.Diagnostics.EventLog OlayLog;
void WriteEvent(string islem)
{
OlayLog = new EventLog();
if (!System.Diagnostics.EventLog.SourceExists("OykuMailServisi"))
{
System.Diagnostics.EventLog.CreateEventSource("OykuMailServisi", "OykuMailServisi");
}
OlayLog.Source = "OykuMailServisi";
OlayLog.WriteEntry(islem, EventLogEntryType.Information);
}
}
public static class StartMailing
{
public static void Basla()
{
try
{
// "islemde" olan emir varsa (status=1) islem yapma
if (new BultenBekleyenEmirlerTableAdapter().GetDataByIslemde().Rows.Count == 0)
{
// bekleyen işlem ID leri al
DataSetBultenBekleyenEmirler.BultenBekleyenEmirlerDataTable dtBekleyen = new BultenBekleyenEmirlerTableAdapter().GetDataBySiradaki();
if (dtBekleyen.Rows.Count != 0)
{
DataSetBultenBekleyenEmirler.BultenBekleyenEmirlerRow dr = dtBekleyen.Rows[0] as DataSetBultenBekleyenEmirler.BultenBekleyenEmirlerRow;
// Status'u 1 yap -islemde
new BultenBekleyenEmirlerTableAdapter().UpdateSetStatus(1, dr.ID);
// set startdate
new BultenBekleyenEmirlerTableAdapter().UpdateStartDate(dr.ID);
// maili duzenle
string mailBody = PublicFunctions.GetHtml(domain + "/Contents/Bulletin.aspx?IsMail=1&BultenID=" + dr.BultenID);
// kitleye gonder
string newBody = mailBody;
DataSetBultenUyeler.BultenUyelerDataTable dt = new BultenUyelerTableAdapter().GetDataByActive();
foreach (DataSetBultenUyeler.BultenUyelerRow item in dt)
{
newBody = newBody.Replace("[lnkUyeliktenCik]", domain + "/Contents/Exit.aspx?UserID=" + item.UserID);
SendMail(newBody, item.Email.Trim().ToString(), dr.Konu);
}
// Status'u 2 yap - tamamlandı
new BultenBekleyenEmirlerTableAdapter().UpdateSetStatus(2, dr.ID);
// Tamamlanma tarihi
new BultenBekleyenEmirlerTableAdapter().UpdateCompleteDate(dr.ID);
}
}
}
catch (Exception ex)
{
new Bilgipark.Data.DataSetBultenLoglarTableAdapters.BultenLoglarTableAdapter().Insert("Hata : " + ex.Message + ex.StackTrace, "servis");
}
}
public static void Gonder()
{
new Thread(new ThreadStart(Basla)).Start();
}
}
Ben size kendi projem için yazdığım mail gönderme "windows service" ini göstereyim. Kodları inceleyip kendinize göre düzenlersiniz. Her gün binlerce mail gönderiyor son 1 senedir. Herhangi bir problem yaşamadım.
partial class OykuMailServisi : ServiceBase
{
public OykuMailServisi()
{
InitializeComponent();
}Timer timer = new Timer();
protected override void OnStart(string[] args)
{
// TODO: Add code here to start your service.
timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
timer.Interval = 60000;
timer.Enabled = true;
WriteEvent("Servis basladi.");
}protected override void OnStop()
{
// TODO: Add code here to perform any tear-down necessary to stop your service.
timer.Enabled = false;
WriteEvent("Servis durduruldu.");
}private void OnElapsedTime(object source, ElapsedEventArgs e)
{
StartMailing.Gonder();
}private System.Diagnostics.EventLog OlayLog;
void WriteEvent(string islem)
{
OlayLog = new EventLog();if (!System.Diagnostics.EventLog.SourceExists("OykuMailServisi"))
{
System.Diagnostics.EventLog.CreateEventSource("OykuMailServisi", "OykuMailServisi");
}
OlayLog.Source = "OykuMailServisi";
OlayLog.WriteEntry(islem, EventLogEntryType.Information);
}
}public static class StartMailing
{
public static void Basla()
{
try
{
// "islemde" olan emir varsa (status=1) islem yapma
if (new BultenBekleyenEmirlerTableAdapter().GetDataByIslemde().Rows.Count == 0)
{
// bekleyen işlem ID leri al
DataSetBultenBekleyenEmirler.BultenBekleyenEmirlerDataTable dtBekleyen = new BultenBekleyenEmirlerTableAdapter().GetDataBySiradaki();if (dtBekleyen.Rows.Count != 0)
{
DataSetBultenBekleyenEmirler.BultenBekleyenEmirlerRow dr = dtBekleyen.Rows[0] as DataSetBultenBekleyenEmirler.BultenBekleyenEmirlerRow;// Status'u 1 yap -islemde
new BultenBekleyenEmirlerTableAdapter().UpdateSetStatus(1, dr.ID);
// set startdate
new BultenBekleyenEmirlerTableAdapter().UpdateStartDate(dr.ID);// maili duzenle
string mailBody = PublicFunctions.GetHtml(domain + "/Contents/Bulletin.aspx?IsMail=1&BultenID=" + dr.BultenID);
// kitleye gonder
string newBody = mailBody;
DataSetBultenUyeler.BultenUyelerDataTable dt = new BultenUyelerTableAdapter().GetDataByActive();
foreach (DataSetBultenUyeler.BultenUyelerRow item in dt)
{
newBody = newBody.Replace("[lnkUyeliktenCik]", domain + "/Contents/Exit.aspx?UserID=" + item.UserID);
SendMail(newBody, item.Email.Trim().ToString(), dr.Konu);
}// Status'u 2 yap - tamamlandı
new BultenBekleyenEmirlerTableAdapter().UpdateSetStatus(2, dr.ID);// Tamamlanma tarihi
new BultenBekleyenEmirlerTableAdapter().UpdateCompleteDate(dr.ID);
}
}
}
catch (Exception ex)
{
new Bilgipark.Data.DataSetBultenLoglarTableAdapters.BultenLoglarTableAdapter().Insert("Hata : " + ex.Message + ex.StackTrace, "servis");
}
}public static void Gonder()
{
new Thread(new ThreadStart(Basla)).Start();
}
}
Program windows formda gayet iyi çalışıyor uyarladım fakat web forma uyarlayınca yine mantık hatası vermeye başladı, art arda gönderdiğim 4-5 tane maili gayet güzel gönderiyor,fakat 5 den fazla olduğu zaman yine sonsuz döngüye giriyor bu mantık hatasını nasıl düzeltebilirim.