Пример #1
0
def mail_delete_view(request):
    mail_id = request.POST.get('id')
    mail = get_object_or_404(Mail.my_mails(request.user), pk=mail_id)

    imap_conn = imaphelper.get_connection()
    imap_mail = imaphelper.IMAPMessage.from_dbid(mail_id, imap_conn)
    mail.delete()
    imap_mail.delete()

    return HttpResponseRedirect("/")
Пример #2
0
    def handle(self, *args, **kwargs):
        # Do not run more often than every 30 seconds
        has_recent_import = ImportLog.objects.filter(
            date__gt=timezone.now() - datetime.timedelta(seconds=30)).exists()
        if has_recent_import:
            return
        ImportLog.objects.create()

        # Now - import (new) mails
        imap_conn = imaphelper.get_connection()
        messages = imaphelper.get_unflagged(imap_conn)

        for message in messages:
            self.import_mail(message)

        imap_conn.expunge()
        logger.info("Importing new emails finished")
Пример #3
0
    def handle(self, *args, **kwargs):

        lock = FileLock('/tmp/lockfile.tmp')
        with lock:

            last_import, created = ImportLog.objects.get_or_create()
            import_diff = timezone.now() - last_import.date

            if import_diff > datetime.timedelta(seconds=30):
                last_import.save()
            else:
                return

            imap_conn = imaphelper.get_connection()
            messages = imaphelper.get_unflagged(imap_conn)

            for message in messages:
                self.import_mail(message)

            imap_conn.expunge()
Пример #4
0
    def handle(self, *args, **kwargs):
        dues = Due.objects.filter(due__lte=timezone.now())

        for due in dues:
            mail = due.mail

            imap_conn = imaphelper.get_connection()
            try:
                message = imaphelper.IMAPMessage.from_dbid(mail.id, imap_conn)
            except IndexError:
                logger.warning(
                    "Imap message of mail {} could not be found".format(
                        mail.id))
                mail.delete()

                return

            recipients = mail.recipient_set
            tpl = get_template("mails/messages/mail_attachment.txt")
            text = tpl.render({"recipients": recipients})

            try:
                send_email_with_attachments(message=message,
                                            mail=mail,
                                            text=text)
            except:
                message.delete()
                print("Failed to write new header")
                break

            stats = Statistic(type="SENT",
                              email=mail.user.email,
                              date=timezone.now())
            stats.save()

            due.delete()

            if not mail.due_set.count():
                message.delete()
                mail.delete()
Пример #5
0
    def handle(self, *args, **kwargs):
        try:
            smtp = smtplib.SMTP(settings.EMAIL_HOST)
            smtp.starttls()
            smtp.login(settings.EMAIL_HOST_USER, settings.EMAIL_HOST_PASSWORD)
        except:
            return

        dues = Due.objects.filter(due__lte=timezone.now())

        for due in dues:
            mail = due.mail

            imap_conn = imaphelper.get_connection()
            try:
                message = imaphelper.IMAPMessage.from_dbid(mail.id, imap_conn)
            except IndexError:
                mail.delete()
                logger.warning(
                    'Imap message of mail {} could not be found'.format(
                        mail.id))

                return

            charset = message.msg.get_content_charset()
            recipients = mail.recipient_set
            tpl = get_template('mails/messages/mail_attachment.txt')
            text = tpl.render({'recipients': recipients})

            if message.msg.is_multipart():
                add_text = MIMEText(text, 'plain', 'utf-8')
                if message.msg.get_content_maintype == 'multipart/signed':
                    # If it's a signed message, only take first payload
                    msg = MIMEMultipart()
                    orig = message.msg.get_payload(0)
                    msg.attach(orig)
                    msg.attach(add_text)
                else:
                    msg = MIMEMultipart()
                    msg.attach(message.msg)
                    msg.attach(add_text)

            else:
                msg = MIMEText(
                    '\n\n'.join((message.msg.get_payload(), str(text))),
                    'plain', charset)

            try:
                for i in message.msg.walk():
                    if i.get_content_maintype() == 'text':
                        content = i.get_payload(decode=True)
                        break

                attachments = []
                for part in msg.walk():
                    if part.get_content_maintype() == 'multipart':
                        continue
                    if part.get('Content-Disposition') is None:
                        continue
                    attachments.append(part)

                email = EmailMessage(
                    "Reminder from {}: {}".format(
                        mail.sent.strftime('%b %d %H:%M'), mail.subject),
                    content.decode("utf-8") + text,
                    settings.EMAIL_HOST_USER,
                    [mail.user.email],
                )
                for attachment in attachments:
                    email.attach(attachment.get_filename(),
                                 attachment.get_payload(decode=True),
                                 attachment.get_content_type())
                email.send()

            except:
                message.delete()
                print('Failed to write new header')
                break

            stats = Statistic(type='SENT',
                              email=mail.user.email,
                              date=timezone.now())
            stats.save()

            due.delete()

            if not mail.due_set.count():
                message.delete()
                mail.delete()

        smtp.quit()