• 12-05-2008, 23:17:01
    #1
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Bu mesajın bir kopyasını yeni başlayan forumunda konuya çözüm arayan arkadaşlar için yazmıştım , php bölümünde de olmasının faydası olacağını düşünüyorum.

    aşağıdaki işlem belirli sayıdaki maili belirlenen limit dahilinde her seferde x tane olacak gönderecektir.

    şöyle bir yöntem izleyebilirsiniz arkadaşlar.

    öncelikle gönderilecek mailleri tek seferde göndermeyi denemeyin bu yapılacak en kötü davranış olur , belirli bir zaman bekleyerek gruplar halinde atın mailleri, peki bunu nasıl yapacağız derseniz. aşağıdaki yolu izleyin.


    <?PHP
    ob_start('gz_handler'); // Header alredy sent hatasını önlemek için kullanın.
    header ("Content-Type: text/html; charset=iso-8859-9");
    // İşlem Zaman aşımına uğramasın diye aşağıdaki fonksiyonu ekleyin
    function mail_set_time_limit($limit) {
    if (!get_cfg_var('safe_mode')) {
    set_time_limit($limit);
    }
    }
    // Mailler için bir veritabani bağlantısı yapmadan txt dosyasından okutarak gönderelim. ama illa veritabani bağlantısı yapacağım diyorsanız değerlerin tamamını bir değişkene atayarak explode ile bölerek işlem yapmanız performans açısından lehinizedir.
    
    // Kaç tane mail adresi var onu öğrenelim , txt dosyasında her mail adresi bir satırda olacak şekilde yazılmış diye düşünüyorum.
    $dosyaadi = "maillistesi.txt";
    $satirlar    = file($dosyaadi);
    $satirsayi    = count($satirlar);
    
    // $_GET kullanılacağı için ilgili veriyi güvenli hale getirelim
    // Bu işlem için aşağıdaki fonksiyonu kullanalım.
    function VeriDuzenle($str)
    {
    $str         = htmlspecialchars("$str", ENT_QUOTES);
    $str         = preg_replace("'\s+'"," ",$str);
    $str        = ltrim(rtrim($str));
    return $str;
    }
    
    // Ayarlarımızı yapıyoruz , bir seferde kaç mail gönderilecek , kaç saniye beklenecek gibi.
      $gonder = VeriDuzenle($_GET["gonder"]) ? VeriDuzenle( $_GET["gonder"]) : 0; 
      $kactane = 50; // her defasında kaç mail gönderilecek
      $araver = 2;   // her seferinde kaç saniye ara verecek
    bu bölüme kadar maillistesi.txt dosyasından göndereceğimiz mail sayısını öğrendik , zaman aşımına uğramaması ve header hatası vermemesi için gereken kısımları yazdık , her defada kaç mail gönderip ne kadar bekleyeceğini değişkenlere atayarak ayarladık.

    şimdi bir for döngüsü yaratarak her seferinde bir sonraki grubun gönderilmesini sağlıyoruz.

    // üstteki koddan devam
    for($i=$gonder; $i<$gonder+$kactane ; $i++)
    {
    // bu döngü ne yapar , eğer $gonder değeri $gonder+$kactane değerinden küçükse betik çalışmaya devam eder , yani ilk çalıştırdık ve listemizde 500 adres var her seferinde 50 mail göndereceğiz bu durumda 
    //$i=$gonder; $i<$gonder+$kactane şu değerleri almış olacaktır 
    //$i=0 ; $i<0+50 , bir sonraki calışmasında değerler şu şekilde artacaktır. 
    //$i=50; $i<50+50
    
    
    // mail gönderim kodunuz burada çalışacak
    
    }
    
    // şimdi de listedeki mail sayısı ile gonderilen mail sayısına bakalım eğer gönderilen sayı daha küçükse sıradaki gruba gondermesi için betiği tetikleyelim.
    
     if(count($satirlar) > ($gonder+$kactane))
    {
    header("refresh: $araver; url=mailgonder.php?gonder=".($gonder+$kactane)); // belirttiğimiz saniye aralığında sayfayı yeniler
     }
       
    // yukarıdaki yönlendirme şu şekilde olacak
    // 1nci döngüde yönleneceği adres | mailgonder.php?gonder=50 
    // 2nci döngüde yönleneceği adres | mailgonder.php?gonder=100
    // dolayısıyla yukarıda yazılan for dongusu kaçtan başlayıp kaça kadar çalıştığını bilecek
    yukarıdaki mantıkla mail gönderiminde max_execution_time sınırı sıkıntısını yaşamadan mail gönderebilirsiniz.

    Eğer HTML içerikli mail göndermek istiyorsanız mail gönderim kodunuzun header bilgisini şu şekilde tanımlayın.

            $headers = "From: info@benimsiteminadresi.org\n" .
           'X-Mailer: PHP/' . phpversion() . "\n" .
           "MIME-Version: 1.0\nContent-Type: text/html;charset=iso-8859-9\n" .
           "Content-type: text/html; charset=iso-8859-9\n".
           "Content-Type: text/html; charset=utf-9\n" .
           "Content-Transfer-Encoding: base64t\n";
    hepinize kolay gelsin.
  • 13-05-2008, 09:20:40
    #2
    Üyeliği durduruldu
    iyi güzel de, biz gönderilecek mail bilgilerini nereye yazacağız ?
  • 13-05-2008, 09:25:35
    #3
    Üyeliği durduruldu
    maillistesi.txt
    dosyasına yazacaksın o otomatik okuyacak
    Nettek adlı üyeden alıntı: mesajı görüntüle
    iyi güzel de, biz gönderilecek mail bilgilerini nereye yazacağız ?
  • 13-05-2008, 09:35:37
    #4
    Üyeliği durduruldu
    SNaRe adlı üyeden alıntı: mesajı görüntüle
    maillistesi.txt
    dosyasına yazacaksın o otomatik okuyacak
    hayır onu demedim, gönderilecek mail içeriği yani.
    mailin kendi içeriğini nereden çekecek ya da nerede okuyacak, bu script işime yarayacak gibi duruyor
  • 13-05-2008, 16:20:40
    #5
    Nettek adlı üyeden alıntı: mesajı görüntüle
    hayır onu demedim, gönderilecek mail içeriği yani.
    mailin kendi içeriğini nereden çekecek ya da nerede okuyacak, bu script işime yarayacak gibi duruyor

    nasıl mail gönderilir değildi zaten buradaki mantık nasıl xx tane gönderip xx tane beklerim olayıdır.

    for($i=$gonder; $i<$gonder+$kactane ; $i++)
    {
    Mail gönderme kodu bu kısma girecek
    }
    for döngüsü içine mail gönderme konudu koyabilirsiniz
  • 13-05-2008, 16:53:28
    #6
    Üyeliği durduruldu
    peki dediğin gibi deneriz artık
  • 13-05-2008, 19:40:43
    #7
    Üyeliği durduruldu
    teşekkurler.. guzel paylaşım olmuş....