@@ -133,6 +133,9 @@ def get_maintenances(self, data: NotificationData) -> Iterable[Maintenance]:
133133 if os .getenv ("PARSER_OPENAI_API_KEY" ):
134134 self ._processors .append (CombinedProcessor (data_parsers = [EmailDateParser , OpenAIParser ]))
135135
136+ # Add subject to all html or text/* data_parts if not already present.
137+ self .add_subject_to_text (data )
138+
136139 for processor in self ._processors :
137140 try :
138141 return processor .process (data , self .get_extended_data ())
@@ -152,6 +155,30 @@ def get_maintenances(self, data: NotificationData) -> Iterable[Maintenance]:
152155 related_exceptions = related_exceptions ,
153156 )
154157
158+
159+ def add_subject_to_text (self , data : NotificationData ):
160+ """Append the subject to all text/* data_parts if not already present."""
161+ subject = None
162+ for part in data .data_parts :
163+ if part .type == 'email-header-subject' :
164+ subject = part .content .decode (errors = 'ignore' )
165+ break
166+ if subject :
167+ new_data_parts = []
168+ for part in data .data_parts :
169+ if part .type .startswith ('text/' ) or part .type .startswith ('html' ):
170+ content_str = part .content .decode (errors = 'ignore' )
171+ if subject not in content_str :
172+ # Append subject and update content
173+ new_content = (content_str + '\n ' + subject ).encode ()
174+ new_data_parts .append (type (part )(part .type , new_content ))
175+ else :
176+ new_data_parts .append (part )
177+ else :
178+ new_data_parts .append (part )
179+ data .data_parts = new_data_parts
180+
181+
155182 @classmethod
156183 def get_default_organizer (cls ) -> str :
157184 """Expose default_organizer as class attribute."""
0 commit comments