- implements(imap4.IMailboxListener)
-
- skin = """
- <screen position="110,83" size="530,430" title="Email" >
- <widget name="boxlist" position="0,0" size="150,400" scrollbarMode="showOnDemand" />
- <widget name="messagelist" position="150,0" size="380,400" scrollbarMode="showOnDemand" />
- <widget name="infolabel" position="0,400" size="530,30" foregroundColor=\"white\" font=\"Regular;18\" />
- </screen>"""
-
- currentmailbox = None
- proto = None
-
- def __init__(self, session, args = 0):
- EmailHandler.__init__(self)
- self.session = session
-
- self.skin = EmailScreen.skin
- Screen.__init__(self, session)
- createFactory(self, config.plugins.emailimap.username.value, config.plugins.emailimap.server.value, config.plugins.emailimap.port.value)
-
- self["actions"] = ActionMap(["InfobarChannelSelection", "WizardActions", "DirectionActions", "MenuActions", "ShortcutActions", "GlobalActions", "HelpActions", "NumberActions"],
- {
- "ok": self.action_ok,
- "back": self.action_exit,
- "historyNext": self.selectMessagelist,
- "historyBack": self.selectBoxlist,
- "down": self.down,
- "up": self.up,
- "left": self.left,
- "right": self.right,
- "menu": self.action_menu,
- }, -1)
- self["boxlist"] = MenuList([])
- self["messagelist"] = MailList([])
- self["infolabel"] = Label("")
- self.onLayoutFinish.append(self.selectBoxlist)
-
- def action_menu(self):
- self.session.open(EmailConfigScreen)
-
- def selectBoxlist(self):
- self.currList = "boxlist"
- self["boxlist"].selectionEnabled(1)
- self["messagelist"].selectionEnabled(0)
-
- def selectMessagelist(self):
- self.currList = "messagelist"
- self["boxlist"].selectionEnabled(0)
- self["messagelist"].selectionEnabled(1)
-
- def up(self):
- self[self.currList].up()
-
- def down(self):
- self[self.currList].down()
-
- def left(self):
- self[self.currList].pageUp()
-
- def right(self):
- self[self.currList].pageDown()
-
- def action_ok(self):
- if self.currList == "boxlist":
- self.onBoxSelected()
- else:
- self.onMessageSelected()
-
- def onBoxSelected(self):
- c = self["boxlist"].getCurrent()
- if c is not None:
- self.proto.examine(UTF7toUTF8(c[1][2])
- ).addCallback(self.onExamine, c[0] , self.proto
- ).addErrback(self.onExamineFailed, self.proto
- )
-
- def onMessageSelected(self):
- c = self["messagelist"].getCurrent()
- if c is not None:
- self.fetchMessageSize(c[0])
-
- def fetchMessageSize(self, message):
- print "fetchMessageSize",message
- self.proto.fetchSize(message.uid
- ).addCallback(self.onMessageSizeLoaded, message, self.proto
- ).addErrback(self.onMessageLoadFailed, message, self.proto
- )
-
- def onMessageSizeLoaded(self, result, message, proto):
- print "onMessageSizeLoaded", result, message
- size = int(result[message.uid]['RFC822.SIZE'])
- self.MAX_MESSAGE_SIZE_TO_OPEN = 4000000
- if size >= self.MAX_MESSAGE_SIZE_TO_OPEN:
- #ask here to open message
- print "message to large to open (size=", size, ")"
- else:
- self.loadMessage(message)
-
-# def fetchBodyStructure(self, message):
-# print "fetchBodyStructure",message
-# self.proto.fetchBodyStructure(message.uid
-# ).addCallback(self.onBodystructureLoaded, message, self.proto
-# ).addErrback(self.onMessageLoadFailed, message, self.proto
-# )
-
- def loadMessage(self, message):
- print "loadMessage",message
- self["infolabel"].setText("loading message")
-
- self.proto.fetchMessage(message.uid
- ).addCallback(self.onMessageLoaded, message, self.proto
- ).addErrback(self.onMessageLoadFailed, message, self.proto
- )
-
- def onMessageLoaded(self, result, message, proto):
- self["infolabel"].setText("parsing message")
- print "onMessageLoaded"#,result,message
- msgstr = result[message.uid]['RFC822']
- msg = email.Parser.Parser().parsestr(msgstr)
- msg.messagebodys = []
- msg.attachments = []
-
- if msg.is_multipart():
- for part in msg.walk():
- if part.get_content_maintype()=="multipart":
- continue
- if part.get_content_maintype() == 'text' and part.get_filename() is None:
- if part.get_content_subtype() == "html":
- msg.messagebodys.append(EmailBody(part))
- elif part.get_content_subtype() == "plain":
- msg.messagebodys.append(EmailBody(part))
- else:
- print "unkown content type= ", part.get_content_maintype(), "/", part.get_content_subtype()
- else:
- print "found Attachment with ", part.get_content_type(), "and name", part.get_filename()
- msg.attachments.append(EmailAttachment(part.get_filename(), part.get_content_type(), part.get_payload()))
- else:
- msg.messagebodys.append(EmailBody(msg))
- self.session.open(ScreenMailView, msg)
-
- def onMessageLoadFailed(self, failure, message, proto):
- print "onMessageLoadFailed", failure, message
- self["infolabel"].setText(failure.getErrorMessage())
-
- def action_exit(self):
- if self.proto is not None:
- self.proto.logout(
- ).addCallback(self.onLogedOut, self.proto
- ).addErrback(self.onLogedOut, self.proto
- )
- else:
- self.close()
-
- def onLogedOut(self, result, proto):
- print "onLogedOut", result
- self.close()
-
- def onConnect(self, proto):
- self["infolabel"].setText("connected")
- proto.getCapabilities(
- ).addCallback(self.cbCapabilities, proto
- ).addErrback(self.ebCapabilities, proto
- )
-
- def cbCapabilities(self,reason,proto):
- print "#"*30
- print "# If you have problems to log into your imap-server, please send me the output of the following line"
- print "# cbCapabilities",reason
- print "#"*30
- self.doLogin(proto)
-
- def ebCapabilities(reason,proto):
- print "ebCapabilities",reason
-
- def onConnectFailed(self, reason):
- self["infolabel"].setText(reason.getErrorMessage())
-
- def onAuthentication(self, result, proto):
- self.proto = proto
- self["infolabel"].setText("logged in")
- proto.list("", "*"
- ).addCallback(self.onMailboxList, proto
- )
-
- def doLogin(self, proto):
- print "login secure"
- useTLS = False #True
- if useTLS:
- context = proto.context.getContext()
- d = proto.startTLS(context)
- d = d.addCallback(proto.authenticate, config.plugins.emailimap.password.value)
- else:
- d = proto.authenticate(config.plugins.emailimap.password.value)
- d.addCallback(self.onAuthentication, proto)
- d.addErrback(self.onAuthenticationFailed, proto)
- return d
-
- def onAuthenticationFailed(self, failure, proto):
- # If it failed because no SASL mechanisms match
- print "onAuthenticationFailed", failure, proto
- self["infolabel"].setText(failure.getErrorMessage())
- try:
- failure.trap(imap4.NoSupportedAuthentication)
- self.doLoginInsecure(proto)
- except Exception,e:
- print e,e.message
-
- def doLoginInsecure(self, proto):
- print "login INSECURE"
- proto.login(config.plugins.emailimap.username.value, config.plugins.emailimap.password.value
- ).addCallback(self.onAuthentication, proto
- ).addErrback(self.onInsecureAuthenticationFailed, proto
- )
-
- def onInsecureAuthenticationFailed(self, failure, proto):
- print "onInsecureAuthenticationFailed", failure, proto
- self["infolabel"].setText(failure.getErrorMessage())
-
- def onMailboxList(self, result, proto):
- print "onMailboxList", result, proto
- list = []
- for i in result:
- flags, hierarchy_delimiter, name = i
- list.append((UTF7toUTF8(name).encode('utf-8'), i))
- self["boxlist"].l.setList(list)
-
- def onExamine(self, result, mboxname, proto):
- print "onExamine", result, mboxname
- self.setTitle("Mailbox: "+mboxname)
- self.currentmailbox = mboxname
- numMessagesinFolder = int(result['EXISTS'])
- if numMessagesinFolder <= 0:
- self["infolabel"].setText("Box '"+mboxname+"' is empty")
- self["messagelist"].l.setList([])
-
- else:
- if config.plugins.emailimap.maxheadertoload.value > 0:
- maxMessagesToFetch = config.plugins.emailimap.maxheadertoload.value
- startmsg = numMessagesinFolder-maxMessagesToFetch+1
- if startmsg <= 0:
- startmsg = 1
- rangeToFetch = [startmsg, numMessagesinFolder]
- else:
- rangeToFetch = [1, numMessagesinFolder]
- self["infolabel"].setText("loading headers "+str(rangeToFetch[0])+"-"+str(rangeToFetch[1])+" of Box '"+mboxname+"'")
-
- try:
-# proto.fetchEnvelope('%i:%i'%(rangeToFetch[0], rangeToFetch[1]) #'1:*'
-# ).addCallback(self.onEnvelopeList, proto
-# )
- proto.fetchHeaders('%i:%i'%(rangeToFetch[0], rangeToFetch[1]) #'1:*'
- ).addCallback(self.onHeaderList, proto
- )
-
- except imap4.IllegalServerResponse, e:
- print e
-
- def onExamineFailed(self, failure, proto):
- print "onExamineFailed", failure, proto
- self["infolabel"].setText(failure.getErrorMessage())
-
- def onHeaderList(self, result, proto):
- print "onHeaderList"#,result,proto
- self["infolabel"].setText("headers loaded, now parsing ...")
- list = []
- for m in result:
- try:
- list.append(self.buildMessageListItem(MessageHeader(m, result[m]['RFC822.HEADER'])))
- except Exception,e:
- print e
- list.reverse()
- self["messagelist"].l.setList(list)
- self["infolabel"].setText("have "+str(len(result))+" messages ")
-
- def buildMessageListItem(self, message):
- return [
- message,
- MultiContentEntryText(pos=(5, 0), size=(380, 19), font=0, text=message.getSenderString()),
- MultiContentEntryText(pos=(5, 19), size=(380, 19), font=0, text=message.get('date', default='kein Datum')),
- MultiContentEntryText(pos=(5, 38), size=(380, 19), font=0, text=message.getSubject())
- ]
- #
- # IMailboxListener methods
- #
- def modeChanged(self, writeable):
- print "modeChanged", writeable
-
- def flagsChanged(self, newFlags):
- print "flagsChanged", newFlags
-
- def newMessages(self, exists, recent):
- print "newMessages", exists, recent
+ implements(imap4.IMailboxListener)
+
+ width = scaleH(-1,530)
+ height = scaleV(-1,430)
+ boxlistWidth = scaleH(-1,150)
+ messagelistWidth = width-boxlistWidth
+ infolabelHeight = scaleV(-1,30)
+ skin = """
+ <screen position="%d,%d" size="%d,%d" title="Email" >
+ <widget name="boxlist" position="0,0" size="%d,%d" scrollbarMode="showOnDemand" />
+ <widget name="messagelist" position="%d,%d" size="%d,%d" scrollbarMode="showOnDemand" />
+ <widget name="infolabel" position="%d,%d" size="%d,%d" foregroundColor=\"white\" font=\"Regular;%d\" />
+ </screen>""" %(
+ (DESKTOP_WIDTH-width)/2, (DESKTOP_HEIGHT-height)/2, width, height,
+ boxlistWidth, height-infolabelHeight,
+ boxlistWidth, 0, messagelistWidth, height-infolabelHeight,
+ 0, height-infolabelHeight, width, infolabelHeight, scaleV(20,18)
+ )
+
+ currentmailbox = None
+ proto = None
+
+ def __init__(self, session, args = 0):
+ EmailHandler.__init__(self)
+ self.session = session
+
+ self.skin = EmailScreen.skin
+ Screen.__init__(self, session)
+ createFactory(self, config.plugins.emailimap.username.value, config.plugins.emailimap.server.value, config.plugins.emailimap.port.value)
+
+ self["actions"] = ActionMap(["InfobarChannelSelection", "WizardActions", "DirectionActions", "MenuActions", "ShortcutActions", "GlobalActions", "HelpActions", "NumberActions", "ChannelSelectBaseActions"],
+ {
+ "ok": self.action_ok,
+ "back": self.action_exit,
+ "historyNext": self.selectMessagelist,
+ "historyBack": self.selectBoxlist,
+ "prevBouquet": self.selectMessagelist,
+ "nextBouquet": self.selectBoxlist,
+ "down": self.down,
+ "up": self.up,
+ "left": self.left,
+ "right": self.right,
+ "menu": self.action_menu,
+ }, -1)
+ self["boxlist"] = MenuList([])
+ self["messagelist"] = MailList([])
+ self["infolabel"] = Label("")
+ self.onLayoutFinish.append(self.selectBoxlist)
+
+ def action_menu(self):
+ self.session.open(EmailConfigScreen)
+
+ def selectBoxlist(self):
+ self.currList = "boxlist"
+ self["boxlist"].selectionEnabled(1)
+ self["messagelist"].selectionEnabled(0)
+
+ def selectMessagelist(self):
+ self.currList = "messagelist"
+ self["boxlist"].selectionEnabled(0)
+ self["messagelist"].selectionEnabled(1)
+
+ def up(self):
+ self[self.currList].up()
+
+ def down(self):
+ self[self.currList].down()
+
+ def left(self):
+ self[self.currList].pageUp()
+
+ def right(self):
+ self[self.currList].pageDown()
+
+ def action_ok(self):
+ if self.currList == "boxlist":
+ self.onBoxSelected()
+ else:
+ self.onMessageSelected()
+
+ def onBoxSelected(self):
+ c = self["boxlist"].getCurrent()
+ if c is not None:
+ self.proto.examine(UTF7toUTF8(c[1][2])
+ ).addCallback(self.onExamine, c[0] , self.proto
+ ).addErrback(self.onExamineFailed, self.proto
+ )
+
+ def onMessageSelected(self):
+ c = self["messagelist"].getCurrent()
+ if c is not None:
+ self.fetchMessageSize(c[0])
+
+ def fetchMessageSize(self, message):
+ print "fetchMessageSize",message
+ self.proto.fetchSize(message.uid
+ ).addCallback(self.onMessageSizeLoaded, message, self.proto
+ ).addErrback(self.onMessageLoadFailed, message, self.proto
+ )
+
+ def onMessageSizeLoaded(self, result, message, proto):
+ print "onMessageSizeLoaded", result, message
+ size = int(result[message.uid]['RFC822.SIZE'])
+ self.MAX_MESSAGE_SIZE_TO_OPEN = 4000000
+ if size >= self.MAX_MESSAGE_SIZE_TO_OPEN:
+ #ask here to open message
+ print "message to large to open (size=", size, ")"
+ else:
+ self.loadMessage(message)
+
+# def fetchBodyStructure(self, message):
+# print "fetchBodyStructure",message
+# self.proto.fetchBodyStructure(message.uid
+# ).addCallback(self.onBodystructureLoaded, message, self.proto
+# ).addErrback(self.onMessageLoadFailed, message, self.proto
+# )
+
+ def loadMessage(self, message):
+ print "loadMessage",message
+ self["infolabel"].setText("loading message")
+
+ self.proto.fetchMessage(message.uid
+ ).addCallback(self.onMessageLoaded, message, self.proto
+ ).addErrback(self.onMessageLoadFailed, message, self.proto
+ )
+
+ def onMessageLoaded(self, result, message, proto):
+ self["infolabel"].setText("parsing message")
+ print "onMessageLoaded"#,result,message
+ msgstr = result[message.uid]['RFC822']
+ msg = email.Parser.Parser().parsestr(msgstr)
+ msg.messagebodys = []
+ msg.attachments = []
+
+ if msg.is_multipart():
+ for part in msg.walk():
+ if part.get_content_maintype()=="multipart":
+ continue
+ if part.get_content_maintype() == 'text' and part.get_filename() is None:
+ if part.get_content_subtype() == "html":
+ msg.messagebodys.append(EmailBody(part))
+ elif part.get_content_subtype() == "plain":
+ msg.messagebodys.append(EmailBody(part))
+ else:
+ print "unkown content type= ", part.get_content_maintype(), "/", part.get_content_subtype()
+ else:
+ print "found Attachment with ", part.get_content_type(), "and name", part.get_filename()
+ msg.attachments.append(EmailAttachment(part.get_filename(), part.get_content_type(), part.get_payload()))
+ else:
+ msg.messagebodys.append(EmailBody(msg))
+ self.session.open(ScreenMailView, msg)
+
+ def onMessageLoadFailed(self, failure, message, proto):
+ print "onMessageLoadFailed", failure, message
+ self["infolabel"].setText(failure.getErrorMessage())
+
+ def action_exit(self):
+ if self.proto is not None:
+ self.proto.logout(
+ ).addCallback(self.onLogedOut, self.proto
+ ).addErrback(self.onLogedOut, self.proto
+ )
+ else:
+ self.close()
+
+ def onLogedOut(self, result, proto):
+ print "onLogedOut", result
+ self.close()
+
+ def onConnect(self, proto):
+ self["infolabel"].setText("connected")
+ proto.getCapabilities(
+ ).addCallback(self.cbCapabilities, proto
+ ).addErrback(self.ebCapabilities, proto
+ )
+
+ def cbCapabilities(self,reason,proto):
+ print "#"*30
+ print "# If you have problems to log into your imap-server, please send me the output of the following line"
+ print "# cbCapabilities",reason
+ print "#"*30
+ self.doLogin(proto)
+
+ def ebCapabilities(self,reason,proto):
+ print "ebCapabilities",reason
+
+ def onConnectFailed(self, reason):
+ self["infolabel"].setText(reason.getErrorMessage())
+
+ def onAuthentication(self, result, proto):
+ self.proto = proto
+ self["infolabel"].setText("logged in")
+ proto.list("", "*"
+ ).addCallback(self.onMailboxList, proto
+ )
+
+ def doLogin(self, proto):
+ print "login secure"
+ useTLS = False #True
+ if useTLS:
+ context = proto.context.getContext()
+ d = proto.startTLS(context)
+ d = d.addCallback(proto.authenticate, config.plugins.emailimap.password.value)
+ else:
+ d = proto.authenticate(config.plugins.emailimap.password.value)
+ d.addCallback(self.onAuthentication, proto)
+ d.addErrback(self.onAuthenticationFailed, proto)
+ return d
+
+ def onAuthenticationFailed(self, failure, proto):
+ # If it failed because no SASL mechanisms match
+ print "onAuthenticationFailed", failure, proto
+ self["infolabel"].setText(failure.getErrorMessage())
+ try:
+ failure.trap(imap4.NoSupportedAuthentication)
+ self.doLoginInsecure(proto)
+ except Exception,e:
+ print e,e.message
+
+ def doLoginInsecure(self, proto):
+ print "login INSECURE"
+ proto.login(config.plugins.emailimap.username.value, config.plugins.emailimap.password.value
+ ).addCallback(self.onAuthentication, proto
+ ).addErrback(self.onInsecureAuthenticationFailed, proto
+ )
+
+ def onInsecureAuthenticationFailed(self, failure, proto):
+ print "onInsecureAuthenticationFailed", failure, proto
+ self["infolabel"].setText(failure.getErrorMessage())
+
+ def onMailboxList(self, result, proto):
+ print "onMailboxList", result, proto
+ list = []
+ for i in result:
+ flags, hierarchy_delimiter, name = i #@UnusedVariable
+ list.append((UTF7toUTF8(name).encode('utf-8'), i))
+ self["boxlist"].l.setList(list)
+ # TODO: set current on INBOX? Or last mailbox (through config... item?
+
+ def onExamine(self, result, mboxname, proto):
+ print "onExamine", result, mboxname
+ self.setTitle("Mailbox: "+mboxname)
+ self.currentmailbox = mboxname
+ numMessagesinFolder = int(result['EXISTS'])
+ if numMessagesinFolder <= 0:
+ self["infolabel"].setText("Box '"+mboxname+"' is empty")
+ self["messagelist"].l.setList([])
+
+ else:
+ if config.plugins.emailimap.maxheadertoload.value > 0:
+ maxMessagesToFetch = config.plugins.emailimap.maxheadertoload.value
+ startmsg = numMessagesinFolder-maxMessagesToFetch+1
+ if startmsg <= 0:
+ startmsg = 1
+ rangeToFetch = [startmsg, numMessagesinFolder]
+ else:
+ rangeToFetch = [1, numMessagesinFolder]
+ self["infolabel"].setText("loading headers "+str(rangeToFetch[0])+"-"+str(rangeToFetch[1])+" of Box '"+mboxname+"'")
+
+ try:
+# proto.fetchEnvelope('%i:%i'%(rangeToFetch[0], rangeToFetch[1]) #'1:*'
+# ).addCallback(self.onEnvelopeList, proto
+# )
+ proto.fetchHeaders('%i:%i'%(rangeToFetch[0], rangeToFetch[1]) #'1:*'
+ ).addCallback(self.onHeaderList, proto
+ )
+
+ except imap4.IllegalServerResponse, e:
+ print e
+
+ def onExamineFailed(self, failure, proto):
+ print "onExamineFailed", failure, proto
+ self["infolabel"].setText(failure.getErrorMessage())
+
+ def onHeaderList(self, result, proto):
+ print "onHeaderList"#,result,proto
+ self["infolabel"].setText("headers loaded, now parsing ...")
+ list = []
+ for m in result:
+ try:
+ list.append(self.buildMessageListItem(MessageHeader(m, result[m]['RFC822.HEADER'])))
+ except Exception,e:
+ print e
+ list.reverse()
+ self["messagelist"].l.setList(list)
+ self["infolabel"].setText("have "+str(len(result))+" messages ")
+
+ def buildMessageListItem(self, message):
+ return [
+ message,
+ MultiContentEntryText(pos=(5, 0), size=(self.messagelistWidth, scaleV(20,18)+5), font=0, text=message.getSenderString()),
+ MultiContentEntryText(pos=(5, scaleV(20,18)+1), size=(self.messagelistWidth, scaleV(20,18)+5), font=0, text=message.get('date', default='kein Datum')),
+ MultiContentEntryText(pos=(5, 2*(scaleV(20,18)+1)), size=(self.messagelistWidth, scaleV(20,18)+5), font=0, text=message.getSubject())
+ ]
+ #
+ # IMailboxListener methods
+ #
+ def modeChanged(self, writeable):
+ print "modeChanged", writeable
+
+ def flagsChanged(self, newFlags):
+ print "flagsChanged", newFlags
+
+ def newMessages(self, exists, recent):
+ print "newMessages", exists, recent