- Konu sahibi
- #1
Python’da e-posta göndermek için standart kütüphanedeki
SMTP, uygulamanın e-posta sunucusuna ileti teslim etmek için kullandığı protokoldür. Önce e-posta hesabınızın veya kullandığınız kurumsal posta hizmetinin şu bilgilerini öğrenin:
|
|
Parolayı doğrudan kod içine, Git deposuna veya hata kayıtlarına yazmayın. Aşağıdaki örnek, bilgileri işletim sistemi ortam değişkenlerinden okur. Örnekteki değerler varsayımsaldır; gerçek SMTP sunucusu ve bağlantı noktası için posta hizmetinizin resmî ayarlarını kullanmalısınız.
Aşağıdaki kod, HTML içermeyen düz metin bir ileti gönderir. Dosyayı örneğin
Çalıştırmadan önce aşağıdaki ortam değişkenlerini kendi sisteminizde tanımlayın:
Windows PowerShell kullanıyorsanız karşılığı şöyledir:
Kod çalışırken ortam değişkenlerinden biri eksikse
SMTP hizmeti doğrudan SSL yerine STARTTLS istiyorsa bağlantı bölümünü değiştirin. Mesajı hazırlayan diğer kod aynı kalabilir:
Burada
Kodun hata vermeden tamamlanması, SMTP sunucusunun iletiyi kabul ettiğini gösterir. Bu, alıcının iletiyi okuduğunu veya iletiyi gelen kutusunda gördüğünü kanıtlamaz. İleti spam klasörüne düşebilir, alıcı sunucusu tarafından daha sonra reddedilebilir ya da teslim edilemeyebilir.
Önce gönderici ve alıcı adreslerinin doğru olduğunu, ardından SMTP sunucusunun hata döndürmediğini kontrol edin. İleti ulaşmıyorsa gönderici hesabının gönderilmiş iletiler klasörünü, alıcının spam klasörünü ve SMTP hizmetinin teslimat günlüklerini inceleyin. SMTP sunucusu bir hata kodu veriyorsa hata metnini saklayın; destek talebinde gönderen adresi, alıcı alan adı, işlem zamanı, kullanılan bağlantı noktası ve hata kodunu paylaşın, fakat parolayı veya ileti içeriğindeki hassas bilgileri paylaşmayın.
Düz metin yerine HTML göndermeniz gerekiyorsa
HTML e-posta gönderimi, alıcının istemcisinde görüntüleneceğini garanti etmez. Bu nedenle düz metin karşılığını bırakmak, erişilebilirlik ve uyumluluk açısından daha güvenlidir.
smtplib modülünü kullanabilir, bir SMTP sunucusuna bağlanıp kimlik doğrulamasından sonra iletiyi gönderebilirsiniz. Aşağıdaki örnekte SMTP sunucusu, kullanıcı adı, parola, alıcı adresi ve ileti bilgileri ortam değişkenlerinden alınır; böylece parola kaynak koduna yazılmaz. Gönderim başarılı olduğunda send_message() hata vermeden tamamlanır, ancak bu sonuç iletinin alıcının gelen kutusuna kesin olarak ulaştığını değil, SMTP sunucusunun iletiyi kabul ettiğini gösterir.SMTP bilgilerini hazırlayın
SMTP, uygulamanın e-posta sunucusuna ileti teslim etmek için kullandığı protokoldür. Önce e-posta hesabınızın veya kullandığınız kurumsal posta hizmetinin şu bilgilerini öğrenin:
- SMTP sunucusunun adresi
- SMTP bağlantı noktası
- TLS veya SSL kullanımı
- SMTP kullanıcı adı; çoğu hizmette bu, e-posta adresidir
- Parola veya hizmetin istediği uygulama parolası
SMTP_SSL bağlantıyı baştan SSL/TLS ile açar. starttls() ise önce normal SMTP bağlantısı kurar, ardından aynı bağlantıyı TLS ile şifreler. Bu iki yöntemi ve bağlantı noktalarını birbirine karıştırmayın; sunucunuz hangi yöntemi destekliyorsa onu kullanın.|
| Yöntem | Python kullanımı | Yaygın kullanım |
|---|---|---|
| SSL/TLS ile doğrudan bağlantı | smtplib.SMTP_SSL | Sunucu bağlantıyı baştan şifreli açıyorsa |
| STARTTLS | SMTP ardından starttls() | Sunucu önce bağlantı kurup sonra TLS yükseltmesi istiyorsa |
Parolayı doğrudan kod içine, Git deposuna veya hata kayıtlarına yazmayın. Aşağıdaki örnek, bilgileri işletim sistemi ortam değişkenlerinden okur. Örnekteki değerler varsayımsaldır; gerçek SMTP sunucusu ve bağlantı noktası için posta hizmetinizin resmî ayarlarını kullanmalısınız.
SSL/TLS ile e-posta gönderme
Aşağıdaki kod, HTML içermeyen düz metin bir ileti gönderir. Dosyayı örneğin
mail_gonder.py adıyla kaydedin:
Python:
import os
import smtplib
from email.message import EmailMessage
smtp_host = os.environ["SMTP_HOST"]
smtp_port = int(os.environ.get("SMTP_PORT", "465"))
smtp_user = os.environ["SMTP_USER"]
smtp_password = os.environ["SMTP_PASSWORD"]
sender = smtp_user
recipient = os.environ["MAIL_TO"]
message = EmailMessage()
message["From"] = sender
message["To"] = recipient
message["Subject"] = "Python ile gönderilen deneme iletisi"
message.set_content(
"Merhaba,\n\nBu ileti Python kullanılarak gönderildi."
)
with smtplib.SMTP_SSL(smtp_host, smtp_port, timeout=30) as smtp:
smtp.login(smtp_user, smtp_password)
smtp.send_message(message)
print("İleti SMTP sunucusuna gönderilmek üzere kabul edildi.")
Çalıştırmadan önce aşağıdaki ortam değişkenlerini kendi sisteminizde tanımlayın:
SMTP_HOST: SMTP sunucusunun adresiSMTP_PORT: SSL bağlantısı için sunucunuzun istediği bağlantı noktası; örnekte varsayılan değer465kullanılırSMTP_USER: SMTP kullanıcı adıSMTP_PASSWORD: parola veya hizmetin istediği uygulama parolasıMAIL_TO: alıcının e-posta adresi
Bash:
export SMTP_HOST="smtp.ornek.com"
export SMTP_PORT="465"
export SMTP_USER="[email protected]"
export SMTP_PASSWORD="uygulama-parolasi"
export MAIL_TO="[email protected]"
python mail_gonder.py
Windows PowerShell kullanıyorsanız karşılığı şöyledir:
Kod:
$env:SMTP_HOST = "smtp.ornek.com"
$env:SMTP_PORT = "465"
$env:SMTP_USER = "[email protected]"
$env:SMTP_PASSWORD = "uygulama-parolasi"
$env:MAIL_TO = "[email protected]"
python .\mail_gonder.py
Kod çalışırken ortam değişkenlerinden biri eksikse
KeyError alırsınız. Bu durumda değişken adlarını ve kodu çalıştırdığınız aynı terminal oturumunu kontrol edin. SMTPAuthenticationError kimlik doğrulamasının reddedildiğini gösterir; kullanıcı adı, parola, hesabın SMTP erişimi ve gerekiyorsa uygulama parolası birlikte kontrol edilmelidir. SMTPConnectError veya zaman aşımı ise genellikle sunucu adresi, bağlantı noktası, TLS yöntemi ya da ağ erişimiyle ilgilidir.STARTTLS kullanan sunucuya bağlanma
SMTP hizmeti doğrudan SSL yerine STARTTLS istiyorsa bağlantı bölümünü değiştirin. Mesajı hazırlayan diğer kod aynı kalabilir:
Python:
with smtplib.SMTP(smtp_host, 587, timeout=30) as smtp:
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.login(smtp_user, smtp_password)
smtp.send_message(message)
Burada
587 yalnızca örnek bir bağlantı noktasıdır; gerçek değeri kullandığınız SMTP hizmetinin güncel ayarından alın. Kullanıcı adı ve parolayı doğrulanmamış bir bağlantıda göndermeyin. starttls() çağrısı hata verirse sunucunun STARTTLS desteğini, bağlantı noktasını ve güvenlik ayarını kontrol edin.Gönderimin sonucunu nasıl yorumlamalısınız?
Kodun hata vermeden tamamlanması, SMTP sunucusunun iletiyi kabul ettiğini gösterir. Bu, alıcının iletiyi okuduğunu veya iletiyi gelen kutusunda gördüğünü kanıtlamaz. İleti spam klasörüne düşebilir, alıcı sunucusu tarafından daha sonra reddedilebilir ya da teslim edilemeyebilir.
Önce gönderici ve alıcı adreslerinin doğru olduğunu, ardından SMTP sunucusunun hata döndürmediğini kontrol edin. İleti ulaşmıyorsa gönderici hesabının gönderilmiş iletiler klasörünü, alıcının spam klasörünü ve SMTP hizmetinin teslimat günlüklerini inceleyin. SMTP sunucusu bir hata kodu veriyorsa hata metnini saklayın; destek talebinde gönderen adresi, alıcı alan adı, işlem zamanı, kullanılan bağlantı noktası ve hata kodunu paylaşın, fakat parolayı veya ileti içeriğindeki hassas bilgileri paylaşmayın.
Düz metin yerine HTML göndermeniz gerekiyorsa
set_content() ile metin bölümünü koruyup add_alternative() kullanabilirsiniz:
Python:
message.set_content("Bu ileti HTML desteklemeyen istemciler için düz metindir.")
message.add_alternative(
"<html><body><h1>Merhaba</h1><p>Bu HTML içeriktir.</p></body></html>",
subtype="html",
)
HTML e-posta gönderimi, alıcının istemcisinde görüntüleneceğini garanti etmez. Bu nedenle düz metin karşılığını bırakmak, erişilebilirlik ve uyumluluk açısından daha güvenlidir.