a31cba4887cffff5d9c41725d6da39820d0d64e1
Benjamin Renard Initial commit

Benjamin Renard authored 12 years ago

1) #!/usr/bin/python
Benjamin Renard MantisMail : Added decode()...

Benjamin Renard authored 12 years ago

2) # -*- coding: utf-8 -*-
Benjamin Renard Initial commit

Benjamin Renard authored 12 years ago

3) 
4) import re
5) import string
6) import smtplib
7) import logging
Benjamin Renard MantisMail.get_text() : do...

Benjamin Renard authored 12 years ago

8) import html2text
Benjamin Renard MantisMail : Added decode()...

Benjamin Renard authored 12 years ago

9) from email.MIMEText import MIMEText
10) import email
11) import email.header
Benjamin Renard MantisMail : fix mimetypes...

Benjamin Renard authored 12 years ago

12) import mimetypes
Benjamin Renard MantisMail : fix sys import...

Benjamin Renard authored 12 years ago

13) import sys
Benjamin Renard Initial commit

Benjamin Renard authored 12 years ago

14) 
15) class MantisMail(object):
16) 
17) 	def __init__(self,mailfrom,mailto,data):
18) 		self.mailfrom = mailfrom
19) 		self.mailto = mailto
20) 		self.msg = email.message_from_string(data)
21) 
22) 	def get_issue_id_from_subject(self):
23) 		res=re.search('\[[^\]]* ([0-9]*)\]',self.subject())
24) 		if res:
25) 			issue_id=res.group(1)
26) 			return string.atoi(issue_id)
27) 		return None
28) 
29) 	def subject(self):
Benjamin Renard MantisMail.subject() : deco...

Benjamin Renard authored 12 years ago

30) 		return self.decode_header('Subject')
Benjamin Renard Initial commit

Benjamin Renard authored 12 years ago

31) 	
32) 	def get_text(self):
Benjamin Renard MantisMail.get_text() : do...

Benjamin Renard authored 12 years ago

33) 		content=u'From : %s' % self.decode_header('From')
34) 		texts={}
Benjamin Renard Initial commit

Benjamin Renard authored 12 years ago

35) 		for part in self.msg.walk():
36) 			if part.get_content_maintype() == 'text':
Benjamin Renard MantisMail.get_text() : do...

Benjamin Renard authored 12 years ago

37) 				type=part.get_content_type()
38) 				if type not in texts:
39) 					texts[type]=[]
40) 				text=self.decode(part.get_payload(decode=True), prefer_encoding=part.get_content_charset())
41) 				if part.get_content_type() == 'text/html':
42) 					text=html2text.html2text(text)
43) 				texts[type].append(unicode(text))
44) 
45) 		if 'text/plain' in texts:
46) 			for text in texts['text/plain']:
47) 				content=u'%s\n\n---------------------------\n\n%s' % (content,text)
48) 		else:
49) 			for type in texts:
50) 				for text in texts[type]:
51) 					content=u'%s\n\n---------------------------\n\n%s' % (content,text)
52) 		return unicode(content)
Benjamin Renard Initial commit

Benjamin Renard authored 12 years ago

53) 	
54) 	def get_attachments(self):
55) 		attachments=[]
56) 		counter=1
57) 		for part in self.msg.walk():
58) 			part_type = part.get_content_maintype()
59) 			if part_type == 'text' or part_type == 'multipart':
60) 				continue
61) 			filename = part.get_filename()
62) 			if not filename:
63) 				ext = mimetypes.guess_extension(part.get_content_type())
64) 				if not ext:
65) 					ext = '.bin'
66) 				filename = 'part-%03d%s' % (counter, ext)
67) 			counter += 1
68) 			content=part.get_payload(decode=False)
69) 			attachments.append({
70) 				'filename':	filename,
71) 				'type':		part_type,
72) 				'content':	content
73) 			})
74) 		return attachments
75) 
Benjamin Renard MantisMail : Added decode()...

Benjamin Renard authored 12 years ago

76) 	def decode(self,text, prefer_encoding=None):
77) 		try_enc=['iso-8859-15', 'utf-8']
78) 		if prefer_encoding:
79) 			try_enc.insert(0,prefer_encoding)
80) 		for i in try_enc:
81) 			try:
82) 				return unicode(text.decode(i))
83) 			except Exception, e:
84) 				continue
85) 		return unicode(text.decode('utf-8', errors = 'replace'))
86) 
87) 	def decode_header(self,header):
88) 		s=email.Header.decode_header(self.msg[header])[0]
89) 		return self.decode(s[0],prefer_encoding=s[1])
90)