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:&nbsp;+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:&nbsp;<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>&nbsp;/&nbsp;<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 шт):

Автор решения: insolor

Вот проблемный кусок кода:

def enter_body():  # Enter Subject of mail
    body = password.get()  # get subject from entry
    print(body)

...

body = enter_body

msg.attach(MIMEText(body, 'plain'))

Вы пытаетесь функцию добавить во вложение (не результат ее выполнения).

Если вы хотите внутри функции получить текст из текстового поля, потом добавить его во вложение, то:

  1. Функция должна возвращать этот текст через return
  2. Саму функцию нужно вызвать, чтобы она отработала и вернула результат

Исправление:

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 новое имя переменной - получается, что к одному объекту будут привязаны две переменные. Только это, и ничего больше, никаких дополнительных действий - объект из второй переменной не копируется, функция не вызывается, кнопка не нажимается, просто добавляется новое имя.

→ Ссылка