Zamanlanmış e-posta gönderimleri; e-ticaret sitelerinde sepet hatırlatmaları, muhasebe yazılımlarında otomatik fatura bildirimleri, haftalık bülten dağıtımları ve sistem yöneticileri için sunucu sağlık raporları gibi pek çok kritik iş sürecinin merkezinde yer alır. Arka planda çalışan bir betiğin doğru zamanda devreye girip alıcılara hatasız e-posta ulaştırması, doğrudan işletim sistemi zamanlayıcısı olan cron mekanizmasıyla yönetilir.
Ancak zamanlanmış e-posta sistemlerini hayata geçirirken geliştiriciler genellikle yalnızca kodlama mantığına odaklanıp altyapı kısıtlamalarını göz ardı ederler. Modern bulut sağlayıcıların (AWS, DigitalOcean, Hetzner, GCP vb.) giden SMTP port 25 trafiğini varsayılan olarak engellemesi, CLI ortamında PHP mail() fonksiyonunun çalışmaması, eksik SPF/DKIM kayıtları yüzünden iletilerin doğrudan spam kutusuna düşmesi ve yüzlerce e-postanın tek bir döngüde gönderilmeye çalışılarak sunucunun kilitlenmesi en sık karşılaşılan tuzaklardır. Temel zamanlama kalıplarını kurgulamak için crontab sözdizimi kurallarını bilmek doğru periyot seçiminde yardımcı olur.
Bu kapsamlı rehberde; Linux komut satırı araçlarından (mailutils, msmtp) PHP (PHPMailer) ve Python (smtplib) betiklerine kadar zamanlanmış e-posta gönderim mimarisini inceliyoruz. Teslim edilebilirlik standartlarını, port kısıtlamalarını, kuyruk (queue) ve paketleme (chunking) mantığını adım adım ele alıyoruz. Ayrıca sunucu bağımlılıklarını ortadan kaldırmak için ücretsiz cron job servisi ile HTTP tabanlı kuyruk tetikleme yöntemini öğreneceksiniz.
Cron ile E-Posta Gönderim Senaryoları (Bülten, Fatura, Hatırlatma)
İşletmelerin ihtiyaç duyduğu zamanlanmış e-posta akışları genellikle üç temel senaryoda toplanır:
- Sistem Sağlık ve Güvenlik Raporları: Gece yarısı çalışan yedekleme işleminin sonucu, disk doluluk oranları veya sunucuya yapılan başarısız SSH giriş denemeleri sistem yöneticilerine otomatik raporlanır. Hata takibinde sistem loglarını izlemek için cron logları inceleme (/var/log/cron) adımları kritik önem taşır.
- İşlemsel ve Finansal Hatırlatmalar: Vadesi yaklaşan faturalar, abonelik yenileme uyarıları veya randevu hatırlatmaları günlük belirli saatlerde veritabanından taranarak ilgili müşterilere iletilir. Bu taramaların sepet hatırlatma ve sipariş durumu akışına uyarlanmış hâli için e-ticaret sitelerinde cron job ile zamanlanmış görevler rehberindeki planları kullanabilirsiniz.
- Toplu E-Bülten ve Pazarlama İletileri: Binlerce aboneye gönderilecek bültenler anlık olarak tek seferde basılamaz; SMTP sunucusunu boğmamak ve kara listelere (blacklist) girmemek için saatlik dilimlere yayılarak kontrollü gönderilir.
Listedeki akışların veri kaynağı bazen sunucunun kendisidir: fiyat izleme veya stok karşılaştırma yapan cron ile web scraping işleri, gün içinde topladığı veriyi yine aynı e-posta kuyruğuyla günlük özet olarak iletebilir.
Komut Satırı Araçları vs Kod Tabanlı Gönderim Yöntemleri
Linux sunucusunda cron ile e-posta gönderirken ihtiyacınıza göre iki ana yoldan birini seçebilirsiniz: Komut satırı yardımcıları veya programlama dili betikleri.
Bu iki yolun dışında kodu tamamen bırakmak isteyenler için üçüncü seçenek vardır: n8n ile zamanlanmış görev akışları içinde hazır e-posta düğümünü, HTTP isteği ve filtre adımlarıyla birleştirerek kuyruk mantığını görsel bir akışla kurabilirsiniz.
Linux CLI Üzerinde mailutils ve msmtp Yapılandırması
Debian ve Ubuntu dağıtımlarında terminal üzerinden e-posta göndermek için mailutils paketi kullanılır. Ancak modern bulut sunucularda yerel posta sunucusu (Postfix/Sendmail) kurmak yerine harici bir SMTP sunucusuna güvenli geçit (relay) oluşturan msmtp tercih edilmelidir:
# Debian/Ubuntu üzerinde kurulum
sudo apt update && sudo apt install -y mailutils msmtp msmtp-mta
# /etc/msmtprc yapılandırması
defaults
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile /var/log/msmtp.log
account kurumsal
host smtp.sirket.com
port 587
from bildirim@sirket.com
user bildirim@sirket.com
password GizliSmtpSifresi123
account default : kurumsal
Bu yapılandırma sonrasında crontab içine şu satırı ekleyerek her sabah saat 08:30'da disk durumunu otomatik iletebilirsiniz:
30 8 * * * df -h | mail -s "Gunluk Disk Raporu - $(hostname)" admin@sirket.com
PHP (PHPMailer) ile SMTP Entegrasyonu ve Toplu Gönderim
Web projelerinde sıklıkla PHP tercih edilir. CLI üzerinde PHP kullanırken dahili mail() fonksiyonu yerine PHPMailer kütüphanesi kullanılmalı ve kimlik doğrulamalı harici SMTP bağlantısı kurulmalıdır. Detaylı ortam yapılandırması için PHP cron job rehberi sayfasını inceleyebilirsiniz.
Python (smtplib ve email.mime) ile Zamanlanmış Rapor Gönderimi
Python'un standart kütüphanesinde yer alan smtplib ve email.mime modülleri harici paket kurmaya gerek kalmadan HTML formatında zengin içerikli e-postalar hazırlamanıza olanak tanır. Bağımsız sunucu betikleri için Python cron job rehberi adımlarını uygulayabilirsiniz. Rails tarafında ActionMailer ile aynı kuyruk yaklaşımını kuracaksanız zamanlamayı Rails cron job rehberindeki zamanlayıcı kurulumuyla bağlayabilirsiniz.
E-Posta Teslim Edilebilirliği: Spam Kriterleri ve Port 25 Kısıtlamaları
Kısa yanıt: göndereceğiniz e-postaları kimlik doğrulamalı bir SMTP servisi üzerinden 587 (STARTTLS) veya 465 (SMTPS) portundan geçirin, alan adınıza SPF ve DKIM kayıtlarını ekleyip DMARC politikası tanımlayın. Bulut sunucularda doğrudan port 25 ile göndermeyi plana hiç sokmayın.
E-posta gönderiminde en kritik teknik zorluk teslim edilebilirliktir (deliverability). Bir cron görevi e-postayı göndermiş görünse dahi alıcı tarafında iletinin yok sayılması veya doğrudan spama düşmesi yaygındır:
- Port 25 Engeli: AWS EC2, DigitalOcean, Linode, Hetzner ve Google Cloud gibi hemen tüm modern bulut sağlayıcıları, spam salgınına karşı giden TCP port 25 trafiğini varsayılan olarak tamamen engeller. Kimlik doğrulamalı SMTP gönderimi için sağlayıcınızın izin verdiği port 587 (STARTTLS) veya port 465 (SMTPS) kullanılabilir; DigitalOcean bu portları da engellediğinden HTTP tabanlı e-posta API'si gerekebilir.
- SPF (Sender Policy Framework): Alan adınızın DNS kayıtlarına sunucu IP adresinizi veya kullandığınız SMTP sağlayıcısını (örneğin
v=spf1 include:sendgrid.net ~all) TXT kaydı olarak eklemelisiniz. - DKIM (DomainKeys Identified Mail): E-postaların yolda değiştirilmediğini kanıtlayan kriptografik imza kaydıdır. Alıcı sunucu bu imzayı DNS'teki genel anahtarınızla doğrular.
- DMARC: Görünür gönderici alan adıyla hizalı SPF veya DKIM doğrulamasından en az birini geçemeyen iletiler için nasıl işlem yapılmasının istendiğini (izleme, karantina, reddetme) belirtir. DMARC kaydı bulunmayan kurumsal alan adlarının Gmail ve Yahoo tarafından reddedilme olasılığı yüksektir.
- Ters DNS (PTR): Gönderici IP adresinin alan adıyla eşleşmesi kurumsal teslim edilebilirlik için zorunludur.
Gerçek Kod Örnekleri ve Kuyruk (Queue) Mimarisi
Kısa yanıt: e-postaları tek bir döngüde göndermeyin. İletileri veritabanındaki bir kuyruk tablosuna yazın, cron her çalıştığında sınırlı sayıda kaydı (örneğin 50) gönderin ve her kaydın son durumunu gönderimden hemen sonra güncelleyin.
Toplu e-posta gönderirken yapılan en büyük hata, yüzlerce aboneyi tek bir döngüde senkron göndermeye çalışmaktır. SMTP bağlantısı geciktiğinde veya zaman aşımına uğradığında script yarıda kesilir; kimlere mail gittiği, kimlerin beklediği belirsizleşir. Doğru mimari, e-postaları veritabanında bir kuyruk tablosuna yazmak ve cron ile her periyotta 50-100 adetlik paketler (chunk) halinde eritmektir.
PHP PHPMailer ile Kuyruk İşleme Betiği
<?php
// /var/www/scripts/kuyruk-eriticisi.php
// Cron: */5 * * * * (Her 5 dakikada bir çalışır)
if (php_sapi_name() !== 'cli') {
die('Yalnızca komut satırından (CLI) çalıştırılabilir.');
}
require_once __DIR__ . '/../vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
$pdo = new PDO('mysql:host=localhost;dbname=sirket_db;charset=utf8mb4', 'dbuser', 'DbSifre123', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
// Bekleyen ilk 50 e-postayı seç
$stmt = $pdo->prepare("SELECT id, alici_email, alici_ad, konu, govde FROM email_kuyrugu WHERE durum = 'bekliyor' ORDER BY id ASC LIMIT 50");
$stmt->execute();
$mailler = $stmt->fetchAll();
if (empty($mailler)) {
echo "İşlenecek bekleyen e-posta bulunamadı.\n";
exit(0);
}
foreach ($mailler as $item) {
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.sirket.com';
$mail->SMTPAuth = true;
$mail->Username = 'bildirim@sirket.com';
$mail->Password = 'SmtpGucluSifre!';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->CharSet = 'UTF-8';
$mail->setFrom('bildirim@sirket.com', 'Kurumsal Bildirim');
$mail->addAddress($item['alici_email'], $item['alici_ad']);
$mail->isHTML(true);
$mail->Subject = $item['konu'];
$mail->Body = $item['govde'];
$mail->send();
$update = $pdo->prepare("UPDATE email_kuyrugu SET durum = 'gonderildi', gonderim_tarihi = NOW() WHERE id = ?");
$update->execute([$item['id']]);
echo "Başarılı: {$item['alici_email']}\n";
// SMTP sağlayıcısını boğmamak için 150 milisaniye bekle
usleep(150000);
} catch (Exception $e) {
$update = $pdo->prepare("UPDATE email_kuyrugu SET durum = 'hata', hata_mesaji = ? WHERE id = ?");
$update->execute([$e->getMessage(), $item['id']]);
error_log("Gönderim hatası [{$item['alici_email']}]: " . $e->getMessage());
}
}
Python smtplib ile Günlük HTML Sistem Raporu
#!/usr/bin/env python3
# /home/admin/scripts/sistem_raporu.py
# Cron: 0 9 * * * (Her gün 09:00)
import os
import smtplib
from datetime import datetime
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
SMTP_HOST = os.getenv("SMTP_HOST", "smtp.sirket.com")
SMTP_PORT = int(os.getenv("SMTP_PORT", 587))
SMTP_USER = os.getenv("SMTP_USER", "rapor@sirket.com")
SMTP_PASS = os.getenv("SMTP_PASS", "SmtpGucluSifre!")
def send_daily_report():
tarih = datetime.now().strftime("%Y-%m-%d %H:%M")
msg = MIMEMultipart("alternative")
msg["Subject"] = f"Günlük Sunucu Özeti - {tarih}"
msg["From"] = SMTP_USER
msg["To"] = "sistem-ekibi@sirket.com"
html_content = f"""
<html>
<body style="font-family: Arial, sans-serif; color: #333;">
<h2>Sistem Durum Raporu</h2>
<p>Oluşturulma Zamanı: <strong>{tarih}</strong></p>
<ul>
<li>Sunucu: <strong>web-prod-01</strong></li>
<li>Disk Kullanımı: <strong>%42</strong></li>
<li>Aktif Servisler: <strong>Nginx, MySQL, PHP-FPM Aktif</strong></li>
</ul>
</body>
</html>
"""
msg.attach(MIMEText(html_content, "html"))
with smtplib.SMTP(SMTP_HOST, SMTP_PORT, timeout=25) as server:
server.starttls()
server.login(SMTP_USER, SMTP_PASS)
server.send_message(msg)
print("Günlük sistem raporu e-postası başarıyla iletildi.")
if __name__ == "__main__":
send_daily_report()
Senaryo: Sepet hatırlatmalarında idempotency ve hız limiti
Sepet hatırlatma gibi müşteriye dönük e-postalarda asıl risk, gönderim sayısının artması değil yanlış tekrarların gitmesidir. Cron görevi elle tetiklenirse, sunucu yeniden başlatılırsa veya iki zamanlama kaydı üst üste binirse aynı müşteriye aynı gün ikinci hatırlatma gidebilir. Bunu iki veritabanı kısıtıyla engellersiniz: müşteri ve tarih birleşimine benzersiz indeks, alıcı başına saatlik gönderim sayısı kontrolü. Benzersiz indeks aynı gönderimin ikinci kez kuyruğa eklenmesini önler; satırı kendiliğinden kilitlemez. Tüketici kaydı göndermeden önce atomik olarak sahiplenmelidir (örnek: UPDATE ... SET durum='gonderiliyor' WHERE id=? AND durum='bekliyor' ve etkilenen satır sayısı 1 ise gönderilir); SMTP kabulünden sonra durum güncellenmeden süreç çökerse yeniden gönderim yine mümkündür.
-- Aynı müşteriye aynı gün tek hatırlatma (tekrar denemede INSERT IGNORE 0 satır döndürür)
CREATE UNIQUE INDEX tek_hatirlatma
ON sepet_hatirlatma (musteri_id, hatirlatma_tarihi);
-- E-posta eklenmeden önce: bu alıcıya son 1 saatte kaç ileti gitti?
SELECT COUNT(*) FROM email_kuyrugu
WHERE alici_email = ? AND gonderim_tarihi > DATE_SUB(NOW(), INTERVAL 1 HOUR);
Bu desende hız limiti kuralı SMTP sağlayıcısının sınırına göre seçilir: alıcı başına saatlik 1-2 ileti gibi muhafazakâr bir üst sınır, şikâyet (spam bildirimi) oranını düşük tutar. Kuyrukta üç kez hatalanan kayıtlar ayrı bir deneme >= 3 durumuna alınarak insan incelemesine bırakılır; sonsuz yeniden deneme hem kuyruğu hem gönderen itibarını yıpratır.
Doğrulama ve Sorun Giderme
Doğrulama sırası şudur: önce cron servisinin görevi tetiklediğini sistem kaydında görün, sonra betiği cron'un sade ortamında elle çalıştırın, en son iletilerin alıcı tarafındaki sonucunu (spam, reddedildi, ulaştı) kontrol edin. Bu üç adımı sırayla uygulamak, hatanın zamanlayıcıda, betikte ya da teslimatta mı olduğunu tek tek ayıklar.
| Belirti | Olası neden | Kontrol komutu | Çözüm |
|---|---|---|---|
| Tetiklemeye dair kayıt yok | cron servisi durmuş veya satır başka hesabın tablosunda | systemctl status cron ve crontab -l | Servisi başlatın; satırı doğru kullanıcının tablosuna ekleyin |
| Tetikleniyor ama betik çalışmıyor | cron PATH'i farklı; yorumlayıcı bulunamıyor | grep CRON /var/log/syslog veya journalctl -u cron --since "1 hour ago" | Komutta mutlak yol kullanın (/usr/bin/php) |
| Elle çalışıyor, cron'da hata veriyor | HOME, PATH veya SMTP değişkenleri cron ortamında tanımsız | env -i /bin/sh -c '/usr/bin/php /var/www/app/cron/mail.php' | Değişkenleri crontab başında tanımlayın; betik ayarları dosyadan okusun |
| SMTP connect() failed | Giden SMTP portu engelli veya sunucu adı hatalı | nc -vz smtp.sirket.com 587 | 465'i deneyin; engel sürüyorsa e-posta servisinin HTTP API'sine geçin |
| 535 Username and Password not accepted | Kimlik bilgisi hatalı veya hesap uygulama şifresi/OAuth istiyor | openssl s_client -starttls smtp -connect smtp.sirket.com:587 | Sağlayıcının istediği kimlik türünü kullanın; şifreyi ortam değişkeninden okuyun |
| Gönderildi ama spama düşüyor | SPF/DKIM/DMARC eksik veya gönderen alan adı hizasız | dig TXT alanadi.com +short | SPF TXT kaydını ve DKIM anahtarını ekleyin; From adresini alan adınızla hizalayın |
| Kuyruk büyüyor, azı işleniyor | Paket boyutu küçük ya da hatalı satırlar her seferinde yeniden seçiliyor | SELECT durum, COUNT(*) FROM email_kuyrugu GROUP BY durum; | Hatalıları ayrı durumla işaretleyin; paket boyutunu ve periyodu ayrı ayrı ayarlayın |
Aşağıdaki örnekte görevin tetiklendiği syslog satırları, betiğin normal çıktısı ve sade ortamda (env -i) çalıştırıldığında alınan kimlik hatası bir arada görülüyor. Son çıktı, "elle çalışıyor, cron'da çalışmıyor" şikâyetinin tipik kaynağını gösterir: veritabanı parolası gibi değerler oturum değişkenlerinden geliyorsa cron ortamında bunlar yoktur.
$ sudo grep CRON /var/log/syslog | tail -2
Oct 28 09:00:01 app01 CRON[18241]: (www-data) CMD (/usr/bin/php /var/www/app/cron/kuyruk-eriticisi.php)
Oct 28 09:05:01 app01 CRON[18477]: (www-data) CMD (/usr/bin/php /var/www/app/cron/kuyruk-eriticisi.php)
$ sudo -u www-data /usr/bin/php /var/www/app/cron/kuyruk-eriticisi.php
Başarılı: ayse@example.com
Başarılı: mehmet@example.com
İşlenecek bekleyen e-posta bulunamadı.
$ sudo -u www-data env -i /bin/sh -c '/usr/bin/php /var/www/app/cron/kuyruk-eriticisi.php'
PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000] [1045] Access denied for user 'dbuser'@'localhost' (using password: NO) in /var/www/app/cron/kuyruk-eriticisi.php:12
Sık Karşılaşılan Hatalar ve Çözümleri
Cron üzerinden e-posta gönderirken karşılaşılan en tipik hatalar ve çözüm metotları aşağıda açıklanmıştır:
mail: command not found
Betiğiniz veya kabuk dosyanız mail komutunu çağırdığında sistemde kurulu bir posta aracı bulunamadığını belirtir. Çözüm için Debian/Ubuntu sunucularda sudo apt install -y mailutils komutuyla gerekli araçları yükleyin veya mutlak yol olarak /usr/bin/mail şeklinde tanımlayın.
Connection timed out on port 25
Bulut altyapınızın (AWS, DigitalOcean, Linode vb.) güvenlik duvarı giden port 25 bağlantılarını engelliyor demektir. Doğrudan port 25 ile bağlantı kurmaya çalışmak yerine sağlayıcınız izin veriyorsa SMTP portunu 587 (STARTTLS) veya 465 (SMTPS) olarak güncelleyin; DigitalOcean'da bu portlar da engellenir. Sorun devam ediyorsa bulut sağlayıcınızın kontrol panelinden posta portu açma talebi oluşturmalı veya SendGrid/Mailgun gibi harici API servislerine geçmelisiniz. Görevin çalışmamasıyla ilgili genel adımlara cron job çalışmıyor içeriğinden ulaşabilirsiniz.
SMTPAuthenticationError: (535, '5.7.8 Username and Password not accepted')
SMTP sunucusu gönderilen kullanıcı adı veya şifreyi doğrulamamıştır. Özellikle Gmail veya Microsoft 365 kullanılıyorsa ve hesapta iki aşamalı doğrulama (2FA) aktifse normal hesap şifresiyle giriş yapılamaz. Çözüm için sağlayıcınızın desteklediği kimlik doğrulama yöntemini kullanın; uygulama şifresi yalnızca desteklenen hesaplarda geçerlidir ve OAuth gerekebilir.
550 5.7.1 Message rejected due to DMARC policy
Alıcı e-posta sunucusu (Gmail, Outlook vb.), iletinin gönderici alan adıyla hizalı SPF veya DKIM doğrulamalarından hiçbirini geçemediğini ve alan adınızın DMARC politikasının iletinin reddedilmesini emrettiğini belirtir. Çözüm için DNS yönetim panelinizde alan adınıza ait SPF TXT kaydını güncelleyin ve SMTP sağlayıcınızın sunduğu DKIM anahtarını DNS'e doğru CNAME/TXT kaydıyla ekleyin.
cronjob.com.tr ile HTTP Tabanlı Alternatif Kurulum (Mail Queue Trigger Endpoint)
Sunucuda karmaşık yerel posta araçları kurmak, crontab üzerinde betik yetkileriyle uğraşmak ve port 25 blokajlarıyla boğuşmak yerine en güvenli yaklaşım; e-posta kuyruğu eritme işlemini bir web uç noktasına bağlamaktır (örneğin POST /cron/process-email-queue). cronjob.com.tr bulut servisi, her 5 dakikada bir bu uç noktaya güvenli istek atarak kuyruktaki e-postaların peyderpey iletilmesini tetikler.
Bu mimaride uç noktanız basit bir token kontrolü yapar:
// routes/cron.php veya endpoint kontrolü
$token = $_SERVER['HTTP_X_CRON_TOKEN'] ?? '';
if ($token !== getenv('CRON_SECRET_KEY')) {
http_response_code(403);
echo json_encode(['error' => 'Yetkisiz erişim']);
exit;
}
// Kuyruktan 50 maili erit ve sonucu JSON dön
$eriyenSayisi = eriteKuyruk(50);
echo json_encode(['durum' => 'basarili', 'gonderilen' => $eriyenSayisi]);
cronjob.com.tr platformu bu kurulumu tamamen güvenilir ve kolay hale getirir:
cronjob.com.tr tamamen ücretsiz bir servistir; üye olurken kredi kartı gerekmez. Tanımlanabilen en kısa tetikleme aralığı 60 saniyedir (1 dakika). Hazır aralık seçeneklerinden birini seçebileceğiniz gibi standart 5 alanlı cron ifadesiyle özel takvimler de belirleyebilirsiniz. Saat dilimi Europe/Istanbul veya ihtiyacınıza göre iş bazında ayarlanabilir.
Platform; GET, POST, PUT, PATCH, DELETE, HEAD ve OPTIONS HTTP metodlarını destekler. Uç noktanızı korumak için X-Cron-Token: GizliAnahtar gibi özel başlıklar (custom header), istek gövdesi veya HTTP Basic Auth kullanabilirsiniz. Yanıt bekleme (timeout) süresi 1 dakikalık görevlerde 55 saniye, 5 dakika ve üzeri veya cron ifadeli işlerde 290 saniyedir. HTTP 200–399 arası durum kodları başarı kabul edilir, en fazla 5 yönlendirme takip edilir ve HTTPS sertifikası doğrulanır.
Güvenlik kuralları gereği localhost veya yerel özel ağ IP'lerine (10.x, 192.168.x vb.) istek gönderilmez; uç noktanız internete açık olmalıdır. İstekler CronJobComTr/1.0 (+https://cronjob.com.tr) User-Agent bilgisiyle yapılır. Uç noktanız art arda 3 kez hata verirse (1–20 arası değiştirilebilir) e-posta ile erişim sorunu uyarısı gönderilir, sistem düzeldiğinde kesinti süresiyle düzeldi bildirimi iletilir (aynı iş için en az 60 dakika arayla). Tüm çalıştırmaların durum kodu, yanıt süresi, hata detayı ve yanıt gövdesinin ilk ~64 KB'ı 7 gün boyunca loglarda saklanır. Bu izleme bildirimleri dışında, kendi betiğinizin içindeki başarı ve hata mesajlarını e-posta yerine anlık mesajlaşmaya taşımak isterseniz cron görevlerinden Telegram bildirimi gönderme yöntemini değerlendirebilirsiniz.
Sıkça Sorulan Sorular (SSS)
Cron ile her dakika binlerce e-posta gönderebilir miyim?
Bu, SMTP sağlayıcısının hız limitlerine ve gönderim altyapısına bağlıdır. IP itibarını korumak için e-postalar kuyruğa alınmalı ve sağlayıcının hız limitlerine uygun paketler halinde gönderilmelidir.
Crontab'daki MAILTO parametresi ile script içindeki mail aynı mıdır?
Hayır, crontab içindeki MAILTO ortam değişkeni cron komutlarının terminal çıktı ve hata bildirimlerini sunucu yöneticisine iletmek içindir; betiğin kendi gönderdiği e-postalardan tamamen bağımsızdır.
PHP mail() fonksiyonu cron'da neden çalışmaz?
CLI ortamında çalışan php.ini dosyasında sendmail_path yönergesinin tanımlı olmamasından veya yerel sunucuda Postfix/Sendmail gibi yapılandırılmış bir MTA bulunmamasından kaynaklanır.
Harici SMTP REST API'leri cron'da kullanılabilir mi?
Evet, SendGrid, Mailgun veya Postmark gibi servislerin HTTP REST API'lerini curl veya betik üzerinden çağırmak, bulut sunuculardaki port 25 engellerini tamamen ortadan kaldırır.
cronjob.com.tr e-postalarımı benim adıma gönderir mi?
Hayır. cronjob.com.tr bir HTTP zamanlayıcıdır; bülten veya fatura gibi e-postaları sizin adınıza göndermez. Gönderdiği e-postalar yalnızca iş izlemeye ilişkindir: ardışık hata eşiği aşılınca erişim sorunu bildirimi, sorun düzelince kesinti süresiyle düzeldi bildirimi.
Kuyruk mimarisinde paket (chunk) boyutunu nasıl seçmeliyim?
SMTP sağlayıcınızın birim zaman başına izin verdiği ileti sayısının altında kalın; yaygın başlangıç noktası 50-100 e-postalık paket ve 5 dakikalık periyottur. Hata oranı artarsa paketi küçültün, kuyruk hızla büyüyorsa periyodu kısaltın; iki değişikliği aynı anda değil, tek tek deneyerek ölçün.
Hemen Ücretsiz Cron Job Oluşturun
E-posta kuyruğunuzu eriten uç noktayı (örn. POST /cron/process-email-queue) cronjob.com.tr panelinden 5 dakikada bir tetikleyin; ardışık hatalarda erişim sorunu e-postası, düzelince kesinti süresiyle bildirim alın. Ücretsiz; kayıtta kredi kartı gerekmez.