@@ -192,10 +192,10 @@ def encode_message(txt):
192192 assert isinstance (txt , six .text_type )
193193 return MIMEText (txt .encode ('utf-8' ), 'plain' , 'UTF-8' )
194194
195- def send_mail_text (request , to , frm , subject , txt , cc = None , extra = None , toUser = False , bcc = None , copy = True ):
195+ def send_mail_text (request , to , frm , subject , txt , cc = None , extra = None , toUser = False , bcc = None , copy = True , save = True ):
196196 """Send plain text message."""
197197 msg = encode_message (txt )
198- return send_mail_mime (request , to , frm , subject , msg , cc , extra , toUser , bcc , copy = copy )
198+ return send_mail_mime (request , to , frm , subject , msg , cc , extra , toUser , bcc , copy = copy , save = save )
199199
200200def on_behalf_of (frm ):
201201 if isinstance (frm , tuple ):
@@ -320,6 +320,9 @@ def condition_message(to, frm, subject, msg, cc, extra):
320320 msg [k ] = ", " .join (v )
321321 except Exception :
322322 raise
323+ if not msg .get ('Message-ID' , None ):
324+ msg ['Message-ID' ] = make_msgid ()
325+
323326
324327def show_that_mail_was_sent (request ,leadline ,msg ,bcc ):
325328 if request and request .user :
@@ -334,11 +337,29 @@ def show_that_mail_was_sent(request,leadline,msg,bcc):
334337 info += "Bcc: %s\n " % bcc
335338 messages .info (request ,info ,extra_tags = 'preformatted' ,fail_silently = True )
336339
337- def send_mail_mime (request , to , frm , subject , msg , cc = None , extra = None , toUser = False , bcc = None , copy = True ):
340+ def save_as_message (request , msg , bcc ):
341+ by = ((request and request .user and not request .user .is_anonymous and request .user .person )
342+ or ietf .person .models .Person .objects .get (name = "(System)" ))
343+ headers , body = force_text (str (msg )).split ('\n \n ' , 1 )
344+ kwargs = {'by' : by , 'body' : body , 'content_type' : msg .get_content_type (), 'bcc' : bcc or '' }
345+ for (arg , field ) in [
346+ ('cc' , 'Cc' ),
347+ ('frm' , 'From' ),
348+ ('msgid' , 'Message-ID' ),
349+ ('reply_to' , 'Reply-To' ),
350+ ('subject' , 'Subject' ),
351+ ('to' , 'To' ),
352+ ]:
353+ kwargs [arg ] = msg .get (field , '' )
354+ m = ietf .message .models .Message .objects .create (** kwargs )
355+ log ("Saved outgoing email from '%s' to %s id %s subject '%s as Message[%s]'" % (m .frm , m .to , m .msgid , m .subject , m .pk ))
356+ return m
357+
358+ def send_mail_mime (request , to , frm , subject , msg , cc = None , extra = None , toUser = False , bcc = None , copy = True , save = True ):
338359 """Send MIME message with content already filled in."""
339360
340361 condition_message (to , frm , subject , msg , cc , extra )
341-
362+
342363 # start debug server with python -m smtpd -n -c DebuggingServer localhost:2025
343364 # then put USING_DEBUG_EMAIL_SERVER=True and EMAIL_HOST='localhost'
344365 # and EMAIL_PORT=2025 in settings_local.py
@@ -352,16 +373,24 @@ def send_mail_mime(request, to, frm, subject, msg, cc=None, extra=None, toUser=F
352373 if settings .SERVER_MODE == 'development' :
353374 show_that_mail_was_sent (request ,'In production, email would have been sent' ,msg ,bcc )
354375
376+ # Maybe save in the database as a Message object
377+ if save :
378+ message = save_as_message (request , msg , bcc )
379+ else :
380+ message = None
381+
355382 if test_mode or debugging or production :
356383 try :
357384 send_smtp (msg , bcc )
385+ if save :
386+ message .sent = datetime .datetime .now ()
387+ message .save ()
388+ show_that_mail_was_sent (request ,'Email was sent' ,msg ,bcc )
358389 except smtplib .SMTPException as e :
359390 log_smtp_exception (e )
360391 build_warning_message (request , e )
361392 send_error_email (e )
362393
363- show_that_mail_was_sent (request ,'Email was sent' ,msg ,bcc )
364-
365394 elif settings .SERVER_MODE == 'test' :
366395 if toUser :
367396 copy_email (msg , to , toUser = True , originalBcc = bcc )
@@ -448,15 +477,29 @@ def send_mail_preformatted(request, preformatted, extra={}, override={}):
448477def send_mail_message (request , message , extra = {}):
449478 """Send a Message object."""
450479 # note that this doesn't handle MIME messages at the moment
480+ assertion ('isinstance(message.to, six.string_types) and isinstance(message.cc, six.string_types) and isinstance(message.bcc, six.string_types)' )
451481
452482 e = extra .copy ()
453483 if message .reply_to :
454484 e ['Reply-To' ] = message .get ('reply_to' )
455485 if message .msgid :
456486 e ['Message-ID' ] = [ message .msgid , ]
457487
458- return send_mail_text (request , message .to , message .frm , message .subject ,
459- message .body , cc = message .cc , bcc = message .bcc , extra = e )
488+ content_type = message .content_type or 'text/plain'
489+ if 'multipart' in content_type :
490+ body = ("MIME-Version: 1.0\r \n Content-Type: %s\r \n \r \n " % content_type ) + message .body
491+ msg = message_from_string (force_str (body ))
492+ else :
493+ msg = encode_message (message .body )
494+
495+ msg = send_mail_mime (request , message .to , message .frm , message .subject ,
496+ msg , cc = message .cc , bcc = message .bcc , extra = e , save = False )
497+
498+ # msg = send_mail_text(request, message.to, message.frm, message.subject,
499+ # message.body, cc=message.cc, bcc=message.bcc, extra=e, save=False)
500+ message .sent = datetime .datetime .now ()
501+ message .save ()
502+ return msg
460503
461504def exception_components (e ):
462505 # See if it's a non-smtplib exception that we faked
0 commit comments