- Konu sahibi
- #1
İ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
Koddan önce e-posta hizmetinizin SMTP ayarlarını öğrenin. Şunlar gerekir:
SMTP hizmetiniz bağlantının başından itibaren SSL/TLS istiyorsa genellikle 465 numaralı port ve
Kodun çalışması için önce
Sunucu
Bazı SMTP hizmetleri bağlantıyı normal SMTP olarak başlatır, ardından
465 ve 587 portlarını rastgele değiştirmeyin.
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.
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.
Düz metin yerine HTML göndermek için aynı
Bu parçayı önceki örnekte
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
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
- SMTP sunucu adı, portu ve bağlantı türünü sağlayıcının güncel ayarlarıyla eşleştirin.
- Kullanıcı adı ile gönderen adresinin sağlayıcının izin verdiği hesapla uyumlu olduğunu kontrol edin.
- Parolayı ortam değişkeninden veya güvenli bir sır saklama yönteminden okuyun.
- Önce kendi kontrol ettiğiniz bir alıcı adresine kısa bir test iletisi gönderin.
- Kod hatasız tamamlandıktan sonra hem gelen kutusunu hem de spam klasörünü kontrol edin.
- İ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.