Example #1
0
    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
Example #2
0
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