Blog

095 – IMAP Sunucusundan E-postaları İndirip Sıkıştırılmış TGZ Dosyaları Olarak Saklama

IMAP Sunucusundan E-postaları İndirip Sıkıştırılmış TGZ Dosyaları Olarak Saklama
Share

Bu makalede, IMAP sunucusundan belirli e-posta klasörlerini indirip, her klasörü sıkıştırılmış .tgz dosyaları olarak saklamayı öğreneceksiniz. Python kullanarak, bu işlemi gerçekleştiren bir komut dosyası yazacağız. Bu senaryo, e-posta yedeklemeleri yapmak veya belirli klasörleri arşivlemek isteyenler için oldukça faydalı olabilir. E-postalarınızı güvenli bir şekilde saklamak ve gerektiğinde kolayca erişebilmek için bu yöntemi kullanabilirsiniz.

IMAP Sunucusu

Gereksinimler

  • Python 3.x
  • IMAP sunucusu erişim bilgileri (kullanıcı adı, şifre, sunucu adresi, port)

Adım 1: Gerekli Kütüphaneleri Yükleme

Öncelikle, gerekli Python kütüphanelerini yükleyin. Bu örnekte, imaplib, argparse, email, re, os ve tarfile modüllerini kullanacağız. Bu kütüphaneler Python’un standart kütüphaneleri arasında yer alır, dolayısıyla ek bir yükleme yapmanıza gerek yoktur. Bu kütüphaneler, IMAP sunucusuna bağlanma, e-postaları indirme, dosya işlemleri ve sıkıştırma işlemleri için gereklidir.

Adım 2: Python Komut Dosyasını Oluşturma

Aşağıda, e-postaları IMAP sunucusundan indirip sıkıştırılmış .tgz dosyalarına dönüştüren Python komut dosyasını bulabilirsiniz. Bu komut dosyası, IMAP sunucusuna bağlanarak belirli klasörlerdeki e-postaları indirir ve her klasörü sıkıştırılmış bir dosya olarak saklar.

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import imaplib
import argparse
import email
import re
import os
import tarfile

def sanitize_filename(filename):
return re.sub(r'[^a-zA-Z0-9_\-\.]+', '_', filename)

def fetch_emails_from_folder(mailbox, folder, local_folder):
typ, data = mailbox.select(f'"{folder}"')
if typ != 'OK':
print(f"Klasör {folder} seçilemedi")
return

typ, data = mailbox.search(None, 'ALL')
if typ != 'OK' or not data[0]:
print(f"Klasör {folder} içinde arama yapılamadı veya klasör boş")
return

if not os.path.exists(local_folder):
os.makedirs(local_folder)

for num in data[0].split():
typ, data = mailbox.fetch(num, '(RFC822)')
if typ != 'OK':
print(f"Klasör {folder} içinde e-posta {num} getirilemedi")
continue

for response_part in data:
if isinstance(response_part, tuple):
msg = email.message_from_bytes(response_part[1])
if msg['Message-Id']:
filename = sanitize_filename(msg['Message-Id'])
else:
subject = msg['Subject'] or 'no_subject'
filename = f'no_message_id_{sanitize_filename(subject)}'

filename = filename.strip()
file_path = os.path.join(local_folder, f'{filename}.eml')

try:
with open(file_path, 'wb') as f:
f.write(response_part[1])
except OSError as e:
print(f"Dosya {file_path} yazılamadı: {e}")

def compress_folder_to_tgz(local_folder, output_file):
with tarfile.open(output_file, "w:gz") as tar:
for root, _, files in os.walk(local_folder):
for file in files:
if file.endswith('.eml'):
tar.add(os.path.join(root, file), arcname=os.path.relpath(os.path.join(root, file), local_folder))

def main():
argparser = argparse.ArgumentParser(description="Belirtilen IMAP klasörlerini ayrı .eml dosyalarına dök ve bunları ayrı .tgz dosyalarına sıkıştır")
argparser.add_argument('-s', dest='host', help="IMAP sunucusu, örn: imap.yourdomain.com", required=True)
argparser.add_argument('-u', dest='username', help="IMAP kullanıcı adı", required=True)
argparser.add_argument('-p', dest='password', help="IMAP şifresi", required=True)
argparser.add_argument('-l', dest='local_folder', help=".eml dosyalarının kaydedileceği yerel klasör", default='.')
argparser.add_argument('--port', dest='port', type=int, help="IMAP port numarası", required=True)
argparser.add_argument('--use_ssl', dest='use_ssl', action='store_true', help="IMAP bağlantısı için SSL kullan")
args = argparser.parse_args()

try:
if args.use_ssl:
mailbox = imaplib.IMAP4_SSL(args.host, port=args.port)
else:
mailbox = imaplib.IMAP4(args.host, port=args.port)

mailbox.login(args.username, args.password)

işlenecek_klasörler = ['Inbox', 'Sent Items']

for folder in işlenecek_klasörler:
folder_local_path = os.path.join(args.local_folder, sanitize_filename(folder))
fetch_emails_from_folder(mailbox, folder, folder_local_path)

output_tgz = f"{folder_local_path}.tgz"
compress_folder_to_tgz(folder_local_path, output_tgz)
print(f"Klasör {folder}, başarıyla {output_tgz} dosyasına sıkıştırıldı")

mailbox.logout()

except Exception as e:
print(f"Bir hata oluştu: {e}")

if __name__ == "__main__":
main()

Adım 3: Komut Dosyasını Çalıştırma

Bu komut dosyasını çalıştırmak için terminal veya komut istemcisine aşağıdaki komutu girin:
python test.py -s imap.domain.com -u kullanici@domain.com -p parola -l ./kullanici --port 993 --use_ssl

Imap bağlantısında SSL kullanmadan giriş yapmak istiyorsanız aşağıdaki komutu girin:

python test.py -s imap.domain.com -u kullanici@domain.com -p parola -l ./kullanici --port 143

Bu komut ile:

  • imap.domain.com: IMAP sunucu adresi
  • [email protected]: IMAP kullanıcı adı
  • parola: IMAP şifresi
  • ./kullanici: .eml dosyalarının kaydedileceği yerel klasör
  • --port 993: IMAP SSL portu
  • --use_ssl: IMAP bağlantısında SSL kullanımı

Bu komut dosyası, belirtilen IMAP sunucusuna bağlanarak “Inbox” ve “Sent Items” klasörlerini indirir ve her klasörü ayrı .tgz dosyalarına sıkıştırır. Bu sayede e-postalarınızı kolayca yedekleyebilir ve arşivleyebilirsiniz. E-postalarınızı sıkıştırılmış dosyalar halinde saklamak, hem depolama alanından tasarruf sağlar hem de e-postalarınıza daha hızlı erişim imkanı sunar.

Detaylı Açıklamalar ve Ek Bilgiler

IMAP Nedir?

IMAP (Internet Message Access Protocol), e-posta sunucularına erişim sağlamak için kullanılan bir protokoldür. IMAP, e-postalarınızı sunucuda saklar ve farklı cihazlardan erişim sağlar. Bu sayede, e-postalarınıza her yerden ve her cihazdan ulaşabilirsiniz. IMAP, e-postalarınızı organize etmenize ve klasörler halinde saklamanıza olanak tanır.

Python Kütüphaneleri

  • imaplib: IMAP sunucusuna bağlanmak ve e-postaları indirmek için kullanılır.
  • argparse: Komut satırı argümanlarını işlemek için kullanılır.
  • email: E-posta mesajlarını işlemek ve analiz etmek için kullanılır.
  • re: Düzenli ifadelerle metin işlemek için kullanılır.
  • os: Dosya ve dizin işlemleri için kullanılır.
  • tarfile: Dosyaları sıkıştırmak ve arşivlemek için kullanılır.

Komut Dosyasının Çalışma Mantığı

  1. Bağlantı Kurma: IMAP sunucusuna bağlanmak için kullanıcı adı, şifre ve sunucu adresi gibi bilgileri kullanır.
  2. Klasör Seçimi: Belirtilen klasörleri seçer ve içindeki e-postaları arar.
  3. E-postaları İndirme: E-postaları indirir ve yerel klasörde .eml dosyaları olarak saklar.
  4. Sıkıştırma: İndirilen e-postaları sıkıştırılmış .tgz dosyalarına dönüştürür.
  5. Çıkış: İşlem tamamlandığında IMAP sunucusundan çıkış yapar.

Güvenlik ve Dikkat Edilmesi Gerekenler

  • Şifre Güvenliği: IMAP şifrenizi güvenli bir şekilde saklayın ve paylaşmayın.
  • SSL Kullanımı: IMAP bağlantısında SSL kullanarak verilerinizi şifreleyin ve güvenli bir bağlantı sağlayın.
  • Yedekleme: E-postalarınızı düzenli olarak yedekleyin ve sıkıştırılmış dosyaları güvenli bir yerde saklayın.

Bu makalede, IMAP sunucusundan e-postaları indirip sıkıştırılmış .tgz dosyaları olarak saklamayı öğrendiniz. Python kullanarak bu işlemi gerçekleştiren bir komut dosyası yazdık ve adım adım nasıl çalıştırılacağını açıkladık. Bu yöntemle e-postalarınızı güvenli bir şekilde yedekleyebilir ve arşivleyebilirsiniz.