Mario

WFN Üye
Konular
626
Mesajlar
626
Çözüm
0
Ticaret Puanı
0
Üyelik
24 Gün
Konum
Zonguldak
Web Sitesi
Var
Alanı
Google Optimiz.
1/1
Konu sahibi
Python’da e-posta göndermek için standart kütüphanedeki 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ı
Güvenli bağlantı için genellikle iki yöntemden biri kullanılır. 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öntemPython kullanımıYaygın kullanım
SSL/TLS ile doğrudan bağlantısmtplib.SMTP_SSLSunucu bağlantıyı baştan şifreli açıyorsa
STARTTLSSMTP 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 adresi
  • SMTP_PORT: SSL bağlantısı için sunucunuzun istediği bağlantı noktası; örnekte varsayılan değer 465 kullanılır
  • SMTP_USER: SMTP kullanıcı adı
  • SMTP_PASSWORD: parola veya hizmetin istediği uygulama parolası
  • MAIL_TO: alıcının e-posta adresi
Örneğin Linux veya macOS kabuğunda değişkenleri geçici olarak şöyle tanımlayabilirsiniz:

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.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic