Buenas noches a todos. He estado practicando un poco con WxPython y smtplib. Estoy trantando de hacer una pequeña aplicación de escritorio para mandar correos electronicos desde cuentas gmail. El problema surge cuando trato de cargar la ventana del mensaje, obtengo el siguiente tracerback:
Código tracerback:
Ver originalTraceback (most recent call last):
File "loginemail.py", line 36, in OnAceptar
vnt=SenderMessage(value, None)
File "/home/victor/concurso/wxtest/sendmessage.py", line 26, in __init__
self.Bind(wx.EVT_BUTTON, self.Salir)
AttributeError: 'SenderMessage' object has no attribute 'Salir'
El detalle(como dijo cantinflas) es que el método Salir se encuentra declarado en esa misma clase como se puede observar a continuación.
Código Python:
Ver original#!/usr/bin/env python
import wx
#from loginemail import CE
class SenderMessage(wx.Frame):
def __init__(self, logon, parent=None):
import pdb; pdb.set_trace()
#pos=(x, y)
if logon==None:
dialog=wx.MessageDialog(self, u'Error Fatal la aplicacion sera cerrada', u'Informacion', wx.OK | wx.ICON_ERROR)
dialog.Destroy()
self.Destroy()
else:
self.emailLogon=logon
wx.Frame.__init__(self, parent, wx.NewId(), title='Send A message', size=(300,300), pos=(250,300))
wx.Panel(self, -1)
lBienvenido = wx.StaticText(self,-1,u'Bienvenido', pos=(90,-1))
lDe=wx.StaticText(self,-1, u'De', pos=(90, 30))
self.De=wx.TextCtrl(self, -1, '', pos = (120 , 30), size = (150,-1))
lPara = wx.StaticText(self,-1, u'Para', pos=(90, 80))
self.Para = wx.TextCtrl(self, -1, '', pos = (120 , 80), size = (150,-1))
lcorreo=wx.StaticText(self,-1, u'Correo', pos=(90, 110))
self.correo=wx.TextCtrl(self, -1, '', pos = (110 ,140), size = (150,130), style=wx.TE_PROCESS_ENTER|wx.TE_PROCESS_TAB|wx.TE_MULTILINE)
boton_enviar= wx.Button(self, -1, u'enviar', pos=(110,100))
boton_salir= wx.Button(self, -1, u'Salir', pos=(130, 100))
#self.Bind(wx.EVT_BUTTON, self.Enviar)
self.Bind(wx.EVT_BUTTON, self.Salir)
self.Layout()
#self.Show()
return None
def Enviar(self, evt):
De=self.De.GetValue()
basicPara=self.Para.GetValue()
Para=basicPara.split()
texto=self.correo.GetValue()
self.emailLogon.SendMail(De, Para, texto)
dialog=wx.MessageDialog(self, u'Su mensaje ha sido enviado', u'Informacion', wx.OK | wx.ICON_INFORMATION)
return True
def Salir(self, evt):
dialog=wx.MessageDialog(self, u'Gracias por usarme', u'Informacion', wx.OK | wx.ICON_INFORMATION)
dialog.ShowModal()
dialog.Destroy()
self.emailLogon.CloseServer()
self.vntReferente.Show()
self.Destroy()
return
if __name__=='__main__':
app=wx.App(0)
ventana=SenderMessage(None, None)
ventana.Show()
app.MainLoop()
Por otro lado, la primera frame para ejecutar el Login en el correo electrónico se puede ver a continuación:
Código Python:
Ver original#!/usr/bin/env python
import wx
from moduleemail import ConnectEmail
from sendmessage import SenderMessage
class Login(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, wx.NewId(),title='Inicio Sesion', size=(300,200), pos=(250,250))
#self.ventana
#import pdb; pdb.set_trace()
#AlmacenCajasTexto=wx.BoxSizer(wx.VERTICAL)
self.lemail=wx.StaticText(self, -1, 'Email', pos=(50,10))
self.contrasena=wx.TextCtrl(self, -1, '', pos = (130 , 50), size = (150,-1),style=wx.TE_PASSWORD)
self.lpass=wx.StaticText(self, -1,'password', pos=(50, 50))
self.email=wx.TextCtrl(self, -1, '', pos = (130 ,00), size = (150,-1))
wx.InitAllImageHandlers()
boton_aceptar= wx.Button(self, -1, u'Aceptar', pos=(50,100))
boton_salir= wx.Button(self, -1, u'Salir', pos=(150, 100))
self.Bind(wx.EVT_BUTTON, self.OnAceptar, boton_aceptar)
self.Bind(wx.EVT_BUTTON, self.OnSalir, boton_salir)
#self.Show()
self.Layout()
return
def OnAceptar(self, evt):
email=self.email.GetValue()
contrasena=self.contrasena.GetValue()
self.CE=ConnectEmail()
MSG=self.CE.SingEmail(email, contrasena)
if MSG=='Sesion Iniciada':
dialog=wx.MessageDialog(self, MSG, u'Informacion', wx.OK | wx.ICON_INFORMATION)
self.Hide()
dialog.ShowModal()
value=self.CE
#import pdb; pdb.set_trace()
vnt=SenderMessage(value, None)
vnt.vntReferente=self
vnt.vntReferente.Hide()
elif MSG=='Error de Conexion: nombre de usuario y password no aceptado':
dialog=wx.MessageDialog(self, MSG, u'Informacion', wx.OK | wx.ICON_ERROR)
dialog.ShowModal()
dialog.Destroy()
self.Close()
contrasena=''
email=''
return
def OnSalir(self, evt):
self.Close()
self.Destroy()
return
#if __name__=='__main__':
app=wx.App(False)
aplicacion=Login(None)
aplicacion.Show()
app.MainLoop()
Este por su parte se vale de otro modulo para manejar smtplib que es el que sigue:
Código Python:
Ver original#!/usr/bin/env python
import smtplib
class ConnectEmail:
def __init__(self):
self.email=''
self.password=''
self.mensaje=''
self.AdressServer='smtp.gmail.com:587'
self.server=''
self.response=''
return
def SingEmail(self, email, password):
self.server=smtplib.SMTP(self.AdressServer)
self.server.starttls()
self.email=email
#import pdb; pdb.set_trace()
try:
self.server.login(email, password)
except smtplib.SMTPAuthenticationError:
print "Error de conexion: nombre de usuario y password no aceptado"
self.CloseServer()
return "Error de Conexion: nombre de usuario y password no aceptado"
return 'Sesion Iniciada'
def SendMail(self, De, Para, Texto):
import pdb;pdb.set_trace()
texto="""
%s""" % Texto
self.server.sendmail(De,Para,texto)
return True
def CloseServer(self):
self.server.quit()
return True
def returnUserEmail(self):
useremail=self.email
return useremail
Bueno, espero que me puedan dar alguna ayuda con este bendito programita y agradezco su ayuda.