Forum

Oto Mail Gönde...
 
Bildirimler
Hepsini Temizle

Oto Mail Göndermek

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

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.

 
Gönderildi : 28/03/2011 17:02

(@ferhatkaratas)
Gönderiler: 100
Estimable Member
 

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.

 
Gönderildi : 29/03/2011 15:21

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

Teşekkürler uygulamaya dahil atcem. Umarım istediğim sonucu alırım.

 
Gönderildi : 29/03/2011 16:23

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

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.

 
Gönderildi : 29/03/2011 20:23

(@ferhatkaratas)
Gönderiler: 100
Estimable Member
 

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)

 
Gönderildi : 30/03/2011 15:16

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

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.

 
Gönderildi : 30/03/2011 16:19

(@ferhatkaratas)
Gönderiler: 100
Estimable Member
 

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.

 
Gönderildi : 30/03/2011 16:31

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

Sizin dediğiniz yöntemle yaptım fakat bu seferde sınırsız mail gönderiyor.

 
Gönderildi : 30/03/2011 17:03

(@ferhatkaratas)
Gönderiler: 100
Estimable Member
 

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();
        }
    }

 
Gönderildi : 30/03/2011 17:54

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

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.

 
Gönderildi : 30/03/2011 18:57

Paylaş: