- Konu sahibi
- #1
İşlem için
Önce SMTP sağlayıcınızdan sunucu adresini, portu, kullanıcı adını ve uygulama parolasını öğrenin. Normal SMTP bağlantısı için
Betiği çalıştırmadan önce sunucuda şu ortam değişkenlerini tanımlayın. Değerleri kendi SMTP hizmetinizin bilgileriyle değiştirin:
Çıktıda
SMTP bağlantınız TLS ile
Sunucuda betiği elle çalıştırıp önce normal durum çıktısını, ardından geçici olarak
Cron ayrı bir oturumla çalıştığı için ortam değişkenlerini yalnızca kullanıcı oturumunda tanımlamak yeterli olmayabilir. Değişkenleri cron ortamında da tanımlayın veya betiğin okuyacağı, yalnızca yetkili kullanıcının erişebildiği bir yapılandırma dosyası kullanın. Parola içeren dosyanın izinlerini kısıtlayın; parolayı doğrudan Python kaynak koduna ya da komut satırı geçmişine yazmayın.
Aynı eşik altında her 10 dakikada bir e-posta almak istemiyorsanız son uyarı zamanını bir dosyada saklayıp yalnızca belirli bir süre geçtiğinde gönderim yapacak bir bekleme mekanizması ekleyin. Aksi hâlde disk temizlenene kadar zamanlayıcının her çalışmasında yeni uyarı gönderilir.
shutil.disk_usage() ile sunucudaki dosya sisteminin boş alanını ölçüp belirlediğiniz eşik altına inildiğinde smtplib ve EmailMessage ile SMTP sunucusundan e-posta gönderebilirsiniz. Aşağıdaki örnek, / bölümünde boş alan yüzde 15’in altına düştüğünde uyarı gönderir; SMTP bilgilerinin kod içine yazılmaması için ortam değişkenlerini kullanır.Çalışan Python betiği
Önce SMTP sağlayıcınızdan sunucu adresini, portu, kullanıcı adını ve uygulama parolasını öğrenin. Normal SMTP bağlantısı için
SMTP, TLS ile doğrudan bağlantı için SMTP_SSL kullanılabilir. Sağlayıcınızın istediği yönteme göre aşağıdaki iki bağlantı biçiminden birini seçin.
Python:
import os
import shutil
import smtplib
from email.message import EmailMessage
# İzlenecek bölüm ve uyarı eşiği
IZLENECEK_YOL = "/"
ESIK_YUZDE = 15
SMTP_SUNUCU = os.environ["SMTP_SUNUCU"]
SMTP_PORT = int(os.environ.get("SMTP_PORT", "465"))
SMTP_KULLANICI = os.environ["SMTP_KULLANICI"]
SMTP_PAROLA = os.environ["SMTP_PAROLA"]
GONDEREN = os.environ.get("UYARI_GONDEREN", SMTP_KULLANICI)
ALICI = os.environ["UYARI_ALICI"]
def eposta_gonder(kullanilan_yuzde, bos_gb, toplam_gb):
mesaj = EmailMessage()
mesaj["Subject"] = f"Disk alanı uyarısı: %{kullanilan_yuzde:.1f} kullanılıyor"
mesaj["From"] = GONDEREN
mesaj["To"] = ALICI
mesaj.set_content(
f"{IZLENECEK_YOL} bölümünde disk kullanımı %{kullanilan_yuzde:.1f}.\n"
f"Boş alan: {bos_gb:.2f} GB\n"
f"Toplam alan: {toplam_gb:.2f} GB\n"
f"Eşik: %{ESIK_YUZDE} boş alan"
)
with smtplib.SMTP_SSL(SMTP_SUNUCU, SMTP_PORT, timeout=30) as smtp:
smtp.login(SMTP_KULLANICI, SMTP_PAROLA)
smtp.send_message(mesaj)
def kontrol_et():
toplam, kullanilan, bos = shutil.disk_usage(IZLENECEK_YOL)
bos_yuzde = bos / toplam * 100
kullanilan_yuzde = 100 - bos_yuzde
if bos_yuzde < ESIK_YUZDE:
eposta_gonder(
kullanilan_yuzde,
bos / (1024 ** 3),
toplam / (1024 ** 3)
)
print("Disk eşiği aşıldı; uyarı e-postası gönderildi.")
else:
print(f"Disk durumu normal: %{bos_yuzde:.1f} boş alan var.")
if __name__ == "__main__":
kontrol_et()
shutil.disk_usage() toplam, kullanılan ve boş alanı bayt cinsinden döndürür. Kod bu değerleri gigabayta çevirir, boş alan yüzdesini hesaplar ve yalnızca boş alan %15 değerinin altına indiğinde e-posta gönderir.SMTP bilgilerini güvenli biçimde tanımlama
Betiği çalıştırmadan önce sunucuda şu ortam değişkenlerini tanımlayın. Değerleri kendi SMTP hizmetinizin bilgileriyle değiştirin:
Bash:
export SMTP_SUNUCU="smtp.ornek.com"
export SMTP_PORT="465"
export SMTP_KULLANICI="[email protected]"
export SMTP_PAROLA="uygulama-parolasi"
export UYARI_GONDEREN="[email protected]"
export UYARI_ALICI="[email protected]"
python3 disk_uyari.py
Çıktıda
Disk durumu normal görülürse ölçüm yapılmış, ancak eşik aşılmadığı için e-posta gönderilmemiştir. uyarı e-postası gönderildi çıktısı yalnızca SMTP sunucusunun mesajı kabul ettiğini gösterir; alıcının gelen kutusuna ulaştığını garanti etmez. Mesaj gelmezse SMTP sunucusu, port, kimlik doğrulama, uygulama parolası ve spam klasörünü ayrı ayrı kontrol edin. SMTPAuthenticationError alırsanız özellikle normal hesap parolası yerine sağlayıcının gerektirdiği uygulama parolasını kullanın.SMTP bağlantınız TLS ile
587 portunda çalışıyorsa bağlantı bölümünü şu şekilde değiştirin:
Python:
with smtplib.SMTP(SMTP_SUNUCU, 587, timeout=30) as smtp:
smtp.starttls()
smtp.login(SMTP_KULLANICI, SMTP_PAROLA)
smtp.send_message(mesaj)
send_message() bir EmailMessage nesnesini SMTP üzerinden gönderir; with kullanımı bağlantının işlem sonunda kapatılmasını sağlar.Betiği otomatik çalıştırma
Sunucuda betiği elle çalıştırıp önce normal durum çıktısını, ardından geçici olarak
ESIK_YUZDE değerini yükselterek uyarı gönderimini test edin. Test başarılı olduktan sonra betiği işletim sisteminin zamanlayıcısına ekleyin. Linux’ta örneğin crontab -e ile şu satır, betiği her 10 dakikada bir çalıştırır:
Kod:
*/10 * * * * /usr/bin/python3 /opt/disk_uyari.py >> /var/log/disk_uyari.log 2>&1
Cron ayrı bir oturumla çalıştığı için ortam değişkenlerini yalnızca kullanıcı oturumunda tanımlamak yeterli olmayabilir. Değişkenleri cron ortamında da tanımlayın veya betiğin okuyacağı, yalnızca yetkili kullanıcının erişebildiği bir yapılandırma dosyası kullanın. Parola içeren dosyanın izinlerini kısıtlayın; parolayı doğrudan Python kaynak koduna ya da komut satırı geçmişine yazmayın.
Aynı eşik altında her 10 dakikada bir e-posta almak istemiyorsanız son uyarı zamanını bir dosyada saklayıp yalnızca belirli bir süre geçtiğinde gönderim yapacak bir bekleme mekanizması ekleyin. Aksi hâlde disk temizlenene kadar zamanlayıcının her çalışmasında yeni uyarı gönderilir.