A94 Ответов: 2

Ошибка отправки электронной почты в python


Я разрабатываю приложение на python, которое отправляет электронную почту. Когда учетные данные для входа передаются в виде переменных, таких как: "server. login(fromadd, password)" Я получаю ошибку, что имя пользователя и пароль не приняты. Я использовал smtp-сервер gmail. Но когда я передаю учетные данные, такие как: "server. login ('xxxx',' xxxx')", где (xxxx=email и пароль) отправляется почта.Я установил debuglevel в true .Ниже приведен код и ошибка.
----------------------------------------------------------------------------
from tkinter import *
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email import encoders
from email.mime.base import MIMEBase
import smtplib
import os
import sqlite3
import MainWindow    

filelist=[]
password=""



def set_credentials(fromadd):
    con=sqlite3.connect("EmailDB.db")
    cursor=con.execute("SELECT PASSWORD FROM REGISTRATION WHERE EMAIL='%s'"%(fromadd))
    for row in cursor:
        password=row[0]
    print(password)
    
        
        
    
def getFile():
    file_path=filedialog.askopenfilename()
    MailWindow.Attch.set(file_path)
    filelist.append(file_path)
    
def getFile():
    file_path=filedialog.askopenfilename()
    Attch.set(file_path)
    filelist.append(file_path)

def mail_log():
    con=sqlite3.connect("EmailDB.db")
    cursor=con.execute("INSERT INTO MAILBOX (TOADD,FROMADD,SUBJECT,BODY)VALUES(?,?,?,?)",(From.get(),To.get(),Subject.get(),txtBody.get("1.0",'end-1c')))
    con.commit()
    
def send():
    
    domain=str(From.get())
    server=smtplib.SMTP('smtp.gmail.com',587)

   
    fromadd=str(From.get())
    toadd=To.get()
    subject=Subject.get()
    set_credentials(fromadd)
    
    msg=MIMEMultipart()
    msg['From']=fromadd
    msg['To']=toadd
    msg['Subject']=subject
    body=txtBody.get("1.0",'end-1c')
    msg.attach(MIMEText(body,'plain'))
  
    if filelist is not None:
        for file in filelist:
            part=MIMEBase('application','octet-stream')
            part.set_payload(open(file,"rb").read())
            encoders.encode_base64(part)
            part.add_header('Content-Disposition',"attachment; filename=%s"%os.path.basename (file))
            msg.attach(part)

# Send Email Code

    try:
        server.starttls()
        server.set_debuglevel(True)
        server.login(fromadd,password)
        text=msg.as_string()
        server.sendmail(fromadd,toadd.split(","),text)
        messagebox.showinfo('Mail Sent')
    except:
        messagebox.showerror('Error','Cannot send mail')
    finally:
        server.quit()
        mail_log()


m=Tk()
m.geometry("800x550+300+100")


To=StringVar()
From=StringVar()
Cc=StringVar()
Subject=StringVar()
Attch=StringVar()

lblFrom=Label(m,text="From:",bg='#FFC9A5').place(x=20,y=60)
txtFrom=Entry(m,width=80,textvariable=From).place(x=90,y=60)


lblTo=Label(m,text="To:",bg='#FFC9A5').place(x=20,y=90)
txtTo=Entry(m,width=80,textvariable=To).place(x=90,y=90)

lblCc=Label(m,text="Cc/Bcc:",bg='#FFC9A5').place(x=20,y=120)
txtCc=Entry(m,width=80,textvariable=Cc).place(x=90,y=120)

lblSubject=Label(m,text="Subject:",bg='#FFC9A5').place(x=20,y=150)
txtSubject=Entry(m,width=80,textvariable=Subject).place(x=90,y=150)

lblAttch=Label(m,text="Attactment:",bg='#FFC9A5').place(x=20,y=180)
txtAttch=Entry(m,width=80,textvariable=Attch).place(x=90,y=180)
btnAttch=Button(m,text="Attach",fg="dark blue",width=10,command=getFile).place(x=580,y=175)

lblBody=Label(m,text="Body:",bg='#FFC9A5').place(x=20,y=210)
txtBody=Text(m,width=60,height=15)
txtBody.place(x=90,y=210)

btnSend=Button(m,text="Send",fg="dark green",width=10,command=send).place(x=90,y=480)
m.configure(background='#FFC9A5')
m.mainloop()

-------------------------------------------------------------------------
Ошибка:
--------------------------------------------------------------------------
send: 'ehlo [192.168.1.15]\r\n'
reply: b'250-smtp.gmail.com at your service, [43.247.161.176]\r\n'
reply: b'250-SIZE 35882577\r\n'
reply: b'250-8BITMIME\r\n'
reply: b'250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH\r\n'
reply: b'250-ENHANCEDSTATUSCODES\r\n'
reply: b'250-PIPELINING\r\n'
reply: b'250-CHUNKING\r\n'
reply: b'250 SMTPUTF8\r\n'
reply: retcode (250); Msg: b'smtp.gmail.com at your service, [43.247.161.176]\nSIZE 35882577\n8BITMIME\nAUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH\nENHANCEDSTATUSCODES\nPIPELINING\nCHUNKING\nSMTPUTF8'
send: 'AUTH PLAIN AGFrYXNocGF0ZWw5MDBAZ21haWwuY29tAA==\r\n'
reply: b'535-5.7.8 Username and Password not accepted. Learn more at\r\n'
reply: b'535 5.7.8  https://support.google.com/mail/answer/14257 ir4sm26338302pbb.93 - gsmtp\r\n'
reply: retcode (535); Msg: b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8  https://support.google.com/mail/answer/14257 ir4sm26338302pbb.93 - gsmtp'
send: 'YWthc2hwYXRlbDkwMEBnbWFpbC5jb20=\r\n'
reply: b'502 5.5.1 Unrecognized command. ir4sm26338302pbb.93 - gsmtp\r\n'
reply: retcode (502); Msg: b'5.5.1 Unrecognized command. ir4sm26338302pbb.93 - gsmtp'
send: 'quit\r\n'
reply: b'221 2.0.0 closing connection ir4sm26338302pbb.93 - gsmtp\r\n'
reply: retcode (221); Msg: b'2.0.0 closing connection ir4sm26338302pbb.93 - gsmtp'

Richard MacCutchan

Вы должны использовать правильные значения, зарегистрированные в gmail.

A94

Я использовал правильные значения, зарегистрированные в gmail

2 Ответов

Рейтинг:
12

Jochen Arndt

Ваш клиент отправляет почтовый адрес и пароль, переданные в кодировке base64.
Расшифровка строки приводит к получению вашего адреса Gmail, но без пароля. Так что, похоже, ваш password переменная пуста при передаче ее в login функция.

Вы можете проверить это в своем коде непосредственно перед входом в систему.

Обратите также внимание, что вы всегда должны быть осторожны при размещении такого контента. Если бы пароль содержался в строке, каждый мог бы получить его,


A94

Но только вложение закодировано в base64. Предположим, если используется несколько учетных записей, таких как yahoo, Hotmail, то как изменить адрес электронной почты и пароль? вот почему я использовал переменную для хранения пароля.

Jochen Arndt

Имя пользователя и пароль отправлены в кодировке base64. Кодирование выполняется функцией PHP login и регистрируется в режиме отладки (строка ' send: AUTH PLAIN ...'). Я передал закодированный параметр декодеру base64, и он показывает мне ваш адрес Gmail, но не пароль.

Ошибка, вероятно, заключается в том, что ваша переменная пароля пуста. В противном случае я бы увидел ваш пароль после расшифровки.

Рейтинг:
0

Member 13021930

"AUTH PLAIN AGFrYXNocGF0ZWw5MDBAZ21haWwuY29taa==\r\n" должно быть два отдельных сообщения-сначала отправить AUTH PLAIN\r\n, получить ответ, а затем отправить имя учетной записи в base64