şö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.