示例#1
0
 def _send(self, email_message: EmailMessage):
     """A helper method that does the actual sending."""
     if not email_message.recipients():
         return False
     encoding = email_message.encoding or settings.DEFAULT_CHARSET
     # Specific
     email_message.extra_headers["Reply-To"] = sanitize_address(
         email_message.from_email, encoding)
     email_message.from_email = settings.EMAIL_SENDER
     for key, value in json.loads(settings.EMAIL_EXTRA_HEADERS).items():
         email_message.extra_headers[key] = value
     # /Specific
     from_email = sanitize_address(email_message.from_email, encoding)
     recipients = [
         sanitize_address(addr, encoding)
         for addr in email_message.recipients()
     ]
     message = email_message.message()
     try:
         self.connection.sendmail(from_email, recipients,
                                  message.as_bytes(linesep="\r\n"))
     except SMTPException:
         if not self.fail_silently:
             raise
         return False
     return True
示例#2
0
    def process_talk(self, event, talk):
        application = talk.application
        user = application.applicant.user

        body = loader.render_to_string(
            "talks/emails/survey_results.eml", {
                "talk": talk,
                "user": user,
                "event": event,
                "application": application,
            })

        email = EmailMessage(
            subject="Survey results",
            body=body,
            from_email="*****@*****.**",
            to=["{} <{}>".format(user.full_name, user.email)],
        )

        chart = generate_survey_score_chart(talk, format="png")
        email.attach("survey_scores.png", chart, "image/png")

        filename = f"{slugify(user.full_name)}.eml"
        print(f"Generating: {filename}")

        with open(filename, "w") as f:
            f.write(email.message().as_string())
示例#3
0
def create_test_email(from_email, to, subject='hello', body='This is clearly a test.', headers=None):
	"""
	Returns a string representation of an email message.
	
	"""
	headers = headers or {}
	msg = EmailMessage(subject, body, from_email, to, headers=headers)
	msg_str = msg.message().as_string()
	return msg_str
示例#4
0
 def send_message(self,
                  subject,
                  body,
                  from_email=None,
                  to=None,
                  cc=None,
                  bcc=None,
                  headers=None,
                  path=''):
     if to == None:
         to = self.email
     email = EmailMessage(subject=subject,
                          body=body,
                          from_email=from_email,
                          to=to,
                          cc=cc,
                          bcc=bcc,
                          headers=headers)
     if path:
         email.attach_file(path)
     email.message()
     email.send()
示例#5
0
 def parse(self):  # {{{2
     '''
     parse all mails from imap mailbox
     '''
     #re_charset = re.compile( r'charset=([^\s]*)', re.IGNORECASE )
     for number in self.get_list():
         typ, data = self.mailbox.fetch(number, '(RFC822 UID BODY[TEXT])')
         if (data is None) or (len(data) < 1) or (data[0] is None) or \
                 (len(data[0]) < 2):
             continue
         mail = email.message_from_string(data[0][1])
         text = u""
         msgobj = EmailParser().parse(StringIO(mail), False)
         for part in msgobj.walk():
             if part.get_content_type() == "text/plain":
                 if part.get_content_charset():
                     text += unicode(part.get_payload(decode=True),
                                     part.get_content_charset(), 'replace')
         # extracs subject
         subject = ''
         if msgobj['Subject'] is not None:
             decodefrag = decode_header(msgobj['Subject'])
             subj_fragments = []
             for string, enc in decodefrag:
                 if enc:
                     string = unicode(string, enc, 'replace')
                     #s = unicode( s , enc ).encode( 'utf8', \
                     #                               'replace' )
                 subj_fragments.append(string)
             subject = u''.join(subj_fragments)
         # 'from' field of the email received (TODO: better 'reply-to'?)
         to_email = mail['From']
         # sender of our emails
         from_email = settings.DEFAULT_FROM_EMAIL
         try:
             sid = transaction.savepoint()
             with reversion.create_revision():
                 event, dates_times_list = Event.parse_text(text)
                 reversion.add_meta(RevisionInfo,
                                    as_text=smart_unicode(event.as_text()))
             for dates_times in dates_times_list:
                 with reversion.create_revision():
                     clone = event.clone(
                         user=None,
                         except_models=[EventDate, EventSession],
                         **dates_times)
                     reversion.add_meta(RevisionInfo,
                                        as_text=smart_unicode(
                                            clone.as_text()))
             assert (type(event) == Event)
             self.mv_mail(number, 'saved')
             self.stdout.write(
                 smart_str(u'Successfully added new event: ' + event.title))
             message = render_to_string(
                 'mail/email_accepted_event.txt', {
                     'site_name': Site.objects.get_current().name,
                     'site_domain': Site.objects.get_current().domain,
                     'event': event,
                     'original_message': text,
                 })
             mail = EmailMessage(''.join(subject.splitlines()), message,
                                 from_email, (to_email, ))
             mail.send(fail_silently=False)
             transaction.savepoint_commit(sid)
         except (ValidationError, IntegrityError) as err:
             transaction.savepoint_rollback(sid)
             # error found, saving the message in the imap forder 'errors'
             self.mv_mail(number, 'errors')
             # sending a notification email to the sender {{{3
             if msgobj['Subject'] is not None:
                 subject = \
                     _( u'Validation error in: %(old_email_subject)s' ) \
                     % { 'old_email_subject': \
                     subject.replace( '\n', ' ' ), }
                 subject = subject.replace('\n', ' ')
             else:
                 subject = _(u'Validation error')
             # insert errors message into the email body
             if hasattr(err, 'message_dict'):
                 # if hasattr(err, 'message_dict'), it looks like:
                 # {'url': [u'Enter a valid value.']}
                 message = render_to_string(
                     'mail/email_parsing_errors.txt', {
                         'site_name': Site.objects.get_current().name,
                         'site_domain': Site.objects.get_current().domain,
                         'original_message': text,
                         'errors_dict': err.message_dict
                     })
                 #TODO: write to an error log file instead of stderr
                 self.stderr.write( smart_str(
                     u"Found errors in message with subject: %s\n\terrors: %s" \
                     % ( mail['Subject'], unicode(err.message_dict))))
             elif hasattr(err, 'messages'):
                 message = render_to_string(
                     'mail/email_parsing_errors.txt', {
                         'site_name': Site.objects.get_current().name,
                         'site_domain': Site.objects.get_current().domain,
                         'original_message': text,
                         'errors_list': err.messages
                     })
                 self.stderr.write( smart_str(
                     u"Found errors in message with subject: %s\n\terrors: %s" \
                     % ( mail['Subject'], unicode(err.messages))))
             elif hasattr(err, 'message'):
                 message = render_to_string(
                     'mail/email_parsing_errors.txt', {
                         'site_name': Site.objects.get_current().name,
                         'site_domain': Site.objects.get_current().domain,
                         'original_message': text,
                         'errors_list': [err.message]
                     })
                 self.stderr.write( smart_str(
                     u"Found errors in message with subject: %s\n\terrors: %s" \
                     % ( mail['Subject'], unicode(err.message))))
             else:
                 message = render_to_string(
                     'mail/email_parsing_errors.txt', {
                         'site_name': Site.objects.get_current().name,
                         'site_domain': Site.objects.get_current().domain,
                         'original_message': text,
                         'errors_list': []
                     })
                 self.stderr.write( smart_str(
                     u"Found errors in message with subject: %s" \
                     % mail['Subject'] ))
             if subject and message and from_email:
                 mail = EmailMessage( subject, message, \
                                      from_email, ( to_email, ) )
                 msg = str(mail.message())
                 try:
                     mail.send(fail_silently=False)
                     self.mailbox.append( 'IMAP.sent', None, None, \
                                    msg )
                 except SMTPException:
                     #TODO: write to an error log file instead of stderr
                     self.stderr.write('imap.py:ERR:smtplib.SMTPException')
             else:
                 #TODO: write to an error log file instead of stderr
                 self.stderr.write(
                     'imap.py:ERR:missing info for error email')
         except:
             transaction.savepoint_rollback(sid)
             raise