Python ile gelen kutusunu okumak ve ekleri otomatik indirmek
Beceri rehberi

Python ile gelen kutusunu okumak ve ekleri otomatik indirmek

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 6 dk okuma

Her gün gelen faturayı, raporu ya da formu elle indirmek yerine bir Python betiği gelen kutusunu tarayıp ekleri kaydedebilir. IMAP bağlantısı, iletiyi ayrıştırma ve güvenli kullanım işin üç ayağıdır.

Bir bakışta

  1. Okuma IMAP ile, gönderme SMTP ile yapılır. Gelen kutusunu okumak için imaplib, iletiyi çözmek için email modülü kullanılır.
  2. Betik önce iletileri arar, sonra yalnızca eşleşenleri çeker. Tüm gelen kutusunu indirmek yavaştır ve gereksizdir.
  3. İletinin yapısı katmanlıdır: başlık, gövde ve ekler. Ekleri bulmak için çok parçalı yapıyı dolaşmak gerekir.
  4. Kimlik bilgisi betiğe yazılmaz, uygulama şifresi tercih edilir. Birçok sağlayıcı normal şifre yerine uygulamaya özel şifre ya da başka bir yetkilendirme ister.
  5. Gelen ekler güvenilmez veridir. Dosya adı ve türü doğrulanmadan kaydedilmez ya da çalıştırılmaz.

Python ile e-posta okuma nasıl çalışır?

E-posta okumak ile göndermek farklı protokollere dayanır. Gönderme SMTP ile yapılır ve ayrı bir rehberde ele alınır. Okuma ise çoğunlukla IMAP ile yapılır: iletiler sunucuda durur, betik sunucuya bağlanır, bir klasörü seçer, arama yapar ve istediği iletileri çeker. Python standart kütüphanesindeki imaplib bu bağlantıyı, email modülü ise ham ileti verisini çözümlemeyi sağlar. Ayrıca kütüphane kurmanız gerekmez.

Akış her zaman aynıdır: sunucuya güvenli bağlan, oturum aç, klasör seç, ilgili iletileri ara, bulunanları çek, her iletiyi çöz, ekleri kaydet, bağlantıyı kapat. Birçok gerçek iş bu akışın bir uyarlamasıdır: günlük raporu gelen kutusundan alıp bir klasöre koymak, belirli bir göndericiden gelen faturaları toplamak ya da form bildirimlerini bir tabloya aktarmak.

İş akışınız yalnız birkaç iletiyle sınırlıysa ve sağlayıcınız bir otomasyon aracı sunuyorsa, kod yazmadan çözüm de mümkündür. Ama arama koşulları, ek ayıklama ve sonrasında dosya işleme gerektiğinde Python esneklik sağlar. Ekleri indirdikten sonraki adım, genellikle PDF ya da Excel dosyasını okumaktır; bunun için de ayrı rehberler vardır.

Bağlantı ve kimlik doğrulama

Bağlantı için IMAP4_SSL sınıfı kullanılır; bu, şifreli bağlantı kurar. Belgeye göre varsayılan bağlamla bağlantı şifrelenir ama sunucu sertifikası ve ana makine adı doğrulanmaz; doğrulama için ssl.create_default_context() ile üretilen bir bağlamı ssl_context olarak vermek gerekir. Bunu her zaman yapın.

Oturum açmak için login kullanılır. Birçok e-posta sağlayıcısı, düz şifre ile IMAP girişini kapatmıştır ya da iki adımlı doğrulama zorunlu kılmıştır; bu durumda uygulamaya özel şifre ya da sağlayıcının önerdiği başka yetkilendirme yöntemi gerekir. Hangi yöntemin geçerli olduğunu sağlayıcınızın güncel belgelerinden öğrenin; bu bilgi sık değişir.

Sunucu adı, kullanıcı adı ve şifre betiğin içine yazılmaz. Ortam değişkenlerinden ya da güvenli bir gizli bilgi deposundan okunur. Betik bir sürüm kontrol sistemine konulacaksa bu bilgilerin dışarıda kalması özellikle önemlidir. Kurumsal posta kutularında betik için ayrı, yetkisi sınırlı bir hesap kullanmak iyi bir uygulamadır.

Şekil 1

Bir e-posta iletisi iç içe katmanlardan oluşur

Betik bu katmanları sırayla çözer

  1. Zarf ve başlıkGönderen, konu ve tarih gibi bilgiler.
  2. GövdeDüz metin ve varsa HTML sürümü.
  3. EklerDosya adı ve içeriğiyle ayrı parçalar.
Kaynak: Sayfa içeriğiMindset Institute

Örnek betik: okunmamış iletilerin eklerini kaydetmek

Şu betik, gelen kutusundaki okunmamış iletileri arar, her ileti için ekleri ayıklar ve bir klasöre kaydeder. Bağlantı bilgileri ortam değişkenlerinden okunur:

import email import imaplib import os import ssl from email import policy from pathlib import Path

hedef = Path("ekler") hedef.mkdir(exist_ok=True) baglam = ssl.create_default_context()

with imaplib.IMAP4_SSL(os.environ["IMAP_SUNUCU"], ssl_context=baglam) as posta: posta.login(os.environ["POSTA_KULLANICI"], os.environ["POSTA_UYGULAMA_SIFRESI"]) posta.select("INBOX", readonly=True) durum, veri = posta.uid("search", None, "UNSEEN") for uid in veri.pop().split(): durum, parcalar = posta.uid("fetch", uid, "(RFC822)") for parca in parcalar: if not isinstance(parca, tuple): continue zarf, ham = parca ileti = email.message_from_bytes(ham, policy=policy.default) for ek in ileti.iter_attachments(): ad = ek.get_filename() if ad: (hedef / Path(ad).name).write_bytes(ek.get_payload(decode=True))

Belgeye göre iletileri numara yerine UID ile işlemek önerilir, çünkü silme sonrası ileti numaraları değişir. Fetch yanıtı ek ya da beklenmeyen veri içerebileceğinden betik, yanıtın içindeki gerçek ileti parçasını bir demet olup olmadığına bakarak seçer. Klasör salt okunur seçildiği için denemeler iletileri okundu olarak işaretlemez.

Betikte Path(ad).name kullanımı bilinçlidir: dosya adından yol bilgisini atar, böylece kötü niyetli bir ek adı klasör dışına yazmayı deneyemez.

Aramak, filtrelemek ve işlenmişi işaretlemek

Tüm gelen kutusunu indirmek yerine arama koşullarıyla işe başlayın. IMAP aramaları gönderene, konuya, tarihe ve okunma durumuna göre yapılabilir; örneğin belirli bir göndericinin okunmamış iletileri. Arama sonucu, iletilerin kimliklerinin listesidir. Betik sadece bu listedekileri çeker.

Bir iletinin ikinci kez işlenmemesi için kayıt tutmak gerekir. Okundu işaretine güvenmek riskli olabilir, çünkü bir kişi iletiyi betikten önce açmış olabilir. Daha sağlam yol, işlenmiş iletilerin kimliğini bir dosyaya ya da veritabanına yazmak, ya da işlenen iletiyi ayrı bir klasöre taşımaktır. Ayrıca aynı ek iki kez gelirse çakışmayı önlemek için dosya adına tarih ya da ileti kimliği eklenir.

Betiği düzenli çalıştırmak istiyorsanız zamanlanmış görev ya da iş zamanlayıcı kullanılır; bu konu ayrı bir rehberde ele alınmıştır. Zamanlanmış çalışmada hata günlüğü şarttır: bağlantı koptuğunda ya da şifre değiştiğinde betiğin sessizce durmaması gerekir.

Ekleri güvenle işlemek

Gelen ekler kontrolünüzde olmayan veridir. İlk kural, eki hiçbir zaman otomatik çalıştırmamaktır. İkinci kural dosya adını ve türünü doğrulamaktır: beklediğiniz uzantıların bir beyaz listesini tutun (örneğin yalnız PDF ve tablo dosyaları) ve diğerlerini kaydetmeyin ya da karantinaya alın. Üçüncü kural dosya adını güvenli hale getirmektir; yol ayırıcı karakterleri atın.

Dördüncü kural, boyut sınırı koymaktır. Çok büyük bir ek betiği ya da diski tıkayabilir. Beşinci kural, beklenmeyen göndericileri elemektir: yalnız bilinen adreslerden gelen iletileri işleyin. Gönderen adresi kolay taklit edilebildiğinden, ek içeriğini işlemeden önce yine de doğrulama yapın.

Ekler kişisel veri taşıyorsa, kaydedildikleri klasörün erişim haklarını ve saklama süresini düşünün. Özellikle ortak ağ klasörlerinde yetkisiz erişim riski oluşur. Betiğin kaydettiği dosyaları işlediğinizde ve işiniz bittiğinde silme ya da arşivleme kuralı da tanımlayın.

Şekil 2

Güvenli betik, eki güvenilmez veri olarak ele alır

Ek işlemede iki yaklaşım

Riskli
Güvenli
Dosya adını olduğu gibi kullanır
Yol bilgisini atar, adı temizler
Her türden eki kaydeder
Yalnız beklenen uzantıları kabul eder
Boyut sınırı yoktur
Boyut sınırı uygular
Bilgileri betik içinde tutar
Bilgileri ortam değişkenlerinden okur
Kaynak: Sayfa içeriğiMindset Institute

Örnek senaryo: tedarikçi faturalarını toplamak

Bir muhasebe ekibine her gün farklı tedarikçilerden PDF fatura gelir. Ekip üyesi, ekleri tek tek indirip klasöre kaydediyor. Betik bunu devralır: her sabah gelen kutusunda bilinen tedarikçi adreslerinden gelen okunmamış iletileri arar, PDF ekleri tarih ve gönderen adıyla adlandırarak klasöre kaydeder ve işlenen iletiyi "İşlendi" klasörüne taşır.

PDF dışındaki ekler, boyutu aşan ekler ve bilinmeyen göndericiler ayrı bir inceleme klasörüne ayrılır; ekip üyesi her gün bu klasöre göz atar. Betik bir hata alırsa günlüğe yazar ve ekibe bir bildirim gönderir; sessiz başarısızlık yok.

Sonraki aşamada klasördeki PDF'lerden tutar ve fatura numarası okunup tabloya işlenebilir. Böylece e-postadan başlayıp kayda ulaşan uçtan uca bir otomasyon oluşur. İlk sürümde yalnız indirmeyi otomatikleştirin; sonrasını deneyip güvendikten sonra ekleyin.

Sık hatalar

İlk hata, sertifika doğrulamasız bağlantı kurmaktır; varsayılan bağlam doğrulamaz. İkinci hata, ileti numaralarıyla çalışmaktır; silme ya da taşıma sonrası numaralar kayar, UID kullanın. Üçüncü hata fetch yanıtının biçimini varsaymaktır; yanıtın tamamını inceleyin.

Dördüncü hata Türkçe karakterleri ve başlık kodlamasını unutmaktır. Konu ve dosya adlarında özel karakter varsa email modülünün varsayılan ilkesi bunları çözer, ama el ile bayt işlemek bunu bozar. Beşinci hata, işlenen iletiyi kaydetmeyip betiği her çalıştırmada aynı ekleri tekrar indirmektir.

Son olarak, gelen kutusunu kişisel hesabın şifresiyle okuyan bir betik riskli bir tasarımdır. Mümkünse betik için ayrı, yetkisi sınırlı bir posta kutusu ve uygulama şifresi kullanın.

Bu beceriyi Mindset programlarında nerede çalışırsınız

Python ile Robotic Process Automation (RPA) Eğitimi, Otomatik E-postalar modülünün yanında belge, PDF, CSV ve JSON otomasyonu modüllerini içerir; e-postadan gelen eki alıp işlemek bu modüllerin doğal bir birleşimidir. Gelen belgeleri elle işleyen finans, operasyon ve destek ekiplerinin çalışanları için uygundur.

Python ile Programlama Eğitimi ise betik yazmak için gereken dil temellerini sağlar.

İlgili Mindset programı

Python ile Robotic Process Automation ( RPA ) Eğitimi

Sık sorulanlar

Sık sorulan sorular

Gmail veya Outlook hesabını Python ile okuyabilir miyim?

Genellikle evet, ama sağlayıcının IMAP erişimine izin vermesi ve kimlik doğrulama koşullarını karşılamanız gerekir. Birçok sağlayıcı uygulamaya özel şifre ya da başka bir yetkilendirme ister. Güncel koşullar değiştiğinden sağlayıcının belgesine bakın.

IMAP ile POP arasındaki fark nedir?

IMAP iletileri sunucuda tutar ve klasörleri, okundu durumunu sunucu üzerinde yönetmenizi sağlar. POP ise genellikle iletileri indirip sunucudan siler. Otomasyon için çoğu durumda IMAP daha uygundur, çünkü iletileri taşıyıp işaretleyebilirsiniz.

Betik iletiyi okundu olarak işaretler mi?

Klasör salt okunur seçilirse okuma, iletiyi işaretlemez. Yazılabilir seçilirse ileti çekildiğinde okundu olabilir. Hangi davranışı istediğinize karar verin; işlenmişi ayrıca kaydetmek her iki durumda da daha güvenilirdir.

Ekler neden bozuk iniyor?

Genellikle eki metin gibi okuyup kaydetmekten kaynaklanır. Ek, ikili veri olarak çözülmeli ve ikili modda yazılmalıdır. Dosya adındaki kodlama da bozulabilir; email modülünün güncel ilkesi bunu çözümlemeyi kolaylaştırır.

Okunan e-postalara betikle yanıt verilebilir mi?

Evet, ama yanıtı göndermek SMTP ile yapılır. Okuma ve gönderme ayrı bağlantılardır. Otomatik yanıt döngülerine (iki otomasyonun birbirine sürekli yanıt vermesi) dikkat edin; otomatik yanıtlara yanıt vermeyen kurallar koyun.

Python ile E-posta Okuma ve Ekleri İndirme (IMAP)