Mario

WFN Üye
Konular
581
Mesajlar
581
Çözüm
0
Ticaret Puanı
0
Üyelik
24 Gün
Konum
Zonguldak
Web Sitesi
Var
Alanı
Google Optimiz.
1/1
Konu sahibi
İlk paragrafta ana yanıtı, izlenecek yolu ve ulaşılabilecek sonucu doğrudan ver. SMTP sunucusunun adresi, portu, kullanıcı adı ve kimlik doğrulama bilgileriyle Python’un standart email ve smtplib modüllerini kullanarak e-posta gönderebilirsiniz. Güvenli bağlantı için sunucunun istediği yönteme göre ya SMTP_SSL ya da STARTTLS kullanılır; mesaj başarıyla kabul edilirse alıcı sunucusuna teslim edilmek üzere gönderim kuyruğuna alınır, ancak bu sonuç iletinin alıcının gelen kutusuna kesin ulaştığını tek başına kanıtlamaz. Python belgeleri de mesajı EmailMessage ile oluşturup send_message() ile göndermeyi ve SSL gereken bağlantılarda SMTP_SSL kullanmayı önerir.

Gerekli bilgiler ve güvenli kullanım​


Koddan önce e-posta hizmetinizin SMTP ayarlarını öğrenin. Şunlar gerekir:
  • SMTP sunucusunun alan adı veya adresi
  • SMTP portu; yaygın seçenekler 465 ve 587'dir, ancak doğru değer sağlayıcıya göre değişir
  • Gönderici e-posta adresi
  • SMTP kullanıcı adı; çoğu hizmette bu, e-posta adresinin kendisidir
  • SMTP parolası veya sağlayıcının istediği uygulama parolası
  • Alıcının e-posta adresi
Parolayı doğrudan kaynak koduna yazmayın. Örnekte kolay anlaşılması için değişken kullanılıyor; gerçek uygulamada parola ortam değişkeninden, gizli bilgi yöneticisinden veya güvenli bir yapılandırma mekanizmasından okunmalıdır. SMTP kimlik doğrulama bilgilerini kaynak koduna, Git deposuna ya da hata kayıtlarına koymak hesabın kötüye kullanılmasına yol açabilir.

SSL kullanan SMTP sunucusuna bağlanma​


SMTP hizmetiniz bağlantının başından itibaren SSL/TLS istiyorsa genellikle 465 numaralı port ve SMTP_SSL kullanılır. Aşağıdaki örnekteki sunucu, adres ve parola değerlerini kendi sağlayıcınızın bilgileriyle değiştirin.

Python:
import os
import smtplib
import ssl
from email.message import EmailMessage

smtp_host = "smtp.ornek.com"
smtp_port = 465
username = os.environ["SMTP_USERNAME"]
password = os.environ["SMTP_PASSWORD"]

message = EmailMessage()
message["From"] = username
message["To"] = "[email protected]"
message["Subject"] = "Python ile gönderilen e-posta"
message.set_content("Merhaba, bu ileti Python kullanılarak gönderildi.")

context = ssl.create_default_context()

with smtplib.SMTP_SSL(smtp_host, smtp_port, context=context, timeout=30) as server:
    server.login(username, password)
    server.send_message(message)

print("E-posta SMTP sunucusuna gönderilmek üzere kabul edildi.")

Kodun çalışması için önce SMTP_USERNAME ve SMTP_PASSWORD adlı ortam değişkenlerini ayarlayın, ardından dosyayı Python ile çalıştırın. EmailMessage, gönderici, alıcı, konu ve gövdeyi oluşturur; login() SMTP kimlik doğrulaması yapar; send_message() ise hazırlanmış iletiyi sunucuya gönderir. SMTP_SSL, bağlantıyı baştan itibaren şifreli kurmak için kullanılır.

Sunucu 250 sınıfında başarılı bir SMTP yanıtı verip kod hata almadan tamamlanırsa sunucu iletiyi kabul etmiştir. Bu, SMTP sunucusunun iletiyi işleme aldığını gösterir; alıcının adresinin kesinlikle var olduğunu, iletinin spam klasörüne düşmeyeceğini veya alıcının mesajı okuduğunu göstermez. Teslim edilememe bildirimi, gecikme veya geri dönme daha sonra ayrı bir e-posta olarak gelebilir.

STARTTLS kullanan bağlantı​


Bazı SMTP hizmetleri bağlantıyı normal SMTP olarak başlatır, ardından STARTTLS ile şifreli hâle getirir. Bu durumda SMTP_SSL yerine SMTP kullanılır; starttls() çağrısından sonra yeniden kimlik doğrulaması yapılır. Python belgelerine göre TLS başlatıldıktan sonra EHLO yeniden gönderilmelidir; starttls() bunu uygun biçimde yönetir. Sunucu STARTTLS desteklemiyorsa bağlantı güvenli biçimde kurulamaz ve SMTPNotSupportedError oluşabilir.

Python:
import os
import smtplib
import ssl
from email.message import EmailMessage

smtp_host = "smtp.ornek.com"
smtp_port = 587
username = os.environ["SMTP_USERNAME"]
password = os.environ["SMTP_PASSWORD"]

message = EmailMessage()
message["From"] = username
message["To"] = "[email protected]"
message["Subject"] = "STARTTLS ile gönderilen ileti"
message.set_content("Bu ileti şifreli STARTTLS bağlantısıyla gönderildi.")

context = ssl.create_default_context()

with smtplib.SMTP(smtp_host, smtp_port, timeout=30) as server:
    server.ehlo()
    server.starttls(context=context)
    server.ehlo()
    server.login(username, password)
    server.send_message(message)

print("E-posta SMTP sunucusuna gönderilmek üzere kabul edildi.")

465 ve 587 portlarını rastgele değiştirmeyin. SMTP_SSL ile 587 veya STARTTLS ile 465 kullanmak, sunucunun yapılandırmasına göre bağlantı hatasına neden olabilir. Sağlayıcının verdiği bağlantı türü, port ve kimlik doğrulama yöntemini birlikte uygulayın.

Gönderim hatasını nasıl yorumlamalısınız?​


Kimlik doğrulama hatası alırsanız önce kullanıcı adının, parolanın ve hesabın SMTP erişim izninin doğru olduğunu kontrol edin. İki aşamalı doğrulama kullanan hesaplarda normal hesap parolası yerine uygulama parolası gerekebilir; bu, sağlayıcının güvenlik politikasına bağlıdır.

SMTPNotSupportedError veya TLS ile ilgili bir hata, seçtiğiniz bağlantı türünün sunucuyla uyuşmadığını gösterebilir. Sağlayıcının 465 için SSL mi, 587 için STARTTLS mi istediğini kontrol edip yalnız ilgili bağlantı biçimini kullanın. Sertifika doğrulama hatasında doğrulamayı kapatmak güvenli bir çözüm değildir; sistem saatini, Python/işletim sistemi sertifikalarını ve SMTP sunucusu adının sağlayıcı tarafından verilen adla aynı olup olmadığını kontrol edin.

Bağlantı zaman aşımına uğrarsa sunucu adresi, port, güvenlik duvarı ve barındırma hizmetinin dış SMTP bağlantılarını engelleyip engellemediği incelenmelidir. Kodda parolayı yazdırmayın; hata ayıklama için geçici olarak yalnız hata türünü ve sunucuya bağlanma aşamasını kaydedin, iş bittikten sonra ayrıntılı tanılama kayıtlarını kaldırın.

HTML gövde veya ek dosya ekleme​


Düz metin yerine HTML göndermek için aynı EmailMessage nesnesinde set_content() ile yedek düz metni, add_alternative() ile HTML içeriğini ekleyebilirsiniz. Ek dosya gönderecekseniz dosyanın baytlarını okuyup add_attachment() kullanın. Alıcı HTML'i devre dışı bırakmışsa düz metin bölümü gösterileceği için yalnız HTML gövdesi göndermek yerine metin yedeği bırakmak daha uyumludur.

Python:
from pathlib import Path

message.set_content("Mesajın düz metin sürümü.")
message.add_alternative(
    "<html><body><h1>Merhaba</h1><p>HTML ileti.</p></body></html>",
    subtype="html",
)

file_path = Path("rapor.pdf")
message.add_attachment(
    file_path.read_bytes(),
    maintype="application",
    subtype="pdf",
    filename=file_path.name,
)

Bu parçayı önceki örnekte send_message() çağrısından önce kullanın. Dosya yolu yanlışsa FileNotFoundError, dosya okunamıyorsa işletim sistemi kaynaklı bir hata alırsınız; bu hatalar SMTP bağlantısının başarısız olduğunu değil, ek dosyanın hazırlanamadığını gösterir.

Gönderimden önce son kontrol​

  1. SMTP sunucu adı, portu ve bağlantı türünü sağlayıcının güncel ayarlarıyla eşleştirin.
  2. Kullanıcı adı ile gönderen adresinin sağlayıcının izin verdiği hesapla uyumlu olduğunu kontrol edin.
  3. Parolayı ortam değişkeninden veya güvenli bir sır saklama yönteminden okuyun.
  4. Önce kendi kontrol ettiğiniz bir alıcı adresine kısa bir test iletisi gönderin.
  5. Kod hatasız tamamlandıktan sonra hem gelen kutusunu hem de spam klasörünü kontrol edin.
  6. İleti ulaşmadıysa SMTP sunucusunun döndürdüğü hata metnini, kullanılan portu ve bağlantı türünü birlikte inceleyin; parolayı hata kaydına eklemeyin.
Test iletisinin alıcıya ulaşması, yalnızca bu alıcı ve bu gönderim koşulları için olumlu bir sonuçtur. Toplu gönderim, otomatik bildirim veya üretim ortamında kullanımda alıcı adreslerini doğrulamak, gönderim hızını sınırlamak, geri dönen iletileri izlemek ve sağlayıcının kullanım kurallarına uymak gerekir.
 

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