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
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())
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
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()
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