def __init__(self, message, hash_value, uid): self.hash_value = hash_value self.uid = uid message = email.message_from_string(message) def _get_header_data(key): value = message.get(key, '<unknown>') value = decode_mail_headers(decodeUnknown(message.get_charset(), value)) return value self.subject = _get_header_data('subject').strip() self.sender = parseaddr(message.get('from')) received = None date_str= message.get('date') if date_str: date_tuple= parsedate_tz(date_str) if date_tuple: received=datetime.datetime.fromtimestamp(mktime_tz(date_tuple)) self.received = received self.recipients = getaddresses(message.get_all('to', []) + message.get_all('cc', []) + message.get_all('resent-to', []) + message.get_all('resent-cc', [])) counter = 0 files = [] body_plain, body_html = '', '' for part in message.walk(): if part.get_content_maintype() == 'multipart': continue name = part.get_param("name") if name: name = collapse_rfc2231_value(name) if part.get_content_maintype() == 'text' and name == None: if part.get_content_subtype() == 'plain': body_plain = decodeUnknown(part.get_content_charset(), part.get_payload(decode=True)) else: body_html = part.get_payload(decode=True) else: if not name: ext = mimetypes.guess_extension(part.get_content_type()) name = "part-%i%s" % (counter, ext) files.append({ 'filename': name, 'content': part.get_payload(decode=True), 'type': part.get_content_type()}, ) counter += 1 self.body_plain = body_plain self.body_html = mark_safe(strip_empty_tags(strip_tags(body_html, ['html', 'head', 'body', 'meta']))) self.files = files
def send_multi_mail(subject, content, recipient_list, from_email=from_email, names_dict=None, ignore_celery=False): def _add_name_dict(user): if not names_dict.get(user.email, None): names_dict[user.email] = user.get_full_name() if names_dict is None: names_dict = {} if not isinstance(recipient_list, list): recipient_list = [recipient_list] if len(recipient_list) == 0: return 0 recipient_list = list(set(recipient_list)) msg = Message() msg.subject = smart_str(subject) msg.save() for u in User.objects.filter(email=from_email): msg.sender = u _add_name_dict(u) recipient_list_str = [] for recipient in recipient_list: if isinstance(recipient, User): msg.recipients.add(recipient) _add_name_dict(recipient) recipient_list_str.append(recipient.email) else: for u in User.objects.filter(email=recipient): _add_name_dict(u) msg.recipients.add(u) recipient_list_str.append(recipient) h = HTML2Text() h.ignore_images = True h.ignore_emphasis = True recipient_list_str = list(set(recipient_list_str)) args = [smart_str(subject), smart_str(h.handle(force_unicode(strip_empty_tags(strip_tags(content, ['img', 'script', 'span']))))), from_email ] kwargs = {} if len(recipient_list_str) > 1: kwargs['to'] = [from_email] kwargs['bcc'] = recipient_list_str else: kwargs['to'] = recipient_list_str email = EmailMultiAlternatives(*args, **kwargs) email.attach_alternative(content, "text/html") msg.email = email msg.save() get_or_create_contact((names_dict.get(from_email), from_email)).emails_sent.add(msg) for rec in recipient_list_str: get_or_create_contact((names_dict.get(rec), rec)).emails_received.add(msg) send(msg, ignore_celery) return 1