Python ile Gmail Üzerinden E-Posta Göndermek

Geçenlerde, e-posta adresime posta göndermek için bir python betiğine ihtiyacım olmuştu. İnternette biraz araştırınca güzel bir kod buldum. Kodda, Gmail adresimize bağlanarak istediğimiz adrese e-posta atabiliyoruz. Bir zaman o kodu kullandım ama hem içindekileri biraz daha anlamak hem de kendim yazarak deneyim kazanmak için internetteki belgeleri okumaya başladım. Kafamdaki sorulara bir ölçüde yanıt bularak yeni bir e-posta betiği (script) yazdım. Kod, yukarıda örneğini verdiğim koda benzer.

posta_olustur fonksiyonuyla e-postamız oluşturulmaya başlanıyor. Önce bazı başlık bilgileri (header) ekleniyor. Ardından attach fonksiyonuyla postamıza mesajımız (yazı kısmı) ekleniyor. For döngüsü ile de dosyalarımız teker teker eklenerek posta oluşturma işlemi sona erer.

posta_gonder fonksiyonuyla da gmail sunucusuna giriş yapılıp (login) e-postamız belirttiğimiz adrese gönderilir.

En son olarak da kullanıcıdan bilgiler istenip, gerekli fonksiyonlar çalıştırılır.

Uygulamanın Tam Kodu:

#Batuhan Bayrakçı - Python ile Gmail Üzerinden E-posta Göndermek
#!/usr/bin/python2.6
#-*-coding:utf-8-*-

import smtplib, os
#MIME tipinde posta oluşturmak için gerekli modüller
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email import encoders

posta = MIMEMultipart()
dosyalar=[""]

def posta_olustur():

	posta['Subject']=konu
	posta['From']=gmail_kullanici
	posta['To']=kime

	posta.attach(MIMEText(mesaj)) #mesaj (yazı) kısmımız postamıza ekleniyor
	for dosya in dosyalar: #dosyalar eklenmeye başlar
		if (dosya!=""):
			try:
				eklenti = MIMEBase("application", "octet-stream")
				eklenti.set_payload(open(dosya, "rb").read())
				encoders.encode_base64(eklenti)
				eklenti.add_header("Content-Disposition", "attachment", filename=os.path.basename(dosya))
				posta.attach(eklenti)
			except:
				print "Dosya eklemede hata, dosya adını yanlış girmiş olabilirsiniz..."
		else: continue

def posta_gonder():
	smtpserver = smtplib.SMTP("smtp.gmail.com",587)
	smtpserver.ehlo()
	smtpserver.starttls()
	smtpserver.ehlo
	smtpserver.login(gmail_kullanici, gmail_sifre)
	print "Baglantı sağlandı"
	smtpserver.sendmail(gmail_kullanici, kime, posta.as_string())
	print "Posta Gönderildi"
	smtpserver.close()

kime = raw_input("Kime Göndereceksiniz?: ")
gmail_kullanici = raw_input("Gmail Hesabınızın Kullanıcı Adı: ")
gmail_sifre = raw_input("Gmail Hesabınızın Şifresi: ")
konu = raw_input ("Posta Konusu: ")
mesaj = raw_input ("Mesajınız: ")

#Dosyaların eklemesi yapılmaya başlanır
while True:
	cevap = raw_input("Dosya eklemek ister misiniz? (e/h): ")
	if(cevap=='e' or cevap=='E'):
		dosya_gonder = raw_input("Dosya göndermek istiyorsanız dosyanızın tam konumunu veya " + os.getcwd() + " dizinindeyse sadece adını yazın: ")
		if (dosya_gonder!=""):
			dosyalar.append(dosya_gonder)

		else:
			break
	elif(cevap=='h' or cevap=='H'):
		break
	else:
		print "Geçersiz giriş"
		continue
#Dosya eklenme işi biter

posta_olustur()
posta_gonder()

Yararlı Kaynaklar:

http://www.tutorialspoint.com/python/python_sending_email.htm
http://docs.python.org/library/email
http://docs.python.org/library/smtplib.html
http://www.devshed.com/c/a/Python/Python-Email-Libraries-SMTP-and-Email-Parsing/

İyi Çalışmalar…

4 Yorum

  1. Hüseyin Says:

    smtplib güzelmiş. Binlerce mailden oluşan listelere toplu mail gönderim programı hazırlanabilir mesela. Ama gmail’in günlük mail gönderim sınırı var sanırım… Herneyse eline sağlık. İyi çalışmalar…

  2. Batuhan Says:

    Sınırlama var mı bilmiyorum. Bu kodu yazarken onlarca mail gönderme denemesi yaptım, bir sorun çıkmadı.

    Sağolun…

Yorum Yazın...