@@ -231,6 +231,29 @@ def _oneloop(self):
231231
232232 return filecnt
233233
234+ def _convert_message (self , msg ):
235+ """Convert email.message.Message to Mailman.Message with proper handling of nested messages.
236+
237+ Args:
238+ msg: The message to convert
239+
240+ Returns:
241+ Mailman.Message: The converted message
242+ """
243+ if isinstance (msg , email .message .Message ):
244+ mailman_msg = Message .Message ()
245+ # Copy all attributes from the original message
246+ for key , value in msg .items ():
247+ mailman_msg [key ] = value
248+ # Copy the payload
249+ if msg .is_multipart ():
250+ for part in msg .get_payload ():
251+ mailman_msg .attach (self ._convert_message (part ))
252+ else :
253+ mailman_msg .set_payload (msg .get_payload ())
254+ return mailman_msg
255+ return msg
256+
234257 def _validate_message (self , msg , msgdata ):
235258 """Validate and convert message if needed.
236259
@@ -242,17 +265,7 @@ def _validate_message(self, msg, msgdata):
242265 # Convert message if needed
243266 if not isinstance (msg , Message .Message ):
244267 syslog ('debug' , 'Runner._validate_message: Converting message %s to Mailman.Message' , msgid )
245- mailman_msg = Message .Message ()
246- # Copy all attributes from the original message
247- for key , value in msg .items ():
248- mailman_msg [key ] = value
249- # Copy the payload
250- if msg .is_multipart ():
251- for part in msg .get_payload ():
252- mailman_msg .attach (part )
253- else :
254- mailman_msg .set_payload (msg .get_payload ())
255- msg = mailman_msg
268+ msg = self ._convert_message (msg )
256269
257270 # Validate required Mailman.Message methods
258271 required_methods = ['get_sender' , 'get' , 'items' , 'is_multipart' , 'get_payload' ]
@@ -306,7 +319,38 @@ def _onefile(self, msg, msgdata):
306319 self ._shunt .enqueue (msg , msgdata )
307320 return
308321
309- sender = msg .get_sender ()
322+ # Convert to Mailman.Message if needed
323+ if not isinstance (msg , Message .Message ):
324+ try :
325+ mailman_msg = Message .Message ()
326+ # Copy all attributes from the original message
327+ for key , value in msg .items ():
328+ mailman_msg [key ] = value
329+ # Copy the payload
330+ if msg .is_multipart ():
331+ for part in msg .get_payload ():
332+ mailman_msg .attach (part )
333+ else :
334+ mailman_msg .set_payload (msg .get_payload ())
335+ msg = mailman_msg
336+ syslog ('debug' , 'Converted message to Mailman.Message instance' )
337+ except Exception as e :
338+ syslog ('error' , 'Failed to convert message to Mailman.Message: %s' , str (e ))
339+ self ._shunt .enqueue (msg , msgdata )
340+ return
341+
342+ # Get sender using Mailman.Message's get_sender method
343+ try :
344+ sender = msg .get_sender ()
345+ if not sender :
346+ syslog ('error' , 'Could not determine sender for message %s' , msgid )
347+ self ._shunt .enqueue (msg , msgdata )
348+ return
349+ except Exception as e :
350+ syslog ('error' , 'Error getting sender: %s' , str (e ))
351+ self ._shunt .enqueue (msg , msgdata )
352+ return
353+
310354 listname = msgdata .get ('listname' , mm_cfg .MAILMAN_SITE_LIST )
311355 mlist = self ._open_list (listname )
312356 if not mlist :
0 commit comments