66 |
return result |
return result |
67 |
|
|
68 |
def transformHeader(header, bodyID): |
def transformHeader(header, bodyID): |
69 |
|
"""Transforms message header to a message/external-body header |
70 |
|
""" |
71 |
result = [] |
result = [] |
72 |
idstring = 'storm:block:' + bodyID.getString() |
idstring = 'storm:block:' + bodyID.getString() |
73 |
|
|
87 |
if param[0:7] == 'charset': |
if param[0:7] == 'charset': |
88 |
return param[8:] |
return param[8:] |
89 |
|
|
90 |
|
return "us-ascii" |
91 |
|
|
92 |
def getContentTypeParams(msg): |
def getContentTypeParams(msg): |
93 |
ctparams = [] |
ctparams = [] |
94 |
for param in msg.getplist(): |
for param in msg.getplist(): |
97 |
|
|
98 |
def storeMail(mail, mediaserver): |
def storeMail(mail, mediaserver): |
99 |
mail = re.sub(r'(\r\n|\r|\n)', '\r\n', mail) |
mail = re.sub(r'(\r\n|\r|\n)', '\r\n', mail) |
100 |
|
tMail = StringIO.StringIO(mail) |
101 |
|
tMail = mimetools.Message(tMail) |
102 |
mail = StringIO.StringIO(mail) |
mail = StringIO.StringIO(mail) |
103 |
msg = mimetools.Message(mail) |
msg = mimetools.Message(mail) |
104 |
msgtype = msg.gettype() |
msgtype = msg.gettype() |
105 |
msgID = msg.getheader("Message-ID") |
msgID = msg.getheader("Message-ID") |
106 |
|
|
107 |
getCharset(msg) |
|
108 |
|
headerLines = java.util.ArrayList() |
109 |
|
headerLines.add('Content-Type: message/rfc822') |
110 |
|
tempstore = mediaserver.addDatum(string.join(tMail.headers, '') |
111 |
|
+ '\r\n' + tMail.fp.read(), headerLines, None, 0) |
112 |
|
|
113 |
if msgtype[:10] == "multipart/": |
if msgtype[:10] == "multipart/": |
114 |
headerLinesH = java.util.ArrayList() |
headerLinesH = java.util.ArrayList() |
120 |
|
|
121 |
while mulmsg.next(): |
while mulmsg.next(): |
122 |
submsg = mimetools.Message(mulmsg) |
submsg = mimetools.Message(mulmsg) |
|
id = storeBody(mediaserver, submsg, msgID) |
|
123 |
|
|
124 |
header = ['--', msg.getparam("boundary") + '\r\n'] |
header = ['--', msg.getparam("boundary") + '\r\n'] |
|
header = header + transformHeader(submsg.headers, id) |
|
|
header = string.join(header, '') |
|
125 |
|
|
126 |
headerData += header |
body = submsg.fp.read() |
127 |
|
if isConvertible(body, getCharset(submsg)): |
128 |
|
id = storeBody(mediaserver, submsg, body, msgID) |
129 |
|
header = header + transformHeader(submsg.headers, id) |
130 |
|
header = string.join(header, '') |
131 |
|
headerData += header |
132 |
|
else: |
133 |
|
headerData += string.join(submsg.headers, '') + '\n\r' + body |
134 |
|
|
135 |
headerData += '--' + msg.getparam("boundary") + '--\r\n\r\n' |
headerData += '--' + msg.getparam("boundary") + '--\r\n\r\n' |
136 |
id2 = mediaserver.addDatum(headerData, headerLinesH, None, 0) |
id2 = mediaserver.addDatum(headerData, headerLinesH, None, 0) |
137 |
eis = gzz.modules.email.DefaultEmailInStorm(mediaserver, id2) |
eis = gzz.modules.email.DefaultEmailInStorm(mediaserver, id2) |
138 |
|
if isReconstructable(mediaserver, id2, tempstore): |
139 |
|
mediaserver.expungeDatum(tempstore) |
140 |
|
else: |
141 |
|
id2 = tempstore |
142 |
|
|
143 |
print eis.getSubject().makeString(), ": ", id2.getString() |
print eis.getSubject().makeString(), ": ", id2.getString() |
144 |
print "----" |
print "----" |
145 |
print eis.getBody().makeString() |
print eis.getBody().makeString() |
149 |
headerLinesB = java.util.ArrayList() |
headerLinesB = java.util.ArrayList() |
150 |
headerLinesH.add('Content-Transfer-Encoding: binary') |
headerLinesH.add('Content-Transfer-Encoding: binary') |
151 |
headerLinesH.add('Content-Type: message/rfc822') |
headerLinesH.add('Content-Type: message/rfc822') |
|
id = storeBody(mediaserver, msg, msgID) |
|
|
|
|
|
header = string.join(transformHeader(msg.headers, id), '') |
|
152 |
|
|
153 |
id2 = mediaserver.addDatum(header, headerLinesH, None, 0) |
body = msg.fp.read() |
154 |
|
if isConvertible(body , getCharset(msg)): |
155 |
|
id = storeBody(mediaserver, msg, body, msgID) |
156 |
|
header = string.join(transformHeader(msg.headers, id), '') |
157 |
|
id2 = mediaserver.addDatum(header, headerLinesH, None, 0) |
158 |
|
else: |
159 |
|
header = string.join(msg.headers, '') + '\r\n' + body |
160 |
|
id2 = mediaserver.addDatum(header, headerLinesH, None, 0) |
161 |
|
|
162 |
|
if isReconstructable(mediaserver, id2, tempstore): |
163 |
|
mediaserver.expungeDatum(tempstore) |
164 |
|
else: |
165 |
|
id2 = tempstore |
166 |
|
|
167 |
eis = gzz.modules.email.DefaultEmailInStorm(mediaserver, id2) |
eis = gzz.modules.email.DefaultEmailInStorm(mediaserver, id2) |
168 |
print eis.getSubject().makeString(), ": ", id2.getString() |
print eis.getSubject().makeString(), ": ", id2.getString() |
169 |
print "----" |
print "----" |
174 |
|
|
175 |
def isConvertible(body, charset): |
def isConvertible(body, charset): |
176 |
cBody = "" |
cBody = "" |
177 |
|
print "Charset: ", charset |
178 |
|
#if charset == None: |
179 |
|
# charset = "us-ascii" |
180 |
try: |
try: |
181 |
cBody = java.lang.String(body, charset); |
cBody = java.lang.String(body, charset); |
182 |
except java.io.UnsupportedEncodingException: |
except java.io.UnsupportedEncodingException: |
184 |
return 0 |
return 0 |
185 |
|
|
186 |
bBody = cBody.getBytes(charset) |
bBody = cBody.getBytes(charset) |
187 |
if body.equals(bBody): # somehow like this... just with body as a byte-array |
#if body.equals(bBody): |
188 |
return 1 |
# return 1 |
189 |
else: |
#else: |
190 |
return 0 |
# return 0 |
191 |
|
return 1 |
192 |
|
|
193 |
|
def isReconstructable(mediaserver, msid, recid): |
194 |
|
return 1 |
195 |
|
|
196 |
def storeBody(mediaserver, msg, msgID): |
def storeBody(mediaserver, msg, body, msgID): |
197 |
msgtype = msg.gettype() |
msgtype = msg.gettype() |
198 |
ctparams = getContentTypeParams(msg) |
ctparams = getContentTypeParams(msg) |
199 |
cbodyid = None |
cbodyid = None |
200 |
print msgID |
print msgID |
201 |
|
|
202 |
|
print "\"", msgtype, "\"" |
203 |
if msgtype == "message/rfc822": |
if msgtype == "message/rfc822": |
204 |
print "message/rfc822" |
cbodyid = storeMail(body, mediaserver) |
|
storeMail(msg.fp.read(), mediaserver) |
|
205 |
elif msgtype == "text/plain": |
elif msgtype == "text/plain": |
206 |
headerLinesB = java.util.ArrayList() |
headerLinesB = java.util.ArrayList() |
207 |
headerLinesB.add('Content-Type: text/plain; charset=UTF-8') |
headerLinesB.add('Content-Type: text/plain; charset=UTF-8') |
208 |
headerLinesB.add('Message-ID: ' + msgID) |
headerLinesB.add('Message-ID: ' + msgID) |
209 |
headerLinesB.add('Content-Transfer-Encoding: ' + msg.getencoding()) |
headerLinesB.add('Content-Transfer-Encoding: ' + msg.getencoding()) |
210 |
|
|
211 |
body = msg.fp.read() |
tBody = java.lang.String(body, getCharset(msg)) |
212 |
cbodyid = mediaserver.addDatum(body, headerLinesB, None, 0) |
cbodyid = mediaserver.addDatum(tBody.getBytes("UTF8"), headerLinesB, None, 0) |
213 |
else: |
else: |
214 |
headerLinesB = java.util.ArrayList() |
headerLinesB = java.util.ArrayList() |
215 |
headerLinesB.add('Content-Type: ' + msgtype |
headerLinesB.add('Content-Type: ' + msgtype |
217 |
headerLinesB.add('Message-ID: ' + msgID) |
headerLinesB.add('Message-ID: ' + msgID) |
218 |
headerLinesB.add('Content-Transfer-Encoding: ' + msg.getencoding()) |
headerLinesB.add('Content-Transfer-Encoding: ' + msg.getencoding()) |
219 |
|
|
|
body = msg.fp.read() |
|
220 |
cbodyid = mediaserver.addDatum(body, headerLinesB, None, 0) |
cbodyid = mediaserver.addDatum(body, headerLinesB, None, 0) |
221 |
|
|
222 |
return cbodyid |
return cbodyid |