Search code examples
pythonpython-2.7tkintersmtplib

Tkinter StringVar Send mail error SMTPlib


I am making an Tkinter app to send a short email.

The code in full:

from Tkinter import *
from smtplib import *
from time import sleep
root=Tk()
root.wm_title("Gmail short message sender")

w = 500 # width for the Tk root
h = 500 # height for the Tk root

# get screen width and height
ws = root.winfo_screenwidth() # width of the screen
hs = root.winfo_screenheight() # height of the screen

# calculate x and y coordinates for the Tk root window
x = (ws/2) - (w/2)
y = (hs/2) - (h/2)

# set the dimensions of the screen
# and where it is placed
root.geometry('%dx%d+%d+%d' % (w, h, x, y))

def send():
    e1_var.get()
    e2_var.get()
    e3_var.get()
    try:
        smtpObj = SMTP('smtp.gmail.com', "587")
        smtpObj.ehlo()
        smtpObj.starttls()
        smtpObj.ehlo()
        smtpObj.login("123@gmail.com", "password")
        smtpObj.sendmail(sender1, receivers1, msg1)
        l1=Label(text="Sent").grid()
        sleep(1)
        l1.destroy()
    except SMTPException:
        l2=Label(text="Error").grid()
        raise



e1_var=StringVar()
e2_var=StringVar()
e3_var=StringVar()

sender = e1_var
receivers = [e2_var]
msg = e3_var
sender1 = '%s' % (sender)
receivers1 = '[%s]'% (receivers)
msg1 = '%s' % (msg)

e1=Entry(root, textvariable=e1_var).grid()
e2=Entry(root, textvariable=e2_var).grid()
e3=Entry(root, textvariable=e3_var).grid()
b1=Button(text="Send", command=send).grid()

root.mainloop()

The Problem:

The problem is with my StringVar instances. First the StringVar instances were drawing this error.

Exception in Tkinter callback
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1536, in __call__
    return self.func(*args)
  File "Desktop/Python Scripts/Email.py", line 32, in send
    smtpObj.sendmail(sender1, receivers1, msg1)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/smtplib.py", line 724, in sendmail
    esmtp_opts.append("size=%d" % len(msg))
AttributeError: StringVar instance has no attribute '__len__'

But I fixed this by adding this section in,

sender1 = sender
receivers1 = receivers
msg1 = msg

And changing smtpObj.sendmail(sender, receivers, msg) to smtpObj.sendmail(sender1, receivers1, msg1). I am now getting this error.

Exception in Tkinter callback
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1536, in __call__
    return self.func(*args)
  File "Desktop/Python Scripts/Email.py", line 32, in send
    smtpObj.sendmail(sender1, receivers1, msg1)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/smtplib.py", line 742, in sendmail
    raise SMTPRecipientsRefused(senderrs)
SMTPRecipientsRefused: {'[[<Tkinter.StringVar instance at 0x103e8be60>]]': (555, '5.5.2 Syntax error. yi8sm12824416pab.22 - gsmtp')}

Is this a syntax error because of the quote marks? If so, how do I fix the first error?


Solution

  • This (and other code like it) is incorrect:

    sender = e1_var
    receivers = [e2_var]
    msg = e3_var
    

    You need to change it to this:

    sender = e1_var.get()
    receivers = [e2_var.get()]
    msg = e3_var.get()
    

    That's not your only problem, though. This code is running before the user has a chance to enter anything, so the results will all be the empty string. You need to wait to call the .get() methods until you're ready to use them (which, curiously, you're already doing inside of send).