AttributeError: 'function' object has no attribute 'encode'
Проблема заключается в том что когда я заполняю все формы выдаёт данную ошибку.
Код :
import os
import smtplib
import tkinter
from tkinter import *
from tkinter.filedialog import askopenfilename
from tkinter import filedialog
from tkinter import messagebox
# Добавляем необходимые подклассы - MIME-типы
from email.mime.multipart import MIMEMultipart # Многокомпонентный объект
from email.mime.base import MIMEBase
from email.mime.text import MIMEText # Текст/HTML
from email.mime.image import MIMEImage # Изображения
from email import encoders
windows = tkinter.Tk()
windows.title("Automatic Send E-mail with pdf file") # program title
windows.geometry('500x400') # size of program
windows.sourceFile = 'D:\\CURRENT_WORK\\BKunde_Reports\\Bkunde 01.06.2021 - 28.06.2021.pdf'
lbl_useremail = Label(windows, text="Enter Your E-Mail address : ")
lbl_useremail.grid(column=0, row=1)
def enter_login(): # Enter login by mail here
l = password.get() # get login from entry
print(l)
mail_login = StringVar() # Login variable
mailEntry = Entry(windows, textvariable=mail_login)
mailEntry.grid(column=0, row=2)
lbl_userpassword = Label(windows, text="Enter Your password : ")
lbl_userpassword.grid(column=0, row=3)
def enter_password(): # Enter password by mail here
p = password.get() # get password from entry
print(p)
mail_password = StringVar() # Password variable
passEntry = Entry(windows, textvariable=mail_password, show='*')
passEntry.grid(column=0, row=4)
lbl_recmail = Label(windows, text="Enter Recipient E-Mail : ")
lbl_recmail.grid(column=0, row=7)
def enter_recipient_login(): # Enter login by mail here
r_l = password.get() # get login from entry
print(r_l)
recipient_login = StringVar() # Login variable
recEntry = Entry(windows, textvariable=recipient_login)
recEntry.grid(column=0, row=8)
lbl_subject = Label(windows, text="Subject : ")
lbl_subject.grid(column=0, row=9)
def enter_subject(): # Enter Subject of mail
subject = password.get() # get subject from entry
print(subject)
subject_theme = StringVar() # Body of mail
subjectEntry = Entry(windows, textvariable=subject_theme)
subjectEntry.grid(column=0, row=10)
lbl_bodyofmail = Label(windows, text="Body of mail : ")
lbl_bodyofmail.grid(column=0, row=11)
def enter_body(): # Enter Subject of mail
body = password.get() # get subject from entry
print(body)
body_text = StringVar() # Login variable
bodyEntry = Entry(windows, textvariable=body_text)
bodyEntry.grid(column=0, row=12)
def chooseFile():
windows.sourceFile = filedialog.askopenfilename(parent=windows, initialdir="/", title='Please select a file')
b_chooseFile = tkinter.Button(windows, text="Choose File", width=20, height=3, command=chooseFile)
b_chooseFile.place(x=80, y=120)
# b_chooseFile.grid(padx=170, pady=170)
b_chooseFile.grid(column=0, row=15)
msg = MIMEMultipart()
#Error
# address_info = lbl_recmail.get()
# email_body_info = lbl_bodyofmail.get()
# sender_email = lbl_useremail
# sender_password = lbl_userpassword
# mail_send = smtplib.SMTP_SSL('smtp.yandex.ru', 465)
# Error
def send_attachment():
filename = "Bkunde 01.06.2021 - 28.06.2021.pdf"
attachment = open("D:\\CURRENT_WORK\\BKunde_Reports\\Bkunde 01.06.2021 - 28.06.2021.pdf", "rb")
p = MIMEBase('application', 'octet-stream')
p.set_payload((attachment).read())
encoders.encode_base64(p)
p.add_header('Content-Disposition', "attachment; filename= %s" % filename)
msg.attach(p)
msg['From'] = lbl_useremail # Адресат
msg['To'] = addr_to # Получатель
msg['Subject'] = lbl_subject # Тема сообщения
body = enter_body # Добавляем в сообщение текст
msg.attach(MIMEText(body, 'plain'))
html = """\
<html lang="en">
<tbody>
<td colspan="2">
<table border="0" cellpadding="0" cellspacing="0" style="background-color:transparent;background-image:none;background-repeat:repeat;background-size:auto;border:0px rgb( 0 , 0 , 0 );color:rgb( 0 , 0 , 0 );font:400 16px 'times new roman';margin:0px;padding:0px;text-align:left;text-decoration:none;text-transform:none;white-space:normal;word-spacing:0px"><tbody><tr><td><div><img data-cke-saved-src="https://avatars.mds.yandex.net/get-mail-signature/474754/2679e3a0bde47475e48c450b3c6c51c5/orig" src="https://avatars.mds.yandex.net/get-mail-signature/474754/2679e3a0bde47475e48c450b3c6c51c5/orig" style="height:211px;width:195px"></div></td><td><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td colspan="2"><table border="0" cellpadding="0" cellspacing="0" style="font-family:'calibri' , sans-serif;font-size:11pt;line-height:15.6933px"><tbody><tr><td style="padding:0cm"><div style="font-family:'calibri' , sans-serif;font-size:11pt;line-height:normal;margin:0cm"><strong><span style="font-family:'arial' , sans-serif;font-size:18pt">Rahman Samedzade</span></strong></div></td></tr><tr><td style="padding:0cm"><div style="line-height:15.5467px;margin:0cm"><font color="#7f7f7f" face="arial, sans-serif"><span style="font-size:12px">IT Specialist</span></font></div><div style="font-family:'calibri' , sans-serif;font-size:11pt;line-height:15.5467px;margin:0cm"><br></div></td></tr><tr><td style="padding:0cm"><br></td></tr><tr><td style="padding:0cm"><div style="font-family:'calibri' , sans-serif;font-size:11pt;line-height:22px;margin:0cm"><strong><span style="color:rgb( 13 , 13 , 13 );font-family:'arial' , sans-serif;font-size:9pt">ADDRESS: 55 Zarifa Aliyeva str., Yeni Hayat Plaza, 7th floor, Baku, Azerbaijan</span></strong></div><div style="font-family:'calibri' , sans-serif;font-size:11pt;line-height:22px;margin:0cm"><span style="color:rgb( 127 , 127 , 127 );font-family:'arial' , sans-serif;font-size:9pt">MOBILE: +994 50 285 44 06</span></div><div style="font-family:'calibri' , sans-serif;font-size:11pt;line-height:22px;margin:0cm"><span style="color:rgb( 127 , 127 , 127 );font-family:'arial' , sans-serif;font-size:9pt">WEB: <span style="text-decoration:none"><span style="color:rgb( 127 , 127 , 127 )"><a data-cke-saved-href="https://www.166.az/" href="https://www.166.az/" target="_blank" style="color:rgb( 153 , 0 , 153 )" rel="noopener noreferrer">www.166.az</a></span></span> / <span style="text-decoration:none"><span style="color:rgb( 127 , 127 , 127 )"><a data-cke-saved-href="https://www.evakuasiya.az/" href="https://www.evakuasiya.az/" target="_blank" style="color:rgb( 153 , 0 , 153 )" rel="noopener noreferrer">www.evakuasiya.az</a></span></span></span></div><div style="font-family:'calibri' , sans-serif;font-size:11pt;line-height:22px;margin:0cm"><span style="color:rgb( 127 , 127 , 127 );font-family:'arial' , sans-serif;font-size:9pt">EMAIL: <a data-cke-saved-href="mailto:[email protected]" href="mailto:[email protected]" rel="noopener noreferrer">[email protected]</a></span></div><div style="font-family:'calibri' , sans-serif;font-size:11pt;line-height:22px;margin:0cm"><br></div></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table>
<tbody>
<tr>
</html>
"""
msg.attach(MIMEText(html, 'html', 'utf-8')) # Добавляем в сообщение HTML-фрагмент
server = smtplib.SMTP_SSL('smtp.yandex.ru', 465) # Создаем объект SMTP
# server.starttls() # Начинаем шифрованный обмен по TLS
server.login(str(mail_login, mail_password),) # Получаем доступ
server.send_message(msg) # Отправляем сообщение
server.quit()
# # b_sendattachment = Button(windows, text="Send attachment", width=20, height=3, command=send_attachment(pathfile))
# b_sendattachment.place(x=100, y=115)
# # b_sendattachement.grid(padx=100, pady=100)
# b_sendattachment.grid(column=0, row=18)
##
pathfile = None
def chooseFile():
global pathfile
pathfile = filedialog.askopenfilename(parent=windows, initialdir="/", title='Please select a file')
def sendFile():
if not pathfile:
messagebox.showerror("Ошибка", "Сначала выберите файл")
else:
send_attachment(pathfile)
chfile = tkinter.Button(windows, text="Choose File", width=10, height=4, command=chooseFile)
sendfile = tkinter.Button(windows, text="Send File", command=send_attachment)
sendfile.grid(column=0, row=16)
##
# windows.columnconfigure(0, weight=1) # Центрирует поля ввода
# windows.rowconfigure(0, weight=1) # Центрирует поля ввода
addr_from = mail_login # Destination
addr_to = recipient_login # Recipient
password = mail_password # Password
# ~
windows.mainloop()
Полный вид ошибки :
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\rsamadzade\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1884, in __call__
return self.func(*args)
File "D:\My_Files\Testing_Python\autosend_mail\ver2send.py", line 130, in send_attachment
msg.attach(MIMEText(body, 'plain'))
File "C:\Users\rsamadzade\AppData\Local\Programs\Python\Python39\lib\email\mime\text.py", line 34, in __init__
_text.encode('us-ascii')
AttributeError: 'function' object has no attribute 'encode'
Ответы (1 шт):
Вот проблемный кусок кода:
def enter_body(): # Enter Subject of mail
body = password.get() # get subject from entry
print(body)
...
body = enter_body
msg.attach(MIMEText(body, 'plain'))
Вы пытаетесь функцию добавить во вложение (не результат ее выполнения).
Если вы хотите внутри функции получить текст из текстового поля, потом добавить его во вложение, то:
- Функция должна возвращать этот текст через
return - Саму функцию нужно вызвать, чтобы она отработала и вернула результат
Исправление:
def enter_body(): # Enter Subject of mail
body = password.get() # get subject from entry
print(body)
return body # <-- возврат результата из функции
...
body = enter_body() # <-- вызов функции с записью результата в переменную
msg.attach(MIMEText(body, 'plain'))
Обратите внимание еще, что у вас в пяти (!) разных функциях (для логина, пароля, текста сообщения и т.д.) идет получение текста из поля password.
Вообще, конструкция вида имя_1 = имя_2, которая у вас постоянно повторяется, довольно бессмысленна. Так вы просто привязываете к объекту, который "лежит" в переменной имя_2 новое имя переменной - получается, что к одному объекту будут привязаны две переменные. Только это, и ничего больше, никаких дополнительных действий - объект из второй переменной не копируется, функция не вызывается, кнопка не нажимается, просто добавляется новое имя.