Skip to content

Commit

Permalink
Better handling of multipart messages
Browse files Browse the repository at this point in the history
  • Loading branch information
FlyingDiver committed May 8, 2017
1 parent ddb5354 commit c66f242
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 18 deletions.
2 changes: 1 addition & 1 deletion BetterEmail.indigoPlugin/Contents/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<plist version="1.0">
<dict>
<key>PluginVersion</key>
<string>7.1.0</string>
<string>7.1.1</string>
<key>ServerApiVersion</key>
<string>2.0</string>
<key>IwsApiVersion</key>
Expand Down
4 changes: 4 additions & 0 deletions BetterEmail.indigoPlugin/Contents/Server Plugin/Devices.xml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@
<Label>Delete:</Label>
<Description>Delete the email message after processing.</Description>
</Field>
<Field id="checkSeen" type="checkbox" defaultValue="false">
<Label>Check All:</Label>
<Description>Process all messages every poll. For testing purposes only.</Description>
</Field>
</ConfigUI>
<States>
<State id="lastMessage">
Expand Down
36 changes: 24 additions & 12 deletions BetterEmail.indigoPlugin/Contents/Server Plugin/IMAPServer.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,14 +99,16 @@ def checkMsgs(self):
self.logger.debug(self.device.name + u": msg_ids = " + str(msg_ids))
for messageNum in msg_ids[0].split():
self.logger.debug(self.device.name + u": Checking Message # " + messageNum)
try:
typ, resp = self.connection.fetch(messageNum, '(FLAGS)')
if "$IndigoProcessed" in resp[0]:
self.logger.debug(self.device.name + u": Message # " + messageNum + " already seen, skipping...")
continue
except Exception, e:
self.logger.error(self.device.name + ': Error fetching FLAGS for Message # ' + messageNum + ": " + str(e))
pass

if not self.imapProps['checkSeen']: # only check for IndigoProcessed flag if we're not processing all messages
try:
typ, resp = self.connection.fetch(messageNum, '(FLAGS)')
if "$IndigoProcessed" in resp[0]:
self.logger.debug(u"%s: Message # %s already seen, skipping..." % (self.device.name, messageNum))
continue
except Exception, e:
self.logger.error(self.device.name + ': Error fetching FLAGS for Message # ' + messageNum + ": " + str(e))
pass

try:
self.logger.debug(self.device.name + u": Fetching Message # " + messageNum)
Expand Down Expand Up @@ -159,13 +161,22 @@ def checkMsgs(self):

try:
if message.is_multipart():
part0 = message.get_payload(0) # we only look at the first alternative content part
charset = part0.get_content_charset()
self.logger.threaddebug('checkMsgs: Decoding multipart message')
for part in message.walk():
type = part.get_content_type()
self.logger.threaddebug('\tfound type: %s' % type)
if type == "text/plain":
break
else:
raise Exception("No plain text segment found in multipart message")

charset = part.get_content_charset()
if charset:
messageText = part0.get_payload(decode=True).decode(charset)
messageText = part.get_payload(decode=True).decode(charset)
else:
messageText = part0.get_payload()
messageText = part.get_payload()
else:
self.logger.threaddebug('checkMsgs: Decoding simple message')
charset = message.get_content_charset()
if charset:
messageText = message.get_payload(decode=True).decode(charset)
Expand All @@ -182,6 +193,7 @@ def checkMsgs(self):
{'key':'messageText', 'value':messageText},
{'key':'lastMessage', 'value':messageID}
]
self.logger.threaddebug('checkMsgs: Updating states on server: %s' % str(stateList))
self.device.updateStatesOnServer(stateList)
indigo.activePlugin.triggerCheck(self.device)
broadcastDict = {'messageFrom': messageFrom, 'messageTo': messageTo, 'messageSubject': messageSubject, 'messageText': messageText}
Expand Down
19 changes: 14 additions & 5 deletions BetterEmail.indigoPlugin/Contents/Server Plugin/POPServer.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,12 +116,20 @@ def poll(self):

try:
if message.is_multipart():
part0 = message.get_payload(0) # we only look at the first alternative content part
charset = part0.get_content_charset()
self.logger.threaddebug('checkMsgs: Decoding multipart message')
for part in message.walk():
type = part.get_content_type()
self.logger.threaddebug('\tfound type: %s' % type)
if type == "text/plain":
break
else:
raise Exception("No plain text segment found in multipart message")

charset = part.get_content_charset()
if charset:
messageText = part0.get_payload(decode=True).decode(charset)
messageText = part.get_payload(decode=True).decode(charset)
else:
messageText = part0.get_payload()
messageText = part.get_payload()
else:
charset = message.get_content_charset()
if charset:
Expand All @@ -139,7 +147,8 @@ def poll(self):
{'key':'messageText', 'value':messageText},
{'key':'lastMessage', 'value':uidl}
]
self.device.updateStatesOnServer(stateList)
self.logger.threaddebug('checkMsgs: Updating states on server: %s' % str(stateList))
self.device.updateStatesOnServer(stateList)
broadcastDict = {'messageFrom': messageFrom, 'messageTo': messageTo, 'messageSubject': messageSubject, 'messageText': messageText}
indigo.server.broadcastToSubscribers(u"messageReceived", broadcastDict)
indigo.activePlugin.triggerCheck(self.device)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
<Field id="logLevel" type="menu" defaultValue="20">
<Label>Event Logging Level:</Label>
<List>
<Option value="5">Detailed Debugging Messages</Option>
<Option value="10">Debugging Messages</Option>
<Option value="20">Informational Messages</Option>
<Option value="30">Warning Messages</Option>
Expand Down

0 comments on commit c66f242

Please sign in to comment.