Tkinter smpt ile mail göndermede sorun yaşıyorum

import tkinter as tk
import smtplib as sm

def Eposta():
    aziz["text"]= wormer.get()
    mert["text"]= king.get()
    tuncay["text"]= alpler.get()
    oğuz["text"]= eagle.get()

    if aziz["text"] != "" and mert["text"] != "" and tuncay["text"] != "" and oğuz["text"] != "":
        kullanıcı = aziz["text"]
        şifre = mert["text"]
        hedef = tuncay["text"]
        mesaj = oğuz["text"]

        mail = sm.SMTP("smpt.gmail.com",587)
        mail.ehlo()
        mail.starttls()

        mail.login(aziz["text"],mert["text"])

        mail.sendmail(aziz["text"],tuncay["text"],oğuz["text"])

        mail.quit()




    else:
        press = tk.Label(font="Verdana 14",text="Boş yer kalmayacak",fg="ORANGE")
        press.place(x=20,y=350)


pencere = tk.Tk()
pencere.title("E-posta Gönder")
pencere.geometry("400x400")

wormer = tk.Entry(font="Verdana 14",fg="RED")
wormer.place(x=20,y=20)

king = tk.Entry(font="Verdana 14",fg="GREEN")
king.place(x=20,y=60)

alpler = tk.Entry(font="Verdana 14",fg="BLUE")
alpler.place(x=20,y=140)

hamdi = tk.Label(text="#########################",font="Verdana 14 bold",fg="RED")
hamdi.place(x=0,y=100)

eagle = tk.Entry(font="Verdana 14",fg="AQUA")
eagle.place(x=20,y=180)

alev = tk.Label(text="#########################",font="Verdana 14 bold",fg="RED")
alev.place(x=0,y=220)

data = tk.Button(text="GÖNDER",font="Verdana 14",fg="GREEN",command=Eposta)
data.place(x=20,y=260)

content = tk.Button(text="İptal ET ÇIK",font="Verdana 14",fg="RED",command=exit)
content.place(x=20,y=300)

sayı1 = tk.Label(text="Kullanıcı adınız",fg="RED")
sayı1.place(x=280,y=20)

sayı2 = tk.Label(text="Şifreniz",fg="RED")
sayı2.place(x=280,y=60)

sayı3 = tk.Label(text="Adres",fg="RED")
sayı3.place(x=280,y=145)

sayı4 = tk.Label(text="Mesaj",fg="RED")
sayı4.place(x=280,y=185)


#yeni = tk.Checkbutton(text=".gmail")
#yeni.place(x=250,y=250),

#eski = tk.Checkbutton(text=".hotmail")
#eski.place(x=250,y=270)

#saygın = tk.Checkbutton(text=".OutLook")
#saygın.place(x=250,y=290)

aziz = tk.Label(text="a")
mert = tk.Label(text="a")
tuncay = tk.Label(text="a")
oğuz = tk.Label(text="a")

pencere.mainloop()

smpt ve tkinter kütüphanelerini kullanarak program yazmaya çalıştım ve iki sorun ortaya çıktı

  1. portu nasıl değiştiricem
  2. mail gönderilmiyor

Öncelikle gmail’deki 2 adımlı doğrulama ayarını kapatıp, daha az güvenli uygulama erişimi ayarını açmalısınız. Port olarak da 465 numaralı portu SMTP_SSL için kullanabilirsiniz.
Örnek:

from smtplib import SMTP_SSL
from email.message import EmailMessage


def send_email(
        username: str = "", 
        password: str = "",
        subject: str = "", 
        to_addr: str = "",
        content: str = "", 
):
    msg = EmailMessage()
    msg.set_content(content)
    msg["Subject"] = subject
    msg["From"] = username
    msg["To"] = to_addr
    with SMTP_SSL("smtp.gmail.com:465") as smtp:
        smtp.login(username, password)
        smtp.send_message(msg)


send_email(
    username="username@gmail.com",
    password="password",
    subject="Konu başlığı buraya yazılacak.",
    to_addr=["user1@gmail.com", "user2@yahoo.com"],
    content="İçerik buraya yazılacak."
)

1 Beğeni

doğrulama daha az güvenli uygulamalar açık bir deniyim

Mail’e ek eklemek için de şöyle bir yol izleyebilirsiniz.

from smtplib import SMTP_SSL
from mimetypes import guess_type
from email.message import EmailMessage


def attachment(msg: EmailMessage = None, filelist: dict = {}):
    if filelist:
        for i in filelist:
            maintype, subtype = guess_type(i)[0].split("/")
            with open(i, 'rb') as f:
                msg.add_attachment(
                    obj=f.read(),
                    maintype=maintype,
                    subtype=subtype,
                    filename=i
                )


def send_email(
        username: str = "", 
        password: str = "",
        subject: str = "", 
        to_addr: str = "",
        content: str = "", 
        filelist = None
):
    msg = EmailMessage()
    msg.set_content(content)
    msg["Subject"] = subject
    msg["From"] = username
    msg["To"] = to_addr
    attachment(msg, filelist)
    with SMTP_SSL('smtp.gmail.com:465') as smtp:
        smtp.login(username, password)
        smtp.send_message(msg)


send_email(
    username="username@gmail.com",
    password="şifre",
    subject="Konu başlığı buraya yazılacak.",
    to_addr=["user1@gmail.com", "user2@yahoo.com"],
    content="İçerik buraya yazılacak.",
    filelist={
        "0.jpg": "0.jpg hakkında açıklama ekleyebilirsiniz.",
    }
)

Ayrıca mailin içerisin ek olarak değil de, içerik olarak bir resim eklemek isterseniz, başka fonksiyon kullanabilirsiniz. Onu da sizinle paylaşayım.

from smtplib import SMTP_SSL
from email.utils import make_msgid
from mimetypes import guess_type
from email.message import EmailMessage


def alternative(msg: EmailMessage = None, filelist: dict = {}):
    if filelist:
        files, maintypes, subtypes, msgids = [], [], [], []
        for i, j in filelist.items():
            msgid = make_msgid()
            maintype, subtype = guess_type(i)[0].split("/")
            maintypes.append(maintype)
            subtypes.append(subtype)
            msgids.append(msgid)
            files.append(
                f'<p> {j} </p><img src="cid:{msgid[1:-1]}" />'
            )
        html = f'<html><head></head><body>{"".join(files)}</body></html>'
        msg.add_alternative(html, subtype='html')
        for i, j in enumerate(filelist):
            with open(j, 'rb') as img:
                msg.get_payload()[i].add_related(
                    obj=img.read(),
                    maintype=maintypes[i],
                    subtype=subtypes[i],
                    cid=msgids[i],
                    filename=j
                )


def send_email(
        username: str = "", 
        password: str = "",
        subject: str = "", 
        to_addr: str = "",
        content: str = "", 
        filelist = None
):
    msg = EmailMessage()
    msg.set_content(content)
    msg["Subject"] = subject
    msg["From"] = username
    msg["To"] = to_addr
    alternative(msg, filelist)
    with SMTP_SSL('smtp.gmail.com:465') as smtp:
        smtp.login(username, password)
        smtp.send_message(msg)


send_email(
    username="username@gmail.com",
    password="şifre",
    subject="Konu başlığı buraya yazılacak.",
    to_addr=["user1@gmail.com", "user2@yahoo.com"],
    content="İçerik buraya yazılacak.",
    filelist={
        "0.jpg": "0.jpg hakkında açıklama ekleyebilirsiniz.",
    }
)

alternative ve attachment fonksiyonlarını aynı anda kullanabilirsiniz. Ama bunun için önce alternative sonra da attachment fonksiyonunun çağrılması gerekir. Yani şöyle:

def send_email(
        username: str = "", 
        password: str = "",
        subject: str = "", 
        to_addr: str = "",
        content: str = "", 
        filelist = None
):
    msg = EmailMessage()
    msg.set_content(content)
    msg["Subject"] = subject
    msg["From"] = username
    msg["To"] = to_addr
    alternative(msg, filelist)
    attachment(msg, filelist)
    with SMTP_SSL('smtp.gmail.com:465') as smtp:
        smtp.login(username, password)
        smtp.send_message(msg)

alternative fonksiyonundaki html değişkeninin değerini değiştirip, görsel olarak daha güzel mesajlar oluşturabilirsiniz. Karakter dizisinin body etiketinde mesela biraz değişiklik yapabilirsiniz. Ancak karakter dizisinin içindeki {"".join(files)} kısmını bozmayın.

html = f'<html><head></head><body>{"".join(files)}</body></html>'
1 Beğeni