Forum

Mail mantık hatası
 
Bildirimler
Hepsini Temizle

Mail mantık hatası

11 Yazılar
2 Üyeler
0 Reactions
570 Görüntüleme
(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

   public void Main()
        {
            timer1.Interval = 10000;
            timer1.Elapsed += new ElapsedEventHandler(SaatMail);
            timer1.Start();
          
        }

       
     public void SaatMail(object sender, ElapsedEventArgs e)
    {

            timer1.Stop();

            //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();
            SqlDataAdapter da = new SqlDataAdapter();
            //komut.ExecuteNonQuery();
            da.SelectCommand = komut;
            DataTable dt=new DataTable();
            
            da.Fill(dt);
           
        
         foreach(DataRow dr in dt.Rows)
        {

           
            Sayi = Convert.ToInt32(dr["Adet"]);
            Kime = (dr["Kime"].ToString());
            BasTarih = Convert.ToDateTime(dr["BasTarih"]);
            OtoMailID = Convert.ToInt32(dr["OtoMailID"]);
            Aciklama = (dr["Aciklama"].ToString());
           
           
                SqlConnection baglanti5 = new SqlConnection(@"");
                SqlCommand ekle = new SqlCommand("update OtoMail set Sonuc=@Sonuc where OtoMailID=@OtoMailID ", baglanti5);
                baglanti5.Open();
                mailgonder(Sayi, Kime, islemdeger, Aciklama);
                ekle.Parameters.AddWithValue("@Sonuc", 1);
                ekle.Parameters.AddWithValue("@OtoMailID", OtoMailID);
                ekle.ExecuteNonQuery();

                islemdeger = 1;

              
                baglanti5.Close();
                baglanti5.Dispose();
                ekle.Dispose();
       
        }
         timer1.Start();
           
    }

     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";

         int i = 0;

         while (i < Sayi)
         {
             SmtpMail.Send(mvMail);
             i++;
         }
        
     }

 

Arkadaşlar yukarıda ki fonksiyon çalışıyor.  adet belirttiğim zaman istediğim adet kadar mail gönderebiliyor. ama benim istediğim mailleri teker teker göndermesi, Örneğin bir maili planladım, 2 tane göndermesini istiyorum ama 10 ar saniye arayla bunu nasıl yapabilirm. Yukarıda ki fonksiyon mail gönderiyor fakat devamlı saniye olayını dikkate almıyor.

 
Gönderildi : 07/04/2011 12:58

(@ferhatkaratas)
Gönderiler: 100
Estimable Member
 

Mantık şöyle olmalı, timer objesi 10 sn.'de bir çalışıyor. Her çalıştığında SaatMail metodunu çalıştırıyor. Sizin bu metod içinde veritabanına bağlanıp "gönderimi yapılmamış kayıtlar içinden tek kayıt" çekmeniz gerekiyor. Mesela, "select top 1 * from tablo where status=0 order by ItemID"

Gönderim yapıldıktan sonra da bu kaydın status'unu 1 olarak update edin. Böylece timer'ın elapsed event'inde tek gönderim yapılacak, gönderim sonrası status update edilecek, bir sonraki sorgulamada bu kayıt gelmeyecektir.

 
Gönderildi : 07/04/2011 13:37

(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

Sizin Dediğiniz Şekilde yaptığım zaman bu seferde 2 tane gönderdim daha sonra 3 tane gönderim 2gidiyor 10 saniye sonra 3 gidiyor.

 
Gönderildi : 07/04/2011 14:55

(@ferhatkaratas)
Gönderiler: 100
Estimable Member
 

Bir yerde hata yapıyor olabilirsiniz. SaatMail metodu sql'den sadece 1 kayıt getirecek (status'u 0 olan), dolayısıyla sadece bunu gönderecek. Bir dahaki gönderim için bu metod yine 10 sn. bekleyecek.

İsterseniz SaatMail metodunuzu buraya alın, beraber bir bakalım. 

 
Gönderildi : 07/04/2011 15:53

(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

timer1.Stop();  //Timer 1 durdur

            //kayıt yapılan en son değeri dataread yardımıyla çekerek, mail gonder servisine gönderiyor.
            SqlConnection baglanti = new SqlConnection(@"");

           // sonucu 0 olan son bir kayıdı sql den çekiyor.

           
SqlCommand komut = new SqlCommand("select top 1
OtoMailID,Adet,BasTarih,Aciklama,Kime from OtoMail where Sonuc=0 order by OtoMailId  ",
baglanti);
            baglanti.Open();
            SqlDataAdapter da = new SqlDataAdapter();
            //komut.ExecuteNonQuery();
            da.SelectCommand = komut;
            DataTable dt=new DataTable();
            
            da.Fill(dt);
           
        // data tableı döndürüyor.
         foreach(DataRow dr in dt.Rows)
        {

         //  belirlenen değişkenlere sql den çekilen verileri atıyor.
            Sayi = Convert.ToInt32(dr["Adet"]);
            Kime = (dr["Kime"].ToString());
            BasTarih = Convert.ToDateTime(dr["BasTarih"]);
            OtoMailID = Convert.ToInt32(dr["OtoMailID"]);
            Aciklama = (dr["Aciklama"].ToString());
           
           if (Sayi==İ)

{     //Eğer Sayi değişkeni i e eşitse sonuc alanını 1 olarak değiştir

               SqlConnection baglanti5 = new SqlConnection(@"");
                SqlCommand ekle = new SqlCommand("update OtoMail set Sonuc=@Sonuc where OtoMailID=@OtoMailID ", baglanti5);
                baglanti5.Open();
                mailgonder(Sayi, Kime, islemdeger, Aciklama);
                ekle.Parameters.AddWithValue("@Sonuc", 1);
                ekle.Parameters.AddWithValue("@OtoMailID", OtoMailID);
                ekle.ExecuteNonQuery();

                islemdeger = 1;

                baglanti5.Close();
                baglanti5.Dispose();
                ekle.Dispose();

}    

else

{  eşit değilse timer 1 yeniden başlasın

    timer1.Start();

}     

              
              
       
        }
     

}

 

Saat mail fonksiyonum yukarıda ki gibidir.

 
Gönderildi : 07/04/2011 16:14

(@ferhatkaratas)
Gönderiler: 100
Estimable Member
 

Olayı çok karmaşıklaştırmışsınız. Bunun bir sebebi de model/fikir değişikliğine gitmeniz. Son kararınız eğer 10 saniyede bir gönderim yapmak ise bu kadar i değişkeni tanımlayıp i++ vermenize gerek yok.

Yöntem şu, 10 saniyede bir bekleyen mail var mı, varsa gönder diyeceğiz. Yoksa zaten bir işlem yapmayacak. Aşağıdaki kodu notepad'i kullanarak yazdım. Olası değişken değişikliğinizi kendinize göre yaparsınız. 

Ve bir öneri, sqconnection gibi objeleri kullanırken muhakkak using statement kullanın. Bu objelerinizin dispose edildiğini ve varsa açık connectionlarınızın kapandığını garantiler. Örnek :

using (SqlConnection cn = new SqlConnection(connectionString))
{
    using (SqlCommand cm = new SqlCommand(commandString, cn))
    {
        cn.Open();
        cm.ExecuteNonQuery();
    }
}

 

Düzenlenmiş kodunuz :

public void SaatMail(object sender, ElapsedEventArgs e)
{
  SqlConnection baglanti = new SqlConnection(@"");

  // sonucu 0 olan son bir kayıdı sql den çekiyor.
  SqlCommand komut = new SqlCommand("select top 1 OtoMailID,Adet,BasTarih,Aciklama,Kime from OtoMail where Sonuc=0 order by OtoMailId  ", baglanti);
  baglanti.Open();
  SqlDataAdapter da = new SqlDataAdapter();
  da.SelectCommand = komut;
  DataTable dt=new DataTable();
  da.Fill(dt);
          

 if(dt.Rows.Count != 0)
 {
  foreach(DataRow dr in dt.Rows)
  {
    Kime = (dr["Kime"].ToString());
    Aciklama = (dr["Aciklama"].ToString());   
    mailgonder(Kime, islemdeger, Aciklama); 
          
    SqlConnection baglanti5 = new SqlConnection(@"");
    SqlCommand ekle = new SqlCommand("update OtoMail set Sonuc=1 where OtoMailID=@OtoMailID", baglanti5);
    baglanti5.Open();

    OtoMailID = Convert.ToInt32(dr["OtoMailID"]);
    ekle.Parameters.AddWithValue("@OtoMailID", OtoMailID);
    ekle.ExecuteNonQuery();

    baglanti5.Close();
    baglanti5.Dispose();
  } 
 } 
}

private void mailgonder(string Kime, 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";
  SmtpMail.Send(mvMail);       
}

 
Gönderildi : 07/04/2011 17:16

(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

Ferhat Bey çok Teşekkürler kod üzerinde 1-2 değişiklik yaptıktan sonra sorunum çözüldü. ilginize teşekkürler. Yalnız benim bir sorum daha olacaktı istenilen tarihte ve saatde başlayan ve istenilen tarihte ve saatde belirlenen saat başında mail göndermek istesek nasıl yapabiliriz.

 
Gönderildi : 07/04/2011 18:02

(@ferhatkaratas)
Gönderiler: 100
Estimable Member
 

O da basit, çekeceğiniz sorguya bir de tarih kriterini eklemeniz yeterli. Böylece sadece başlama tarihi gelenlerden durumu 0 olanlar gönderime konu olacaktır.

SqlCommand komut = new SqlCommand("select top 1
OtoMailID,Adet,BasTarih,Aciklama,Kime from OtoMail where Sonuc=0 and BasTarih >=@BasTarih order
by OtoMailId  ", baglanti);

 

@BasTarih'i parametre olarak geçmeyi unutmayın

 
Gönderildi : 07/04/2011 18:26

(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

Bu olay sadece butona bastığımız zaman aktif olcak heralde çünkü buton altında çalışıyor, servisin devamlı çalışması için ne yapabiliriz, hafta sonu başlaması gereken bir rapor örneğin.

 
Gönderildi : 07/04/2011 18:35

(@ferhatkaratas)
Gönderiler: 100
Estimable Member
 

O zaman "windows service" yazmanız gerekecek. Böylece işletim sistemi açılır açılmaz kendiliğinden devreye girecektir. Örnek windows servis için buraya bakabilirsiniz : http://www.csharpnedir.com/articles/read/?filter=&author=&cat=&id=260&title=Windows%20Servislerine%20Giri%C5%9F

 

 
Gönderildi : 07/04/2011 18:42

(@Anonim)
Gönderiler: 0
Konu başlatıcı
 

Ferit Bey Çok Teşekkürler Şuanda sorunsuz çalışıyor. İnş Sorunsuz devam eder.

 
Gönderildi : 07/04/2011 19:30

Paylaş: