Code Monkey home page Code Monkey logo

django-mailbox's Introduction

https://badge.fury.io/py/django-mailbox.png

Easily ingest messages from POP3, IMAP, Office365 API or local mailboxes into your Django application.

This app allows you to either ingest e-mail content from common e-mail services (as long as the service provides POP3 or IMAP support), or directly receive e-mail messages from stdin (for locally processing messages from Postfix or Exim4).

These ingested messages will be stored in the database in Django models and you can process their content at will, or -- if you're in a hurry -- by using a signal receiver.

Join the chat at https://gitter.im/coddingtonbear/django-mailbox

django-mailbox's People

Contributors

ad-m avatar akshetpandey avatar alexlovelltroy avatar antcorro avatar anweshadas avatar buriy avatar coddingtonbear avatar dmippolitov avatar duyu avatar eupharis avatar fsboehme avatar gitter-badger avatar ivlevdenis avatar kommusoft avatar martinmanzo avatar modernneo avatar mradamczyk avatar pcraston avatar pfouque avatar pietro395 avatar redtoad avatar robersillo avatar rokfordchez avatar seraint avatar sumpfralle avatar tchamberlin avatar tcosprojects avatar willhcr avatar wnp avatar xeroticikot avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

django-mailbox's Issues

How do I fetch a sent mail from GMail?

Hi,
First, thank you for this great library!

In my Django project, I've set up sending mail through smtp.gmail.com. The messages appear in my Sent Mail folder when I browse the GMail mailbox, and the other party receives them fine.

Then I've set up fetching mail from that mailbox via IMAP using django-mailbox. The problem is that django-mailbox can't see the sent messages when I try to get new mail. Nothing comes to my Django admin. My Sent Mail is exposed to IMAP (the 'Show in IMAP' checkbox in settings is set), and I didn't see any other settings that might be related to this.

And now the final part goes. If I move these messages from Sent Mail into Inbox, django-mailbox will see them and fetch, and they will be moved into All Mail (as supposed—they are archived upon fetching via IMAP).

Is getting sent mail not supposed at all? I assume this is not the case because these messages are fetched when moved to another folder.

So—do I do something wrong, or does GMail not show the Sent Mail folder, or what? Maybe that's django-mailbox that doesn't look into Sent Mail?

Alex

Folder and Archive options not working for python<2.7.4

There is a "feature" in python<2.7.4 and urlparse that parses query string to path portion if scheme is uknown (and imap+ssl is an unknown scheme).

This makes archive and folder options unusable on older installations, like ubuntu 12.04 (with python 2.7.3)

UnicodeDecodeError in MessageAttachment

Hi.
MessageAttachment._get_rehydrated_headers raises a UnicodeDecodeError if self.headers contains non ASCII characters not decoded. (in Python2.x)
So if attachment file name is ð̞oβ̞le.jpg , this header is ok:
Content-Type: image/jpeg; name="=?UTF-8?B?4oCYw7DMnm/OssyebGUuanBn?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename*="utf-8''%E2%80%98%C3%B0%CC%9E%6F%CE%B2%CC%9E%6C%65%2E%6A%70%67"

where this header raises UnidoceDecodeError:
Content-Type: image/jpeg; name="‘ð̞oβ̞le.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename*="‘ð̞oβ̞le.jpg"

'Message' does not support the buffer interface (Python 3)

Hi,

I get the following TypeError when trying to fetch new messages with the STORE_ORIGINAL_MESSAGE set to True.

  File "/home/justin/.virtualenvs/archimedes/lib/python3.4/site-packages/django_mailbox-4.4.6-py3.4.egg/django_mailbox/management/commands/getmail.py", line 24, in handle
    messages = mailbox.get_new_mail()
  File "/home/justin/.virtualenvs/archimedes/lib/python3.4/site-packages/django_mailbox-4.4.6-py3.4.egg/django_mailbox/models.py", line 397, in get_new_mail
    msg = self.process_incoming_message(message)
  File "/home/justin/.virtualenvs/archimedes/lib/python3.4/site-packages/django_mailbox-4.4.6-py3.4.egg/django_mailbox/models.py", line 259, in process_incoming_message
    msg = self._process_message(message)
  File "/home/justin/.virtualenvs/archimedes/lib/python3.4/site-packages/django_mailbox-4.4.6-py3.4.egg/django_mailbox/models.py", line 365, in _process_message
    msg.eml.save('%s.eml' % uuid.uuid4(), ContentFile(message), save=False)
  File "/home/justin/.virtualenvs/archimedes/lib/python3.4/site-packages/django/core/files/base.py", line 158, in __init__
    super(ContentFile, self).__init__(stream_class(content), name=name)
TypeError: 'Message' does not support the buffer interface

From what I can tell, this happens when converting a Message to a ContentFile. I can reproduce the error like this:

$ ./manage.py shell
>>> from django_mailbox.models import Message
>>> from django.core.files.base import ContentFile
>>> m = Message()
>>> ContentFile(m)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/justin/.virtualenvs/archimedes/lib/python3.4/site-packages/django/core/files/base.py", line 158, in __init__
    super(ContentFile, self).__init__(stream_class(content), name=name)
TypeError: 'Message' does not support the buffer interface

I'm using Python 3.4.3 on Ubuntu, with Django 1.8.11

Thanks

command: UID => got more than 10000 bytes

When there are too many messages in the Gmail inbox I'm checking (for instance, when Django Mailbox is fetching mail for the first time), I get the error "UID => got more than 10000 bytes." Here is the traceback:

Traceback:

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/imaplib.py" in _command_complete
  957.             typ, data = self._get_tagged_response(tag)

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/imaplib.py" in _get_tagged_response
  1077.                 self._get_response()

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/imaplib.py" in _get_response
  985.         resp = self._get_line()

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/imaplib.py" in _get_line
  1087.         line = self.readline()

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/imaplib.py" in readline
  270.             raise self.error("got more than %d bytes" % _MAXLINE)

During handling of the above exception (got more than 10000 bytes), another exception occurred:

File "/Users/lhadjchikh/Documents/socialops/virtualenv/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
  149.                     response = self.process_exception_by_middleware(e, request)

File "/Users/lhadjchikh/Documents/socialops/virtualenv/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
  147.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/lhadjchikh/Documents/socialops/virtualenv/lib/python3.4/site-packages/django/contrib/admin/options.py" in wrapper
  541.                 return self.admin_site.admin_view(view)(*args, **kwargs)

File "/Users/lhadjchikh/Documents/socialops/virtualenv/lib/python3.4/site-packages/django/utils/decorators.py" in _wrapped_view
  149.                     response = view_func(request, *args, **kwargs)

File "/Users/lhadjchikh/Documents/socialops/virtualenv/lib/python3.4/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  57.         response = view_func(request, *args, **kwargs)

File "/Users/lhadjchikh/Documents/socialops/virtualenv/lib/python3.4/site-packages/django/contrib/admin/sites.py" in inner
  244.             return view(request, *args, **kwargs)

File "/Users/lhadjchikh/Documents/socialops/virtualenv/lib/python3.4/site-packages/django/utils/decorators.py" in _wrapper
  67.             return bound_func(*args, **kwargs)

File "/Users/lhadjchikh/Documents/socialops/virtualenv/lib/python3.4/site-packages/django/utils/decorators.py" in _wrapped_view
  149.                     response = view_func(request, *args, **kwargs)

File "/Users/lhadjchikh/Documents/socialops/virtualenv/lib/python3.4/site-packages/django/utils/decorators.py" in bound_func
  63.                 return func.__get__(self, type(self))(*args2, **kwargs2)

File "/Users/lhadjchikh/Documents/socialops/virtualenv/lib/python3.4/site-packages/django/contrib/admin/options.py" in changelist_view
  1510.                 response = self.response_action(request, queryset=cl.get_queryset(request))

File "/Users/lhadjchikh/Documents/socialops/virtualenv/lib/python3.4/site-packages/django/contrib/admin/options.py" in response_action
  1245.             response = func(self, request, queryset)

File "/Users/lhadjchikh/Documents/socialops/virtualenv/lib/python3.4/site-packages/django_mailbox/admin.py" in get_new_mail
  25.         mailbox.get_new_mail()

File "/Users/lhadjchikh/Documents/socialops/virtualenv/lib/python3.4/site-packages/django_mailbox/models.py" in get_new_mail
  396.         for message in connection.get_message(condition):

File "/Users/lhadjchikh/Documents/socialops/virtualenv/lib/python3.4/site-packages/django_mailbox/transports/imap.py" in get_message
  86.         message_ids = self._get_all_message_ids()

File "/Users/lhadjchikh/Documents/socialops/virtualenv/lib/python3.4/site-packages/django_mailbox/transports/imap.py" in _get_all_message_ids
  50.         response, message_ids = self.server.uid('search', None, 'ALL')

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/imaplib.py" in uid
  817.         typ, dat = self._simple_command(name, command, *args)

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/imaplib.py" in _simple_command
  1134.         return self._command_complete(name, self._command(name, *args))

File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/imaplib.py" in _command_complete
  961.             raise self.error('command: %s => %s' % (name, val))

Exception Type: error at /admin/django_mailbox/mailbox/
Exception Value: command: UID => got more than 10000 bytes

I've tried a solution suggested elsewhere (http://stackoverflow.com/questions/25457441/reading-emails-with-imaplib-got-more-than-10000-bytes-error) by adding these lines to the django_mailbox.transports.imap module:

import imaplib
imaplib._MAXLINE = 262144

This seemed to resolve the issue. It looks like there is a patch for this in Python 3.5 (http://bugs.python.org/issue23647), but would it be possible to fix this in Django Mailbox?

Thanks for taking a look!

Q: How to send email?

@coddingtonbear --

how would you go about sending mail through django-mailbox? I think I'd like to send certain messages through it so that I can assign them to a related object for easy access when replies come in, e.g. for comment notifications in order to enable replies from email.

Looks like there is some way to do it ('outgoing' and 'in reply to' fields exist), but I don't see how. Can you point me in the right direction?

Much appreciated!

Re-send incoming email

Is there an easy way to re-send received django_mailbox.models.Message or easily create django.core.mail.messageEmailMessage from your Message model ?

Message attachments are not always saved to disk

Hello,

Is it possible to save '.txt' attachments in a file, the same way as other attachments?
I tried to set DJANGO_MAILBOX_TEXT_STORED_MIMETYPES to 'text/html', but it makes also an attachment without filename from message body, and it is not what i want. Maybe i'am missing something?

Best regards,
baster33

How to download attachments from admin panel?

I got the attachment downloaded in mailbox_attachments folder in project root directory, but all the attachment links of kind http://127.0.0.1:8000/admin/django_mailbox/message/349/mailbox_attachments/2016/01/10/file.pdf/ are unavailable with error
message object with primary key 'path_to_file' does not exist.
raised by django.contrib.admin.options.change_view

How to fix it?

imap folders

Hi!
At this time i suppose there is no way to fetch mail from imap folders (other than Inbox) f.eg from
imap://user:[email protected]/Selected
Do you have any plans to add such functionality in django-mailbox?

Imap, get_message: TypeError: 'NoneType' object is not subscriptable

Sometimes, i'm get this error:

Traceback (most recent call last):
  File "/srv/eva/usermonitor-ng/src/usermonitor/reports/tasks.py", line 19, in update_emails
    mb.get_new_mail()
  File "/srv/eva/usermonitor-ng/env/lib/python3.4/site-packages/django_mailbox/models.py", line 373, in get_new_mail
    for message in connection.get_message():
  File "/srv/eva/usermonitor-ng/env/lib/python3.4/site-packages/django_mailbox/transports/imap.py", line 106, in get_message
    message = self.get_email_from_bytes(msg_contents[0][1])
TypeError: 'NoneType' object is not subscriptable

Error floating. After repeat task, allright. After repeat income signal, email parsed normaly.

How to replay email as mailbox owner?

I'd like to compose a new email but not being sent by the email setup in my server., but as the owner of the mailbox. Can this be done through POP3?

Work on develop branch

Hello,

I am would like ask to work on "develop" branch. It is confusing to see master branch fail. For example I can't verify my pull requests due of that.

If you have own develop branch you can have this flow:

  1. do work on develop - git checkout develop && git commit -m "foo bar"
  2. merge pull request to master eg. by web GH interface
  3. do work on develop branch - git checkout develop && git commit -m "foo bar"
  4. get code from pull requests to develop branch - git checkout develop && git merge master
  5. done feature
  6. merge to master - git checkout master && git merge develop

I don't think using pull requests by you is necessary, but use own branch will be very nice.

Missing migration

The migrations are not up to date with the models. After installing django_mailbox in my project, the next time I ran makemigrations the following migration was generated for django_mailbox:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

    dependencies = [
    ('django_mailbox', '0003_auto_20150409_0316'),
    ]

    operations = [
    migrations.AlterField(
        model_name='message',
        name='eml',
        field=models.FileField(help_text='Original full content of message', null=True, upload_to='messages', verbose_name='Raw message contents'),
    ),
    migrations.AlterField(
        model_name='messageattachment',
        name='document',
        field=models.FileField(verbose_name='Document', upload_to='mailbox_attachments/%Y/%m/%d/'),
    ),
    ]

UnicodeEncodeError 'ascii' codec can't encode character u'\xa0' ...

Assuming that receive this message from an API:

data = {u'text_flowed': False, u'from_name': u'Lake Wenatchee Info',  
  u'raw_msg': u'Received: from bosmailout09.eigbox.net (unknown [66.96.190.9])\n\tby relay-2.us-west-2.relay-prod (Postfix) with ESMTPS id 04E0A60953\n\tfor <[email protected]>; Thu, 25 Feb 2016 09:37:47 +0000 (UTC)\nReceived: from bosmailscan09.eigbox.net ([10.20.15.9])\n\tby bosmailout09.eigbox.net with esmtp (Exim)\n\tid 1aYsMk-0000Wo-AA\n\tfor [email protected]; Thu, 25 Feb 2016 04:37:46 -0500\nReceived: from [10.115.3.11] (helo=smtp.maileig.com)\n\tby bosmailscan09.eigbox.net with esmtp (Exim)\n\tid 1aYsMk-0000Ex-20\n\tfor [email protected]; Thu, 25 Feb 2016 04:37:46 -0500\nReceived: from mail-lb0-f178.google.com ([209.85.217.178])\n\tby bosimpinc11 with bizsmtp\n\tid NZdj1s0223rXcbV01ZdlKV; Thu, 25 Feb 2016 04:37:46 -0500\nX-EN-OrigIP: 209.85.217.178\nX-EN-IMPSID: NZdj1s0223rXcbV01ZdlKV\nReceived: by mail-lb0-f178.google.com with SMTP id bc4so25601373lbc.2\n for <[email protected]>; Thu, 25 Feb 2016 01:37:45 -0800 (PST)\nX-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20130820;\n h=x-gm-message-state:delivered-to:dkim-signature:from:reply-to:sender\n :to:date:subject:list-unsubscribe:keywords:feedback-id:mime-version\n :content-type:message-id;\n bh=zr4kzICC8mfzxSgnoe+58iXom96MdpWe8Q7G/EXg2/A=;\n b=QjLpVO7AqWFmaXtxh+g9PO9Q3VUIoVo+b9PN5JDYCXUYtVijM1qfcHDKR6G/5e+O46\n sZcOW/taOG5tgs2MlLKPIzgk2X5LHYAswJREsD0GQ91O5LGzffUvd8IxcGxIrAoXkUSd\n Xupqv1d7Tj7M8TuwghZp8RM8itTf8pa2PCSMkmIsPK02dA7V30X9hL9xWlvp2EPsaJJ/\n /hv63OYGp5XJF4A2YbFokpGtzyb+bg89xtT+SNyEDF2xAs3Lw8KkPI0NJwq9nXnB/noS\n jAigVL718UzwBakUSghGTIqGQh6PRJYQXsp8KQpQ7dTEujm5zCw/rfgsqdpEmEuBQzX9\n VIRw==\nX-Gm-Message-State: AG10YOSZe0Hopx8NAVVNMCfoFIkQP4BUdAsCDPiVk63IYC8BgNTa5hMVwcMKcsj07HMrvEYa4hfcPizwNtkKSiWcxOTe5cI=\nX-Received: by 10.112.132.36 with SMTP id or4mr16099031lbb.50.1456393062925;\n Thu, 25 Feb 2016 01:37:42 -0800 (PST)\nX-Forwarded-To: [email protected]\nX-Forwarded-For: [email protected] [email protected]\nDelivered-To: [email protected]\nReceived: by 10.114.4.166 with SMTP id l6csp118743ldl;\n Thu, 25 Feb 2016 01:37:41 -0800 (PST)\nX-Received: by 10.107.164.212 with SMTP id d81mr2297952ioj.169.1456393061104;\n Thu, 25 Feb 2016 01:37:41 -0800 (PST)\nReceived: from mail00.feedblitz.com (mail00.feedblitz.com. [74.208.222.161])\n by mx.google.com with ESMTP id p128si9234723iop.87.2016.02.25.01.37.40\n for <[email protected]>;\n Thu, 25 Feb 2016 01:37:41 -0800 (PST)\nReceived-SPF: pass (google.com: domain of [email protected] designates 74.208.222.161 as permitted sender) client-ip=74.208.222.161;\nAuthentication-Results: mx.google.com;\n spf=pass (google.com: domain of [email protected] designates 74.208.222.161 as permitted sender) [email protected];\n dkim=pass [email protected]\nReceived: from mail00.feedblitz.com ([127.0.0.1]) by mail00.feedblitz.com with Microsoft SMTPSVC(7.5.7601.17514);\n\t Thu, 25 Feb 2016 04:35:30 -0500\nDKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed;\n\td=mail.feedblitz.com; s=mdaemon; [email protected];\n\tq=dns/txt; h=From:Reply-To:Sender:To:Date:Subject:\n\tList-Unsubscribe:Keywords:Feedback-ID:MIME-Version:Content-Type;\n\tbh=lVqV/bRcvEzm++/XN5KLUl0hYTE=; b=YFEbYeYJZimkvB0OmEd6p9TaZNtVn\n\tDB4DkTla8aq4lgHCXpjbA1Z/7BaDRaMlp8kDYWmtMHGlY7gI3kRvEsxDppIKyeDb\n\tgQlgjTWQ2o04NA5JkkKZcn3oYlAeSzYjiQNWbrjK9unZMqNi5BIypy28hH7l2oB/\n\t3ONgMrAOzzIiTU=\nFrom: "Lake Wenatchee Info" <[email protected]>\nReply-To: "Lake Wenatchee Info" <[email protected]>\nSender: FeedBlitz <[email protected]>\nTo: example <[email protected]>\nDate: Thu, 25 Feb 2016 04:35:30 -0500\nSubject: Community meeting; Dealing with dementia\nX-Mailer: FeedBlitz\nList-Unsubscribe:\n\t<mailto:[email protected]?subject=unsubscribe%[email protected]&body=remove%[email protected]%[email protected]>\nKeywords: Announcements\nX-campaignid: feedblitz_5118572_217585_20160225\nFeedback-ID: 5118572_217585:217585:news:FeedBlitz\nX-fbzpid: 20972\nMIME-Version: 1.0\nContent-Type: multipart/alternative;\n\tcharset="UTF-8";\n\tboundary="f33dBL1tz_mIME_pART_bOUNDARY==38710045==v1_"\nMessage-ID: <[email protected]>\nX-OriginalArrivalTime: 25 Feb 2016 09:35:30.0845 (UTC) FILETIME=[DE354CD0:01D16FAF]\n\nThis is a multi-part message in MIME format [email protected]\n\n--f33dBL1tz_mIME_pART_bOUNDARY==38710045==v1_\nContent-Type: text/plain; charset="UTF-8"\nContent-Transfer-Encoding: base64\n\nSGVyZSBhcmUgdGhlIExha2UgV2VudGFjaGVlIEluZm8gZW1haWwgdXBkYXRlcyBmb3IgLSBi\ncnVubmVyc2xvZGdlQGdtYWlsLmNvbQ0KDQotIENvbW11bml0eSBtZWV0aW5nOyBEZWFsaW5n\nIHdpdGggZGVtZW50aWENCi0gTW9yZSBSZWNlbnQgQXJ0aWNsZXMNCi0gU2VhcmNoIExha2Ug\nV2VuYXRjaGVlIEluZm8NCg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f\nX19fX19fX19fX19fX19fX19fX18NCg0KKiogQ29tbXVuaXR5IG1lZXRpbmc7IERlYWxpbmcg\nd2l0aCBkZW1lbnRpYSAtIGh0dHA6Ly9wLmZlZWRibGl0ei5jb20vcjMuYXNwP2w9NDkwNTIw\nNjYmZj0yMTc1ODUmdT0zODcxMDA0NSZjPTUxMTg1NzINCg0KUHJlY2VkaW5nIHRoZSByZWd1\nbGFyIG1lZXRpbmcgb2YgdGhlIExha2UgV2VuYXRjaGVlIEZpcmUgJiBSZXNjdWUgQXV4aWxp\nYXJ5wqBvbiBXZWRuZXNkYXksIE1hcmNoIDJuZCwgdGhlcmUgd2lsbCBiZSBhIHNwZWNpYWwg\nMSBob3VyIGluZm9ybWF0aXZlwqBwcm9ncmFtLCBvcGVuIHRvIHRoZSBwdWJsaWMswqBvbiBk\nZWFsaW5nIHdpdGggZGVtZW50aWE7wqBsZWFybmluZ8Kgd2hhdMKgZGVtZW50aWEgaXMsIGhv\ndyB0byBpZGVudGlmeSBpdCwgYW5kIGRlYWxpbmcgd2l0aCBwYXRpZW50cyB0aGF0IGhhdmUg\nZGVtZW50aWEuwqAgVGhlIGluc3RydWN0b3IgaXMgQ2FyeSBVbHJpY2gswqAgYSBwaG90b2dy\nYXBoZXIgd2l0aCBDaGVsYW4gQ291bnR5IEZpcmUgRGlzdHJpY3QgMSBpbiBXZW5hdGNoZWUu\nwqBDYXJ5IGhhcyBoYWQgdGhlIGRpZmZpY3VsdCByZWFsIGxpZmUgZXhwZXJpZW5jZSBvZiBi\nZWluZyB0aGUgc29sZSBjYXJlZ2l2ZXIgdG8gaGlzIHdpZmUgZm9yIG92ZXIgMyB5ZWFycyBh\ncyB0aGV5IGRlYWx0IHdpdGggQWx6aGVpbWVyJ3MuwqAgSGUgaGFzIHJlc2VhcmNoZWQgYW5k\nIHN0dWRpZWQgdGhlIHRvcGljIGV4dGVuc2l2ZWx5IGFuZCBoYXMgYmVlbiBnaXZpbmcgdGhp\ncyBwcmVzZW50YXRpb24gdGhyb3VnaG91dCBDaGVsYW4gQ291bnR5LsKgIFdoaWxlIHRoaXMg\ndG9waWMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIGZpcnN0IHJlc3BvbmRlcnMgaW4g\naG93IHRvIHJlY29nbml6ZSBhbmQgY2FyZSBmb3IgcGF0aWVudHMgd2l0aCB0aGlzIGNvbmRp\ndGlvbiwgdGhlcmUgYXJlIG1hbnkgb2YgdXMgdGhhdCBoYXZlIHdpdG5lc3NlZCB0aGlzIGlu\nIG91ciBwZXJzb25hbCBsaXZlcyBhbmQgd2VyZSB1bnByZXBhcmVkIGZvciBob3cgdG8gaGFu\nZGxlIHRoZSBzaXR1YXRpb24uwqAgUGxlYXNlIGpvaW4gdXPCoGZvciB0aGlzIHByZXNlbnRh\ndGlvbiBhdCA2OjMwIFBNIFdlZG5lc2RheSwgTWFyY2ggMm5kLCBhdCB0aGXCoFBvbmRlcm9z\nYSBjbHViaG91c2UgaW4gUG9uZGVyb3NhLg0KDQpUbyBnZXQgdGhlcmU6IEZyb20gUGxhaW4g\nSGFyZHdhcmUvUGxhaW4gR3JvY2VyeSBjb250aW51ZSBzdHJhaWdodCBTb3V0aCBvbiBDYW1w\nIDEyIFJvYWQgMS41IG1pbGVzLCB0aGVuIHR1cm4gcmlnaHQgb24gQ29sdCBSb2FkIHdoaWNo\nIGlzIG9uZS13YXkgZ29pbmcgZG93bmhpbGwuIEF0IHRoZSBib3R0b20gb2YgdGhlIGhpbGwg\ndHVybiByaWdodCBvbiBTdGlycnVwIFN0cmVldC4gUXVhcnRlciBSb2FkIGlzIG9uIHlvdXIg\nbGVmdCBidXQgZ28gb25lIGJsb2NrIGZ1cnRoZXIgYW5kIHR1cm4gbGVmdCBvbiBNb3JnYW4g\nd2hpY2ggbWF5IG9yIG1heSBub3QgaGF2ZSBhIHNpZ24gYnV0IGhhcyBhIGxhcmdlIGdyZWVu\nIGhvdXNlIG9uIHRoZSBjb3JuZXIuIFRha2UgdGhlIGZpcnN0IGxlZnQgb2ZmIE1vcmdhbiB3\naGljaCBpcyBDYXl1c2UsIHBhc3MgdGhlIGZpcmUgc3RhdGlvbiBvbiB0aGUgbGVmdCB0byB0\naGUgY2x1YmhvdXNlIG9uIHlvdXIgbGVmdCBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlZXQuDQoN\nCuKAoiBFbWFpbCB0byBhIGZyaWVuZCDigKIgQXJ0aWNsZSBTZWFyY2ggLSBodHRwOi8vd3d3\nLmZlZWRibGl0ei5jb20vZi9mLmZiej9TZWFyY2g9MjE3NTg1OzMwMTIxNDY7QW5ub3VuY2Vt\nZW50cztDb21tdW5pdHkgbWVldGluZzsgRGVhbGluZyB3aXRoIGRlbWVudGlhOzUxMTg1NzIg\n4oCiIFZpZXcgY29tbWVudHMgLSBodHRwOi8vd3d3Lmxha2V3ZW5hdGNoZWVpbmZvLmNvbS9j\nb21tdW5pdHktbWVldGluZy1kZWFsaW5nLXdpdGgtZGVtZW50aWEvI2NvbW1lbnRzIOKAoiBU\ncmFjayBjb21tZW50cyAtIGh0dHA6Ly93d3cuZmVlZGJsaXR6LmNvbS9mL2YuZmJ6P1RyYWNr\nPWh0dHAlM2ElMmYlMmZ3d3cubGFrZXdlbmF0Y2hlZWluZm8uY29tJTJmY29tbXVuaXR5LW1l\nZXRpbmctZGVhbGluZy13aXRoLWRlbWVudGlhJTJmZmVlZCUyZmF0b20lMmYmcmVmPWNvbW1l\nbnQ6MjE3NTg1IOKAog0KDQoqIE1vcmUgUmVjZW50IEFydGljbGVzIC0gaHR0cDovL3d3dy5m\nZWVkYmxpdHouY29tL2YvZi5mYno/Z290bz0yMTc1ODUNCg0KLSBCZWF2ZXIgVmFsbGV5IFNj\naG9vbCBCcmFpbnN0b3JtaW5nIFRpbWUgV2VkbmVzZGF5IEZlYiAyNHRoDQotIEZSRUUgU21v\na2UgRGV0ZWN0b3IgSW5zcGVjdGlvbnMgJiBSZXBsYWNlbWVudHMNCi0gQW5udWFsIE1vb3Nl\nIERld2xhcCBob3N0ZWQgYnkgVGhlIExlYXZlbndvcnRoIFdpbnRlciBTcG9ydHMgQ2x1Yg0K\nLSBGaXJld2lzZSBNZWV0aW5nDQotIFJFUFVCTElDQU4gQU5EIERFTU9DUkFUIENBVUNVU0VT\nDQoNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f\nX19fX19fDQpDbGljayBoZXJlIHRvIHNhZmVseSB1bnN1YnNjcmliZSBmcm9tICJMYWtlIFdl\nbmF0Y2hlZSBJbmZvLiINCg0KIC0gaHR0cDovL3d3dy5mZWVkYmxpdHouY29tL2YvZi5mYno/\nRW1haWxSZW1vdmU9XzM4NzEwMDQ1JTdjMjE3NTg1JTdjZWNlNGYyZjI5YjRkMzkyMGFmMTgw\nZTdkOWUzYWExNGElN2M1MTE4NTcyXyBDbGljayBoZXJlIHRvIHZpZXcgbWFpbGluZyBhcmNo\naXZlcywgaGVyZSB0byBjaGFuZ2UgeW91ciBwcmVmZXJlbmNlcywgb3IgaGVyZSB0byBzdWJz\nY3JpYmUglSBQcml2YWN5DQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f\nX19fX19fX19fX19fX19fX19fXw0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f\nX19fX19fX19fX19fX19fX19fX19fX18=\n\n--f33dBL1tz_mIME_pART_bOUNDARY==38710045==v1_\nContent-Type: text/html; charset="UTF-8"\nContent-Transfer-Encoding: base64\n\nPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9F\nTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQi\nPg0KPGh0bWw+DQoJPGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250\nZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjxsaW5rIGhyZWY9Imh0dHA6Ly9hc3Nl\ndHMuZmVlZGJsaXR6LmNvbS9mYjRzdHlsZXMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9\nInRleHQvY3NzIj48bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNl\nLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCIvPg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj5i\nb2R5e21hcmdpbjogMWVtIDFlbSAxZW0gMWVtO2xpbmUtaGVpZ2h0OjEuM2VtO30gcHttYXJn\naW46IDFlbSAwZW0gMWVtIDBlbTtsaW5lLWhlaWdodDoxLjNlbTt9IHVsLG9sLGxpe2xpbmUt\naGVpZ2h0OjEuM2VtO30gaW1ne2JvcmRlcjowOy1tcy1pbnRlcnBvbGF0aW9uLW1vZGU6IGJp\nY3ViaWM7b3V0bGluZTpub25lO30gdGFibGUgdGQge2JvcmRlci1jb2xsYXBzZTogY29sbGFw\nc2U7fQ0KIEBtZWRpYSBzY3JlZW4ge2ltZyB7IG1heC13aWR0aDoxMDAlICFpbXBvcnRhbnQ7\naGVpZ2h0OmF1dG8gIWltcG9ydGFudDt9IH0NCiAgLmFsaWducmlnaHQge2Zsb2F0OnJpZ2h0\nO3BhZGRpbmctbGVmdDoxMHB4O30gLmFsaWdubGVmdCB7ZmxvYXQ6bGVmdDtwYWRkaW5nLXJp\nZ2h0OjEwcHg7fSAgLnJpZ2h0IHtmbG9hdDpyaWdodDtwYWRkaW5nLWxlZnQ6MTBweDt9IC5s\nZWZ0IHtmbG9hdDpsZWZ0O3BhZGRpbmctcmlnaHQ6MTBweDt9IC5hbGlnbmNlbnRlciB7ZGlz\ncGxheTogYmxvY2s7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0bzt0ZXh0LWFs\naWduOmNlbnRlcjt9IC53cC1jYXB0aW9uIHtmb250LXN0eWxlOml0YWxpYzt0ZXh0LWFsaWdu\nOmNlbnRlcjt9IC53cC1jYXB0aW9uLXRleHQge2ZvbnQtc3R5bGU6aXRhbGljO3RleHQtYWxp\nZ246Y2VudGVyO30gYm9keSB7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OjEwMCU7IC1tcy10\nZXh0LXNpemUtYWRqdXN0OjEwMCU7fTwvc3R5bGU+DQoJCTx0aXRsZT5MYWtlIFdlbmF0Y2hl\nZSBJbmZvPC90aXRsZT4NCgkJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCmgxIHsgCWNvbG9y\nOiMzRjRBNTA7IAlmb250LWZhbWlseTogVHJlYnVjaGV0IE1TLCBBcmlhbCwgSGVsdmV0aWNh\nLCBzYW5zLXNlcmlmOyAJZm9udC1zaXplOiAyMjAlOyAJZm9udC13ZWlnaHQ6Ym9sZDsgCWNs\nZWFyOmxlZnQ7IH0gaDIgeyAJY29sb3I6IzRBNjI3OTsgCWZvbnQtZmFtaWx5OiBUcmVidWNo\nZXQgTVMsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IAlmb250LXNpemU6IDE1MCU7\nIAlmb250LXdlaWdodDpib2xkOyAJY2xlYXI6bGVmdDsgfSBoMyB7IAljb2xvcjojNEE2Mjc5\nOyAJZm9udC1mYW1pbHk6IFRyZWJ1Y2hldCBNUywgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1z\nZXJpZjsgCWZvbnQtc2l6ZTogMTIwJTsgCWZvbnQtd2VpZ2h0OmJvbGQ7IAljbGVhcjpsZWZ0\nOyB9IGJvZHkscCx0ZCxmb3JtLGlucHV0LHRleHRhcmVhLHNlbGVjdCB7IAljb2xvcjojM0Y0\nQTUwOyAJZm9udC1mYW1pbHk6IFRyZWJ1Y2hldCBNUywgQXJpYWwsIEhlbHZldGljYSwgc2Fu\ncy1zZXJpZjsgCWZvbnQtc2l6ZTogMTNweDsgfSBhIHsgCWNvbG9yOiMwMDAwMDA7IAlmb250\nLWZhbWlseTogVHJlYnVjaGV0IE1TLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyB9\nIGJsb2NrcXVvdGUgeyAJZm9udC1mYW1pbHk6IENvdXJpZXIgTmV3LCBDb3VyaWVyOyAJZm9u\ndC1zaXplOiAxMnB4OyB9IGE6aG92ZXIgeyAJZm9udC1mYW1pbHk6IFRyZWJ1Y2hldCBNUywg\nQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgCWNvbG9yOiNGRjY2MDA7IH0gdGQubm9y\nbSB7IAliYWNrZ3JvdW5kLWNvbG9yOiNmOTYzMDA7IAljb2xvcjojMDAwMDAwOyAJYm9yZGVy\nOiAxcHggc29saWQgI2Y5NjMwMDsgfSB0ZC5ub3JtYm9keSB7IAlib3JkZXI6IDFweCBzb2xp\nZCAjZjk2MzAwOyB9IGltZyB7IGJvcmRlcjogbm9uZTt9CQk8L3N0eWxlPg0KCTwvaGVhZD4N\nCgk8Ym9keT4NCjxkaXYgd2lkdGg9IjEwMCUiIGhlaWdodD0iOCIgc3R5bGU9ImRpc3BsYXk6\nYmxvY2s7d2lkdGg6MTAwJTtoZWlnaHQ6OHB4O2JvcmRlcjowO21hcmdpbjowO2xpbmUtaGVp\nZ2h0OjhweDtmb250LXNpemU6OHB4OyI+77u/PGltZyBzcmM9Imh0dHBzOi8vcGlwcGlvLmNv\nbS9hcGkvc3luYz9waWQ9MTI5MCZpdD00Jml2PTBlY2Y1M2M5MDhlNGUyZGM4OGY3OTJhZDJh\nYjc5MDcxJml0PTQmaXY9YzFiMDE0NDEwNTI0ZTU0YmYzNWIwNDNiYzVjNzJhN2NhOWMyODk1\nMyZpdD00Jml2PWI3NDcyMWI5MWU0YjI4MTc5ODU1Y2I5M2MzNjM5MTI5NTQ1YzVlOTQ5MjU0\nZWVkY2JiOGI5ZTFjZDlhNTdiNjEiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGJvcmRlcj0iMCIg\nc3R5bGU9ImRpc3BsYXk6bm9uZTtvdmVyZmxvdzpoaWRkZW47Ii8+DQo8aW1nIHNyYz0iaHR0\ncHM6Ly9waXBwaW8uY29tL2FwaS9zeW5jP3BpZD0xMjkxJml0PTQmaXY9MGVjZjUzYzkwOGU0\nZTJkYzg4Zjc5MmFkMmFiNzkwNzEmaXQ9NCZpdj1jMWIwMTQ0MTA1MjRlNTRiZjM1YjA0M2Jj\nNWM3MmE3Y2E5YzI4OTUzJml0PTQmaXY9Yjc0NzIxYjkxZTRiMjgxNzk4NTVjYjkzYzM2Mzkx\nMjk1NDVjNWU5NDkyNTRlZWRjYmI4YjllMWNkOWE1N2I2MSIgd2lkdGg9IjEiIGhlaWdodD0i\nMSIgYm9yZGVyPSIwIiBzdHlsZT0iZGlzcGxheTpub25lO292ZXJmbG93OmhpZGRlbjsiLz4N\nCjxpbWcgc3JjPSJodHRwczovL3BpcHBpby5jb20vYXBpL3N5bmM/cGlkPTEyOTImaXQ9NCZp\ndj0wZWNmNTNjOTA4ZTRlMmRjODhmNzkyYWQyYWI3OTA3MSZpdD00Jml2PWMxYjAxNDQxMDUy\nNGU1NGJmMzViMDQzYmM1YzcyYTdjYTljMjg5NTMmaXQ9NCZpdj1iNzQ3MjFiOTFlNGIyODE3\nOTg1NWNiOTNjMzYzOTEyOTU0NWM1ZTk0OTI1NGVlZGNiYjhiOWUxY2Q5YTU3YjYxIiB3aWR0\naD0iMSIgaGVpZ2h0PSIxIiBib3JkZXI9IjAiIHN0eWxlPSJkaXNwbGF5Om5vbmU7b3ZlcmZs\nb3c6aGlkZGVuOyIvPg0KPGltZyBzcmM9Imh0dHBzOi8vcGlwcGlvLmNvbS9hcGkvc3luYz9w\naWQ9MTI5MyZpdD00Jml2PTBlY2Y1M2M5MDhlNGUyZGM4OGY3OTJhZDJhYjc5MDcxJml0PTQm\naXY9YzFiMDE0NDEwNTI0ZTU0YmYzNWIwNDNiYzVjNzJhN2NhOWMyODk1MyZpdD00Jml2PWI3\nNDcyMWI5MWU0YjI4MTc5ODU1Y2I5M2MzNjM5MTI5NTQ1YzVlOTQ5MjU0ZWVkY2JiOGI5ZTFj\nZDlhNTdiNjEiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGJvcmRlcj0iMCIgc3R5bGU9ImRpc3Bs\nYXk6bm9uZTtvdmVyZmxvdzpoaWRkZW47Ii8+DQo8aW1nIHNyYz0iaHR0cHM6Ly9waXBwaW8u\nY29tL2FwaS9zeW5jP3BpZD0xMjk0Jml0PTQmaXY9MGVjZjUzYzkwOGU0ZTJkYzg4Zjc5MmFk\nMmFiNzkwNzEmaXQ9NCZpdj1jMWIwMTQ0MTA1MjRlNTRiZjM1YjA0M2JjNWM3MmE3Y2E5YzI4\nOTUzJml0PTQmaXY9Yjc0NzIxYjkxZTRiMjgxNzk4NTVjYjkzYzM2MzkxMjk1NDVjNWU5NDky\nNTRlZWRjYmI4YjllMWNkOWE1N2I2MSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYm9yZGVyPSIw\nIiBzdHlsZT0iZGlzcGxheTpub25lO292ZXJmbG93OmhpZGRlbjsiLz4NCjxpbWcgc3JjPSJo\ndHRwczovL3BpcHBpby5jb20vYXBpL3N5bmM/cGlkPTEyOTUmaXQ9NCZpdj0wZWNmNTNjOTA4\nZTRlMmRjODhmNzkyYWQyYWI3OTA3MSZpdD00Jml2PWMxYjAxNDQxMDUyNGU1NGJmMzViMDQz\nYmM1YzcyYTdjYTljMjg5NTMmaXQ9NCZpdj1iNzQ3MjFiOTFlNGIyODE3OTg1NWNiOTNjMzYz\nOTEyOTU0NWM1ZTk0OTI1NGVlZGNiYjhiOWUxY2Q5YTU3YjYxIiB3aWR0aD0iMSIgaGVpZ2h0\nPSIxIiBib3JkZXI9IjAiIHN0eWxlPSJkaXNwbGF5Om5vbmU7b3ZlcmZsb3c6aGlkZGVuOyIv\nPg0KPGltZyBzcmM9Imh0dHBzOi8vcGlwcGlvLmNvbS9hcGkvc3luYz9waWQ9MTI5NiZpdD00\nJml2PTBlY2Y1M2M5MDhlNGUyZGM4OGY3OTJhZDJhYjc5MDcxJml0PTQmaXY9YzFiMDE0NDEw\nNTI0ZTU0YmYzNWIwNDNiYzVjNzJhN2NhOWMyODk1MyZpdD00Jml2PWI3NDcyMWI5MWU0YjI4\nMTc5ODU1Y2I5M2MzNjM5MTI5NTQ1YzVlOTQ5MjU0ZWVkY2JiOGI5ZTFjZDlhNTdiNjEiIHdp\nZHRoPSIxIiBoZWlnaHQ9IjEiIGJvcmRlcj0iMCIgc3R5bGU9ImRpc3BsYXk6bm9uZTtvdmVy\nZmxvdzpoaWRkZW47Ii8+DQo8aW1nIHNyYz0iaHR0cHM6Ly9waXBwaW8uY29tL2FwaS9zeW5j\nP3BpZD0xMjk3Jml0PTQmaXY9MGVjZjUzYzkwOGU0ZTJkYzg4Zjc5MmFkMmFiNzkwNzEmaXQ9\nNCZpdj1jMWIwMTQ0MTA1MjRlNTRiZjM1YjA0M2JjNWM3MmE3Y2E5YzI4OTUzJml0PTQmaXY9\nYjc0NzIxYjkxZTRiMjgxNzk4NTVjYjkzYzM2MzkxMjk1NDVjNWU5NDkyNTRlZWRjYmI4Yjll\nMWNkOWE1N2I2MSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYm9yZGVyPSIwIiBzdHlsZT0iZGlz\ncGxheTpub25lO292ZXJmbG93OmhpZGRlbjsiLz4NCjxpbWcgc3JjPSJodHRwczovL3BpcHBp\nby5jb20vYXBpL3N5bmM/cGlkPTEyOTgmaXQ9NCZpdj0wZWNmNTNjOTA4ZTRlMmRjODhmNzky\nYWQyYWI3OTA3MSZpdD00Jml2PWMxYjAxNDQxMDUyNGU1NGJmMzViMDQzYmM1YzcyYTdjYTlj\nMjg5NTMmaXQ9NCZpdj1iNzQ3MjFiOTFlNGIyODE3OTg1NWNiOTNjMzYzOTEyOTU0NWM1ZTk0\nOTI1NGVlZGNiYjhiOWUxY2Q5YTU3YjYxIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBib3JkZXI9\nIjAiIHN0eWxlPSJkaXNwbGF5Om5vbmU7b3ZlcmZsb3c6aGlkZGVuOyIvPg0KPGltZyBzcmM9\nImh0dHBzOi8vcGlwcGlvLmNvbS9hcGkvc3luYz9waWQ9MTI5OSZpdD00Jml2PTBlY2Y1M2M5\nMDhlNGUyZGM4OGY3OTJhZDJhYjc5MDcxJml0PTQmaXY9YzFiMDE0NDEwNTI0ZTU0YmYzNWIw\nNDNiYzVjNzJhN2NhOWMyODk1MyZpdD00Jml2PWI3NDcyMWI5MWU0YjI4MTc5ODU1Y2I5M2Mz\nNjM5MTI5NTQ1YzVlOTQ5MjU0ZWVkY2JiOGI5ZTFjZDlhNTdiNjEiIHdpZHRoPSIxIiBoZWln\naHQ9IjEiIGJvcmRlcj0iMCIgc3R5bGU9ImRpc3BsYXk6bm9uZTtvdmVyZmxvdzpoaWRkZW47\nIi8+DQo8aW1nIGJvcmRlcj0iMCIgd2lkdGg9IjIiIGhlaWdodD0iMiIgaHNwYWNlPSIwIiB2\nc3BhY2U9IjAiIHN0eWxlPSJ3aWR0aDoycHg7aGVpZ2h0OjJweDtwYWRkaW5nOjA7bWFyZ2lu\nOjA7b3ZlcmZsb3c6aGlkZGVuOyIgc3JjPSJodHRwOi8vdC5mZWVkYmxpdHouY29tLzM1MTU1\nMS5naWY/cz1jMWIwMTQ0MTA1MjRlNTRiZjM1YjA0M2JjNWM3MmE3Y2E5YzI4OTUzJm49MSI+\nDQogPGltZyB3aWR0aD0iOCIgaGVpZ2h0PSI4IiBoc3BhY2U9IjAiIHZzcGFjZT0iMCIgYm9y\nZGVyPSIwIiBzdHlsZT0id2lkdGg6OHB4O2hlaWdodDo4cHg7cGFkZGluZzowO21hcmdpbjow\nOyIgc3JjPSJodHRwOi8vcC5mZWVkYmxpdHouY29tL2xvZ29zLzUxMTg1NzIvMjE3NTg1LzM4\nNzEwMDQ1L2xvZ28uZ2lmIj48L2Rpdj4NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj5pbWcg\neyBtYXgtd2lkdGg6MTAwJSAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7fTwv\nc3R5bGU+DQoNCgkJPCEtLSBCZWdpbiAjY29udGVudCAtLT4NCgkJPGRpdiBhbGlnbj0iY2Vu\ndGVyIj4NCgkJCTxwPg0KCQkJCTxpbWcgYWx0PSIiIHNyYz0iaHR0cDovL3d3dy5sYWtld2Vu\nYXRjaGVlaW5mby5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTEvMDUvTGFrZVdlbi1Qcm9w\nLUVtYWlsLUhlYWRlci5wbmciIC8+PC9wPg0KCQkJPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBj\nZWxsc3BhY2luZz0iMCIgc3R5bGU9IndpZHRoOiA3MDhweDsgaGVpZ2h0OiA2NnB4Ij4NCgkJ\nCQk8dGJvZHk+DQoJCQkJCTx0cj4NCgkJCQkJCTx0ZD4NCgkJCQkJCQk8YnIgLz4NCgkJCQkJ\nCQk8cD4NCgkJCQkJCQkJSGVyZSBhcmUgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cubGFrZXdl\nbmF0Y2hlZWluZm8uY29tIj5MYWtlIFdlbnRhY2hlZSBJbmZvPC9hPiBlbWFpbCB1cGRhdGVz\nIGZvciA8c3Ryb25nPmJydW5uZXJzbG9kZ2VAZ21haWwuY29tPC9zdHJvbmc+PC9wPg0KCQkJ\nCQkJPC90ZD4NCgkJCQkJPC90cj4NCgkJCQk8L3Rib2R5Pg0KCQkJPC90YWJsZT4NCgkJPC9k\naXY+DQoJCTxwPjwvcD4NCgkJPGRpdiBhbGlnbj0iY2VudGVyIj4NCgkJCTx0YWJsZSBjZWxs\ncGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSI3MDgiPg0KCQkJCTx0Ym9keT4N\nCgkJCQkJPHRyPg0KCQkJCQkJPHRkPg0KCQkJCQkJCTwhLS0gQmVnaW4gLmhlYWRlciAtLT48\nYnIgLz4NCgkJCQkJCQk8dWw+DQoJCQkJCQkJCQ0KCQkJCQkJCQkJDQoJCQkJCQkJCTxsaT4N\nCgkJCQkJCQkJCTxhIGhyZWY9IiMwIj5Db21tdW5pdHkgbWVldGluZzsgRGVhbGluZyB3aXRo\nIGRlbWVudGlhPC9hPg0KDQoJCQkJCQkJCTxsaT4NCgkJCQkJCQkJCTxhIGhyZWY9IiMyMTc1\nODVfcmVjYXAiPk1vcmUgUmVjZW50IEFydGljbGVzPC9hPg0KDQoJCQkJCQkJCTxsaT4NCgkJ\nCQkJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuZmVlZGJsaXR6LmNvbS9mLz9TZWFyY2g9MjE3\nNTg1Ij5TZWFyY2ggTGFrZSBXZW5hdGNoZWUgSW5mbzwvYT4NCg0KCQkJCQkJCTwvdWw+DQoJ\nCQkJCQkJDQoJCQkJCQkJPGhyIC8+DQoJCQkJCQkJPGgyIGNsYXNzPSJkYXRlLWhlYWRlciI+\nDQoJCQkJCQkJCTxhIHJlbD0iTk9GT0xMT1ciIGhyZWY9J2h0dHA6Ly9wLmZlZWRibGl0ei5j\nb20vcjMuYXNwP2w9MTE0MTAwNzg3JmY9MjE3NTg1JmM9NTExODU3Mic+Q29tbXVuaXR5IG1l\nZXRpbmc7IERlYWxpbmcgd2l0aCBkZW1lbnRpYTwvYT48YnI+PC9oMj4NCgkJCQkJCQk8cD48\nIS0tIGJydW5uZXJzbG9kZ2VAZ21haWwuY29tIC0tPjxhIGlkPSIwIiBuYW1lPSIwIj48L2E+\nPCEtLSBCZWdpbiAucG9zdCAtLT48L3A+DQoJCQkJCQkJPHA+DQoJCQkJCQkJCSZuYnNwOzwv\ncD4NCgkJCQkJCQkNCgkJCQkJCQk8ZGl2Pg0KCQkJCQkJCQk8cD4NCgkJCQkJCQkJCTxwPjxp\nbWcgY2xhc3M9ImFsaWdubGVmdCBzaXplLWZ1bGwgd3AtaW1hZ2UtMjg0MDciIHNyYz0iaHR0\ncDovL3d3dy5sYWtld2VuYXRjaGVlaW5mby5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTYv\nMDIvRGVtZW50aWEuanBnIiBhbHQ9IkRlbWVudGlhIiB3aWR0aD0iMjIwIiB4aGVpZ2h0PSIy\nMjMiICBhbGlnbj0ibGVmdCIgaHNwYWNlPSI4IiBzdHlsZT0iZmxvYXQ6bGVmdDttYXJnaW4t\nbGVmdDowOyIvPjwvcD4KPHA+UHJlY2VkaW5nIHRoZSByZWd1bGFyIG1lZXRpbmcgb2YgdGhl\nIExha2UgV2VuYXRjaGVlIEZpcmUgJmFtcDsgUmVzY3VlIEF1eGlsaWFyecKgb24gV2VkbmVz\nZGF5LCBNYXJjaCAybmQsIHRoZXJlIHdpbGwgYmUgYSBzcGVjaWFsIDEgaG91ciBpbmZvcm1h\ndGl2ZcKgcHJvZ3JhbSwgb3BlbiB0byB0aGUgcHVibGljLMKgb24gZGVhbGluZyB3aXRoIGRl\nbWVudGlhO8KgbGVhcm5pbmfCoHdoYXTCoGRlbWVudGlhIGlzLCBob3cgdG8gaWRlbnRpZnkg\naXQsIGFuZCBkZWFsaW5nIHdpdGggcGF0aWVudHMgdGhhdCBoYXZlIGRlbWVudGlhLsKgIFRo\nZSBpbnN0cnVjdG9yIGlzIENhcnkgVWxyaWNoLMKgIGEgcGhvdG9ncmFwaGVyIHdpdGggQ2hl\nbGFuIENvdW50eSBGaXJlIERpc3RyaWN0IDEgaW4gV2VuYXRjaGVlLsKgQ2FyeSBoYXMgaGFk\nIHRoZSBkaWZmaWN1bHQgcmVhbCBsaWZlIGV4cGVyaWVuY2Ugb2YgYmVpbmcgdGhlIHNvbGUg\nY2FyZWdpdmVyIHRvIGhpcyB3aWZlIGZvciBvdmVyIDMgeWVhcnMgYXMgdGhleSBkZWFsdCB3\naXRoIEFsemhlaW1lciYjODIxNztzLsKgIEhlIGhhcyByZXNlYXJjaGVkIGFuZCBzdHVkaWVk\nIHRoZSB0b3BpYyBleHRlbnNpdmVseSBhbmQgaGFzIGJlZW4gZ2l2aW5nIHRoaXMgcHJlc2Vu\ndGF0aW9uIHRocm91Z2hvdXQgQ2hlbGFuIENvdW50eS7CoCBXaGlsZSB0aGlzIHRvcGljIGlz\nIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciBmaXJzdCByZXNwb25kZXJzIGluIGhvdyB0byBy\nZWNvZ25pemUgYW5kIGNhcmUgZm9yIHBhdGllbnRzIHdpdGggdGhpcyBjb25kaXRpb24sIHRo\nZXJlIGFyZSBtYW55IG9mIHVzIHRoYXQgaGF2ZSB3aXRuZXNzZWQgdGhpcyBpbiBvdXIgcGVy\nc29uYWwgbGl2ZXMgYW5kIHdlcmUgdW5wcmVwYXJlZCBmb3IgaG93IHRvIGhhbmRsZSB0aGUg\nc2l0dWF0aW9uLsKgIFBsZWFzZSBqb2luIHVzwqBmb3IgdGhpcyBwcmVzZW50YXRpb24gYXQg\nNjozMCBQTSBXZWRuZXNkYXksIE1hcmNoIDJuZCwgYXQgdGhlwqBQb25kZXJvc2EgY2x1Ymhv\ndXNlIGluIFBvbmRlcm9zYS48L3A+CjxwPlRvIGdldCB0aGVyZTogRnJvbSBQbGFpbiBIYXJk\nd2FyZS9QbGFpbiBHcm9jZXJ5IGNvbnRpbnVlIHN0cmFpZ2h0IFNvdXRoIG9uIENhbXAgMTIg\nUm9hZCAxLjUgbWlsZXMsIHRoZW4gdHVybiByaWdodCBvbiBDb2x0IFJvYWQgd2hpY2ggaXMg\nb25lLXdheSBnb2luZyBkb3duaGlsbC4gQXQgdGhlIGJvdHRvbSBvZiB0aGUgaGlsbCB0dXJu\nIHJpZ2h0IG9uIFN0aXJydXAgU3RyZWV0LiBRdWFydGVyIFJvYWQgaXMgb24geW91ciBsZWZ0\nIGJ1dCBnbyBvbmUgYmxvY2sgZnVydGhlciBhbmQgdHVybiBsZWZ0IG9uIE1vcmdhbiB3aGlj\naCBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgc2lnbiBidXQgaGFzIGEgbGFyZ2UgZ3JlZW4gaG91\nc2Ugb24gdGhlIGNvcm5lci4gVGFrZSB0aGUgZmlyc3QgbGVmdCBvZmYgTW9yZ2FuIHdoaWNo\nIGlzIENheXVzZSwgcGFzcyB0aGUgZmlyZSBzdGF0aW9uIG9uIHRoZSBsZWZ0IHRvIHRoZSBj\nbHViaG91c2Ugb24geW91ciBsZWZ0IGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVldC48L3A+Cjxw\nPiZuYnNwOzwvcD4KPCEtLTwhW2VuZGlmXS0tPg0KPGRpdiBzdHlsZT0iY2xlYXI6Ym90aDtw\nYWRkaW5nLXRvcDowLjdlbTsiPjxhIHRpdGxlPSJTdWJzY3JpYmUgYnkgZW1haWwiIHJlbD0i\nTk9GT0xMT1ciIGhyZWY9Imh0dHA6Ly9wLmZlZWRibGl0ei5jb20vdDMuYXNwPy8yMTc1ODUv\nMzg3MTAwNDUvNTExODU3Ml8vZmVlZGJsaXR6LmNvbS9mP1RyYWNrPWh0dHA6Ly93d3cubGFr\nZXdlbmF0Y2hlZWluZm8uY29tLz9mZWVkPWF0b20mcHVibGlzaGVyPTI5NDA0NzgiPjxpbWcg\naGVpZ2h0PSIyMCIgc3JjPSJodHRwOi8vYXNzZXRzLmZlZWRibGl0ei5jb20vaS9lbWFpbDIw\nLnBuZyIgc3R5bGU9ImJvcmRlcjowO21hcmdpbjowO3BhZGRpbmc6MDsiPjwvYT4mIzE2MDs8\nYSB0aXRsZT0iTGlrZSBvbiBGYWNlYm9vayIgcmVsPSJOT0ZPTExPVyIgaHJlZj0iaHR0cDov\nL3AuZmVlZGJsaXR6LmNvbS90My5hc3A/LzIxNzU4NS8zODcxMDA0NS81MTE4NTcyXy9wLmZl\nZWRibGl0ei5jb20vZi5zaGFyZT9fLzI4LzExNDEwMDc4Ny9Db21tdW5pdHkrbWVldGluZyUz\nYitEZWFsaW5nK3dpdGgrZGVtZW50aWEiPjxpbWcgaGVpZ2h0PSIyMCIgc3JjPSJodHRwOi8v\nYXNzZXRzLmZlZWRibGl0ei5jb20vaS9mYmxpa2UyMC5wbmciIHN0eWxlPSJib3JkZXI6MDtt\nYXJnaW46MDtwYWRkaW5nOjA7Ij48L2E+JiMxNjA7PGEgdGl0bGU9IlNoYXJlIG9uIEdvb2ds\nZSsiIHJlbD0iTk9GT0xMT1ciIGhyZWY9Imh0dHA6Ly9wLmZlZWRibGl0ei5jb20vdDMuYXNw\nPy8yMTc1ODUvMzg3MTAwNDUvNTExODU3Ml8vcC5mZWVkYmxpdHouY29tL2Yuc2hhcmU/Xy8z\nMC8xMTQxMDA3ODcvQ29tbXVuaXR5K21lZXRpbmclM2IrRGVhbGluZyt3aXRoK2RlbWVudGlh\nIj48aW1nIGhlaWdodD0iMjAiIHNyYz0iaHR0cDovL2Fzc2V0cy5mZWVkYmxpdHouY29tL2kv\nZ29vZ2xlcGx1czIwLnBuZyIgc3R5bGU9ImJvcmRlcjowO21hcmdpbjowO3BhZGRpbmc6MDsi\nPjwvYT4mIzE2MDs8YSB0aXRsZT0iUGluIGl0ISIgcmVsPSJOT0ZPTExPVyIgaHJlZj0iaHR0\ncDovL3AuZmVlZGJsaXR6LmNvbS90My5hc3A/LzIxNzU4NS8zODcxMDA0NS81MTE4NTcyXy9w\nLmZlZWRibGl0ei5jb20vZi5zaGFyZT9fLzI5LzExNDEwMDc4Ny9Db21tdW5pdHkrbWVldGlu\nZyUzYitEZWFsaW5nK3dpdGgrZGVtZW50aWEsaHR0cCUzYSUyZiUyZnd3dy5sYWtld2VuYXRj\naGVlaW5mby5jb20lMmZ3cC1jb250ZW50JTJmdXBsb2FkcyUyZjIwMTYlMmYwMiUyZkRlbWVu\ndGlhLmpwZyI+PGltZyBoZWlnaHQ9IjIwIiBzcmM9Imh0dHA6Ly9hc3NldHMuZmVlZGJsaXR6\nLmNvbS9pL3BpbnRlcmVzdDIwLnBuZyIgc3R5bGU9ImJvcmRlcjowO21hcmdpbjowO3BhZGRp\nbmc6MDsiPjwvYT4mIzE2MDs8YSB0aXRsZT0iU3Vic2NyaWJlIGJ5IFJTUyIgcmVsPSJOT0ZP\nTExPVyIgaHJlZj0iaHR0cDovL3AuZmVlZGJsaXR6LmNvbS90My5hc3A/LzIxNzU4NS8zODcx\nMDA0NS81MTE4NTcyXy93d3cubGFrZXdlbmF0Y2hlZWluZm8uY29tLz9mZWVkPWF0b20iPjxp\nbWcgaGVpZ2h0PSIyMCIgc3JjPSJodHRwOi8vYXNzZXRzLmZlZWRibGl0ei5jb20vaS9yc3My\nMC5wbmciIHN0eWxlPSJib3JkZXI6MDttYXJnaW46MDtwYWRkaW5nOjA7Ij48L2E+JiMxNjA7\nPGEgdGl0bGU9IlR3ZWV0IFRoaXMiIHJlbD0iTk9GT0xMT1ciIGhyZWY9Imh0dHA6Ly9wLmZl\nZWRibGl0ei5jb20vdDMuYXNwPy8yMTc1ODUvMzg3MTAwNDUvNTExODU3Ml8vcC5mZWVkYmxp\ndHouY29tL2Yuc2hhcmU/Xy8yNC8xMTQxMDA3ODcvQ29tbXVuaXR5K21lZXRpbmclM2IrRGVh\nbGluZyt3aXRoK2RlbWVudGlhIj48aW1nIGhlaWdodD0iMjAiIHNyYz0iaHR0cDovL2Fzc2V0\ncy5mZWVkYmxpdHouY29tL2kvdHdpdHRlcjIwLnBuZyIgc3R5bGU9ImJvcmRlcjowO21hcmdp\nbjowO3BhZGRpbmc6MDsiPjwvYT4mIzE2MDs8L2Rpdj48IS0tPCFbZW5kaWZdLS0+PGRpdiBz\ndHlsZT0icGFkZGluZzo4cHggMCA4cHg7Zm9udC1zaXplOiA4cHQ7IGNsZWFyOmxlZnQ7Ij4g\nJiN4MjAyMjsgPGEgaHJlZj0iaHR0cDovL3d3dy5mZWVkYmxpdHouY29tL2YvZi5mYno/Rndk\nMkZyaWVuZEVkaXQ9MjE3NTg1OzMwMTIxNDY7aHR0cDovL3d3dy5sYWtld2VuYXRjaGVlaW5m\nby5jb20vY29tbXVuaXR5LW1lZXRpbmctZGVhbGluZy13aXRoLWRlbWVudGlhLztDb21tdW5p\ndHkgbWVldGluZzsgRGVhbGluZyB3aXRoIGRlbWVudGlhOzUxMTg1NzIiPkVtYWlsIHRvIGEg\nZnJpZW5kPC9hPiAmI3gyMDIyOyA8YSB0aXRsZT0iRmluZCByZWxhdGVkIHBvc3RzIiBocmVm\nPSJodHRwOi8vd3d3LmZlZWRibGl0ei5jb20vZi9mLmZiej9TZWFyY2g9MjE3NTg1OzMwMTIx\nNDY7QW5ub3VuY2VtZW50cztDb21tdW5pdHkgbWVldGluZzsgRGVhbGluZyB3aXRoIGRlbWVu\ndGlhOzUxMTg1NzIiPkFydGljbGUgU2VhcmNoPC9hPiAmI3gyMDIyOyA8YSB0aXRsZT0iVmll\ndyBjb21tZW50cyIgcmVsPSJOT0ZPTExPVyIgaHJlZj0iaHR0cDovL3AuZmVlZGJsaXR6LmNv\nbS90My5hc3A/LzIxNzU4NS8zODcxMDA0NS81MTE4NTcyXy93d3cubGFrZXdlbmF0Y2hlZWlu\nZm8uY29tL2NvbW11bml0eS1tZWV0aW5nLWRlYWxpbmctd2l0aC1kZW1lbnRpYS8jY29tbWVu\ndHMiPlZpZXcmbmJzcDtjb21tZW50czwvYT4gJiN4MjAyMjsgPGEgcmVsPSJOT0ZPTExPVyIg\ndGl0bGU9IlRyYWNrIGNvbW1lbnRzIiBocmVmPSJodHRwOi8vd3d3LmZlZWRibGl0ei5jb20v\nZi9mLmZiej9UcmFjaz1odHRwJTNhJTJmJTJmd3d3Lmxha2V3ZW5hdGNoZWVpbmZvLmNvbSUy\nZmNvbW11bml0eS1tZWV0aW5nLWRlYWxpbmctd2l0aC1kZW1lbnRpYSUyZmZlZWQlMmZhdG9t\nJTJmJnJlZj1jb21tZW50OjIxNzU4NSI+VHJhY2smbmJzcDtjb21tZW50czwvYT4gJiN4MjAy\nMjs8L2Rpdj48IS0tPCFbZW5kaWZdLS0+PC9wPg0KCQkJCQkJCTwvZGl2Pg0KCQkJCQkJCTxi\nciAvPg0KPCEtLSBCZWdpbiAucG9zdCAtLT48L3A+DQoJCQkJCQkJPHA+DQoJCQkJCQkJCSZu\nYnNwOzwvcD4NCgkJCQkJCQk8aDM+DQoJCQkJCQkJCTxhIG5hbWU9IjIxNzU4NV9yZWNhcCI+\nPC9hPjxhIGhyZWY9Imh0dHA6Ly93d3cuZmVlZGJsaXR6LmNvbS9mL2YuZmJ6P2dvdG89MjE3\nNTg1IiB0aXRsZT0iZXh0ZXJuYWwgbGluayI+TW9yZSBSZWNlbnQgQXJ0aWNsZXM8L2E+PC9o\nMz4NCgkJCQkJCQk8ZGl2Pg0KCQkJCQkJCQk8cD4NCgkJCQkJCQkJCTxhIG5hbWU9IjIxNzU4\nNV9yZWNhcCI+PC9hPjx1bD4NCjxsaT48YSByZWw9Ik5PRk9MTE9XIiBocmVmPSJodHRwOi8v\ncC5mZWVkYmxpdHouY29tL3QzLmFzcD8vMjE3NTg1LzM4NzEwMDQ1LzUxMTg1NzJfL3d3dy5s\nYWtld2VuYXRjaGVlaW5mby5jb20vYmVhdmVyLXZhbGxleS1zY2hvb2wtYnJhaW5zdG9ybWlu\nZy10aW1lLXdlZG5lc2RheS1mZWItMjR0aC8iPkJlYXZlciBWYWxsZXkgU2Nob29sIEJyYWlu\nc3Rvcm1pbmcgVGltZSBXZWRuZXNkYXkgRmViIDI0dGg8L2E+PC9saT4NCjxsaT48YSByZWw9\nIk5PRk9MTE9XIiBocmVmPSJodHRwOi8vcC5mZWVkYmxpdHouY29tL3QzLmFzcD8vMjE3NTg1\nLzM4NzEwMDQ1LzUxMTg1NzJfL3d3dy5sYWtld2VuYXRjaGVlaW5mby5jb20vZnJlZS1zbW9r\nZS1kZXRlY3Rvci1pbnNwZWN0aW9ucy1yZXBsYWNlbWVudHMvIj5GUkVFIFNtb2tlIERldGVj\ndG9yIEluc3BlY3Rpb25zICYgUmVwbGFjZW1lbnRzPC9hPjwvbGk+DQo8bGk+PGEgcmVsPSJO\nT0ZPTExPVyIgaHJlZj0iaHR0cDovL3AuZmVlZGJsaXR6LmNvbS90My5hc3A/LzIxNzU4NS8z\nODcxMDA0NS81MTE4NTcyXy93d3cubGFrZXdlbmF0Y2hlZWluZm8uY29tL2FubnVhbC1tb29z\nZS1kZXdsYXAtaG9zdGVkLWJ5LXRoZS1sZWF2ZW53b3J0aC13aW50ZXItc3BvcnRzLWNsdWIv\nIj5Bbm51YWwgTW9vc2UgRGV3bGFwIGhvc3RlZCBieSBUaGUgTGVhdmVud29ydGggV2ludGVy\nIFNwb3J0cyBDbHViPC9hPjwvbGk+DQo8bGk+PGEgcmVsPSJOT0ZPTExPVyIgaHJlZj0iaHR0\ncDovL3AuZmVlZGJsaXR6LmNvbS90My5hc3A/LzIxNzU4NS8zODcxMDA0NS81MTE4NTcyXy93\nd3cubGFrZXdlbmF0Y2hlZWluZm8uY29tL2ZpcmV3aXNlLW1lZXRpbmcvIj5GaXJld2lzZSBN\nZWV0aW5nPC9hPjwvbGk+DQo8bGk+PGEgcmVsPSJOT0ZPTExPVyIgaHJlZj0iaHR0cDovL3Au\nZmVlZGJsaXR6LmNvbS90My5hc3A/LzIxNzU4NS8zODcxMDA0NS81MTE4NTcyXy93d3cubGFr\nZXdlbmF0Y2hlZWluZm8uY29tL3JlcHVibGljYW4tYW5kLWRlbW9jcmF0LWNhdWN1c2VzLyI+\nUkVQVUJMSUNBTiBBTkQgREVNT0NSQVQgQ0FVQ1VTRVM8L2E+PC9saT48L3VsPjwhLS08IVtl\nbmRpZl0tLT48L3A+DQoJCQkJCQkJPC9kaXY+DQoJCQkJCQkJPGJyIC8+DQo8L3RkPg0KCQkJ\nCQk8L3RyPg0KCQkJCTwvdGJvZHk+DQoJCQk8L3RhYmxlPg0KCQk8L2Rpdj4NCgkJPHA+DQoJ\nCQkmbmJzcDs8L3A+DQoJPCEtLTwhW2VuZGlmXS0tPg0KPGhyIHN0eWxlPSJjbGVhcjpib3Ro\nOyI+DQo8ZGl2IGFsaWduPSJjZW50ZXIiIHN0eWxlPSJwYWRkaW5nLWJvdHRvbTowLjVlbSI+\nPGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTo4cHQ7Ij4NCjxhIHJlbD0iTk9GT0xMT1ciIGhy\nZWY9Imh0dHA6Ly93d3cuZmVlZGJsaXR6LmNvbS9mL2YuZmJ6P0VtYWlsUmVtb3ZlPV8zODcx\nMDA0NSU3YzIxNzU4NSU3Y2VjZTRmMmYyOWI0ZDM5MjBhZjE4MGU3ZDllM2FhMTRhJTdjNTEx\nODU3Ml8iPjx1PkNsaWNrIGhlcmUgdG8gc2FmZWx5IHVuc3Vic2NyaWJlPC91PjwvYT4gZnJv\nbSAiTGFrZSBXZW5hdGNoZWUgSW5mby4iPGJyPjwhLS0gXyFmYnp0eHRsbmshXyBodHRwOi8v\nd3d3LmZlZWRibGl0ei5jb20vZi9mLmZiej9FbWFpbFJlbW92ZT1fMzg3MTAwNDUlN2MyMTc1\nODUlN2NlY2U0ZjJmMjliNGQzOTIwYWYxODBlN2Q5ZTNhYTE0YSU3YzUxMTg1NzJfIC0tPiAg\nDQo8YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5mZWVkYmxpdHouY29tLzIxNzU4NSI+PHU+Q2xp\nY2sgaGVyZSB0byB2aWV3IG1haWxpbmcgYXJjaGl2ZXM8L3U+PC9hPiwgPEEgaHJlZj0iaHR0\ncDovL3d3dy5mZWVkYmxpdHouY29tL2YvZi5mYno/U3Vic2NyaXB0aW9ucz0yMTc1ODUiPjx1\nPmhlcmUgdG8gY2hhbmdlIHlvdXIgcHJlZmVyZW5jZXM8L3U+PC9hPiwgb3IgPGEgaHJlZj0i\naHR0cDovL3d3dy5mZWVkYmxpdHouY29tL2YvZi5mYno/U3ViPTIxNzU4NSI+PHU+aGVyZSB0\nbyBzdWJzY3JpYmU8L3U+PC9hPg0KICAmYnVsbDsgPGEgaHJlZj0iaHR0cDovL3d3dy5mZWVk\nYmxpdHouY29tL2YvP1ByaXZhY3kiPjx1PlByaXZhY3k8L3U+PC9hPjwvc3Bhbj48L2k+PC9k\naXY+DQo8aHIgY2xhc3M9ImRvdHRlZGxpbmUiPjwhLS08IVtlbmRpZl0tLT4NCjxkaXYgYWxp\nZ249ImNlbnRlciIgc3R5bGU9InBhZGRpbmc6MC41ZW07ZGlzcGxheTpibG9jaztiYWNrZ3Jv\ndW5kLWNvbG9yOndoaXRlO2NvbG9yOmJsYWNrO21hcmdpbjowIj48c3BhbiBzdHlsZT0iZm9u\ndC1zaXplOjhwdDsiPkVtYWlsIHN1YnNjcmlwdGlvbnMgcG93ZXJlZCBieSA8YSBzdHlsZT0i\nZGlzcGxheTppbmxpbmUiIGhyZWY9Imh0dHA6Ly93d3cuZmVlZGJsaXR6LmNvbSI+RmVlZEJs\naXR6PC9hPiwgTExDLCAzNjUgQm9zdG9uIFBvc3QgUmQsIFN1aXRlIDEyMywgU3VkYnVyeSwg\nTUEgMDE3NzYsIFVTQS48L3NwYW4+PC9kaXY+DQo8L2JvZHk+PC9odG1sPg==\n\n\n--f33dBL1tz_mIME_pART_bOUNDARY==38710045==v1_--',  
  u'sender': None, u'tags': [], u'text': None, u'from_email': u'[email protected]',  
  u'to': [[u'[email protected]', u'example']],  
  u'html': u'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r\n<html>\r\n\t<head><meta http-equiv="content-type" content="text/html; charset=UTF-8"><link href="http://assets.feedblitz.com/fb4styles.css" rel="stylesheet" type="text/css"><meta name="viewport" content="width=device-width, initial-scale=1.0"/>\r\n<style type="text/css">body{margin: 1em 1em 1em 1em;line-height:1.3em;} p{margin: 1em 0em 1em 0em;line-height:1.3em;} ul,ol,li{line-height:1.3em;} img{border:0;-ms-interpolation-mode: bicubic;outline:none;} table td {border-collapse: collapse;}\r\n @media screen {img { max-width:100% !important;height:auto !important;} }\r\n .alignright {float:right;padding-left:10px;} .alignleft {float:left;padding-right:10px;} .right {float:right;padding-left:10px;} .left {float:left;padding-right:10px;} .aligncenter {display: block;margin-left:auto;margin-right:auto;text-align:center;} .wp-caption {font-style:italic;text-align:center;} .wp-caption-text {font-style:italic;text-align:center;} body {-webkit-text-size-adjust:100%; -ms-text-size-adjust:100%;}</style>\r\n\t\t<title>Lake Wenatchee Info</title>\r\n\t\t<style type="text/css">\r\nh1 { \tcolor:#3F4A50; \tfont-family: Trebuchet MS, Arial, Helvetica, sans-serif; \tfont-size: 220%; \tfont-weight:bold; \tclear:left; } h2 { \tcolor:#4A6279; \tfont-family: Trebuchet MS, Arial, Helvetica, sans-serif; \tfont-size: 150%; \tfont-weight:bold; \tclear:left; } h3 { \tcolor:#4A6279; \tfont-family: Trebuchet MS, Arial, Helvetica, sans-serif; \tfont-size: 120%; \tfont-weight:bold; \tclear:left; } body,p,td,form,input,textarea,select { \tcolor:#3F4A50; \tfont-family: Trebuchet MS, Arial, Helvetica, sans-serif; \tfont-size: 13px; } a { \tcolor:#000000; \tfont-family: Trebuchet MS, Arial, Helvetica, sans-serif; } blockquote { \tfont-family: Courier New, Courier; \tfont-size: 12px; } a:hover { \tfont-family: Trebuchet MS, Arial, Helvetica, sans-serif; \tcolor:#FF6600; } td.norm { \tbackground-color:#f96300; \tcolor:#000000; \tborder: 1px solid #f96300; } td.normbody { \tborder: 1px solid #f96300; } img { border: none;}\t\t</style>\r\n\t</head>\r\n\t<body>\r\n<div width="100%" height="8" style="display:block;width:100%;height:8px;border:0;margin:0;line-height:8px;font-size:8px;">\ufeff<img src="https://pippio.com/api/sync?pid=1290&it=4&iv=0ecf53c908e4e2dc88f792ad2ab79071&it=4&iv=c1b014410524e54bf35b043bc5c72a7ca9c28953&it=4&iv=b74721b91e4b28179855cb93c3639129545c5e949254eedcbb8b9e1cd9a57b61" width="1" height="1" border="0" style="display:none;overflow:hidden;"/>\r\n<img src="https://pippio.com/api/sync?pid=1291&it=4&iv=0ecf53c908e4e2dc88f792ad2ab79071&it=4&iv=c1b014410524e54bf35b043bc5c72a7ca9c28953&it=4&iv=b74721b91e4b28179855cb93c3639129545c5e949254eedcbb8b9e1cd9a57b61" width="1" height="1" border="0" style="display:none;overflow:hidden;"/>\r\n<img src="https://pippio.com/api/sync?pid=1292&it=4&iv=0ecf53c908e4e2dc88f792ad2ab79071&it=4&iv=c1b014410524e54bf35b043bc5c72a7ca9c28953&it=4&iv=b74721b91e4b28179855cb93c3639129545c5e949254eedcbb8b9e1cd9a57b61" width="1" height="1" border="0" style="display:none;overflow:hidden;"/>\r\n<img src="https://pippio.com/api/sync?pid=1293&it=4&iv=0ecf53c908e4e2dc88f792ad2ab79071&it=4&iv=c1b014410524e54bf35b043bc5c72a7ca9c28953&it=4&iv=b74721b91e4b28179855cb93c3639129545c5e949254eedcbb8b9e1cd9a57b61" width="1" height="1" border="0" style="display:none;overflow:hidden;"/>\r\n<img src="https://pippio.com/api/sync?pid=1294&it=4&iv=0ecf53c908e4e2dc88f792ad2ab79071&it=4&iv=c1b014410524e54bf35b043bc5c72a7ca9c28953&it=4&iv=b74721b91e4b28179855cb93c3639129545c5e949254eedcbb8b9e1cd9a57b61" width="1" height="1" border="0" style="display:none;overflow:hidden;"/>\r\n<img src="https://pippio.com/api/sync?pid=1295&it=4&iv=0ecf53c908e4e2dc88f792ad2ab79071&it=4&iv=c1b014410524e54bf35b043bc5c72a7ca9c28953&it=4&iv=b74721b91e4b28179855cb93c3639129545c5e949254eedcbb8b9e1cd9a57b61" width="1" height="1" border="0" style="display:none;overflow:hidden;"/>\r\n<img src="https://pippio.com/api/sync?pid=1296&it=4&iv=0ecf53c908e4e2dc88f792ad2ab79071&it=4&iv=c1b014410524e54bf35b043bc5c72a7ca9c28953&it=4&iv=b74721b91e4b28179855cb93c3639129545c5e949254eedcbb8b9e1cd9a57b61" width="1" height="1" border="0" style="display:none;overflow:hidden;"/>\r\n<img src="https://pippio.com/api/sync?pid=1297&it=4&iv=0ecf53c908e4e2dc88f792ad2ab79071&it=4&iv=c1b014410524e54bf35b043bc5c72a7ca9c28953&it=4&iv=b74721b91e4b28179855cb93c3639129545c5e949254eedcbb8b9e1cd9a57b61" width="1" height="1" border="0" style="display:none;overflow:hidden;"/>\r\n<img src="https://pippio.com/api/sync?pid=1298&it=4&iv=0ecf53c908e4e2dc88f792ad2ab79071&it=4&iv=c1b014410524e54bf35b043bc5c72a7ca9c28953&it=4&iv=b74721b91e4b28179855cb93c3639129545c5e949254eedcbb8b9e1cd9a57b61" width="1" height="1" border="0" style="display:none;overflow:hidden;"/>\r\n<img src="https://pippio.com/api/sync?pid=1299&it=4&iv=0ecf53c908e4e2dc88f792ad2ab79071&it=4&iv=c1b014410524e54bf35b043bc5c72a7ca9c28953&it=4&iv=b74721b91e4b28179855cb93c3639129545c5e949254eedcbb8b9e1cd9a57b61" width="1" height="1" border="0" style="display:none;overflow:hidden;"/>\r\n<img border="0" width="2" height="2" hspace="0" vspace="0" style="width:2px;height:2px;padding:0;margin:0;overflow:hidden;" src="http://t.feedblitz.com/351551.gif?s=c1b014410524e54bf35b043bc5c72a7ca9c28953&n=1">\r\n <img width="8" height="8" hspace="0" vspace="0" border="0" style="width:8px;height:8px;padding:0;margin:0;" src="http://p.feedblitz.com/logos/5118572/217585/38710045/logo.gif"></div>\r\n\r\n<style type="text/css">img { max-width:100% !important;height:auto !important;}</style>\r\n\r\n\t\t<!-- Begin #content -->\r\n\t\t<div align="center">\r\n\t\t\t<p>\r\n\t\t\t\t<img alt="" src="http://www.example2.com/wp-content/uploads/2011/05/LakeWen-Prop-Email-Header.png" /></p>\r\n\t\t\t<table cellpadding="0" cellspacing="0" style="width: 708px; height: 66px">\r\n\t\t\t\t<tbody>\r\n\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t<br />\r\n\t\t\t\t\t\t\t<p>\r\n\t\t\t\t\t\t\t\tHere are the <a href="http://www.example2.com">Lake Wentachee Info</a> email updates for <strong>[email protected]</strong></p>\r\n\t\t\t\t\t\t</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</tbody>\r\n\t\t\t</table>\r\n\t\t</div>\r\n\t\t<p></p>\r\n\t\t<div align="center">\r\n\t\t\t<table cellpadding="0" cellspacing="0" width="708">\r\n\t\t\t\t<tbody>\r\n\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t<!-- Begin .header --><br />\r\n\t\t\t\t\t\t\t<ul>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t<li>\r\n\t\t\t\t\t\t\t\t\t<a href="#0">Community meeting; Dealing with dementia</a>\r\n\r\n\t\t\t\t\t\t\t\t<li>\r\n\t\t\t\t\t\t\t\t\t<a href="#217585_recap">More Recent Articles</a>\r\n\r\n\t\t\t\t\t\t\t\t<li>\r\n\t\t\t\t\t\t\t\t\t<a href="http://www.feedblitz.com/f/?Search=217585">Search Lake Wenatchee Info</a>\r\n\r\n\t\t\t\t\t\t\t</ul>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t<hr />\r\n\t\t\t\t\t\t\t<h2 class="date-header">\r\n\t\t\t\t\t\t\t\t<a rel="NOFOLLOW" href=\'http://p.feedblitz.com/r3.asp?l=114100787&f=217585&c=5118572\'>Community meeting; Dealing with dementia</a><br></h2>\r\n\t\t\t\t\t\t\t<p><!-- [email protected] --><a id="0" name="0"></a><!-- Begin .post --></p>\r\n\t\t\t\t\t\t\t<p>\r\n\t\t\t\t\t\t\t\t&nbsp;</p>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t<p>\r\n\t\t\t\t\t\t\t\t\t<p><img class="alignleft size-full wp-image-28407" src="http://www.example2.com/wp-content/uploads/2016/02/Dementia.jpg" alt="Dementia" width="220" xheight="223" align="left" hspace="8" style="float:left;margin-left:0;"/></p>\n<p>Preceding the regular meeting of the Lake Wenatchee Fire &amp; Rescue Auxiliary\xa0on Wednesday, March 2nd, there will be a special 1 hour informative\xa0program, open to the public,\xa0on dealing with dementia;\xa0learning\xa0what\xa0dementia is, how to identify it, and dealing with patients that have dementia.\xa0 The instructor is Cary Ulrich,\xa0 a photographer with Chelan County Fire District 1 in Wenatchee.\xa0Cary has had the difficult real life experience of being the sole caregiver to his wife for over 3 years as they dealt with Alzheimer&#8217;s.\xa0 He has researched and studied the topic extensively and has been giving this presentation throughout Chelan County.\xa0 While this topic is especially important for first responders in how to recognize and care for patients with this condition, there are many of us that have witnessed this in our personal lives and were unprepared for how to handle the situation.\xa0 Please join us\xa0for this presentation at 6:30 PM Wednesday, March 2nd, at the\xa0Ponderosa clubhouse in Ponderosa.</p>\n<p>To get there: From Plain Hardware/Plain Grocery continue straight South on Camp 12 Road 1.5 miles, then turn right on Colt Road which is one-way going downhill. At the bottom of the hill turn right on Stirrup Street. Quarter Road is on your left but go one block further and turn left on Morgan which may or may not have a sign but has a large green house on the corner. Take the first left off Morgan which is Cayuse, pass the fire station on the left to the clubhouse on your left at the end of the street.</p>\n<p>&nbsp;</p>\n<!--<![endif]-->\r\n<div style="clear:both;padding-top:0.7em;"><a title="Subscribe by email" rel="NOFOLLOW" href="http://p.feedblitz.com/t3.asp?/217585/38710045/5118572_/feedblitz.com/f?Track=http://www.example2.com/?feed=atom&publisher=2940478"><img height="20" src="http://assets.feedblitz.com/i/email20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Like on Facebook" rel="NOFOLLOW" href="http://p.feedblitz.com/t3.asp?/217585/38710045/5118572_/p.feedblitz.com/f.share?_/28/114100787/Community+meeting%3b+Dealing+with+dementia"><img height="20" src="http://assets.feedblitz.com/i/fblike20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Share on Google+" rel="NOFOLLOW" href="http://p.feedblitz.com/t3.asp?/217585/38710045/5118572_/p.feedblitz.com/f.share?_/30/114100787/Community+meeting%3b+Dealing+with+dementia"><img height="20" src="http://assets.feedblitz.com/i/googleplus20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Pin it!" rel="NOFOLLOW" href="http://p.feedblitz.com/t3.asp?/217585/38710045/5118572_/p.feedblitz.com/f.share?_/29/114100787/Community+meeting%3b+Dealing+with+dementia,http%3a%2f%2fwww.example2.com%2fwp-content%2fuploads%2f2016%2f02%2fDementia.jpg"><img height="20" src="http://assets.feedblitz.com/i/pinterest20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Subscribe by RSS" rel="NOFOLLOW" href="http://p.feedblitz.com/t3.asp?/217585/38710045/5118572_/www.example2.com/?feed=atom"><img height="20" src="http://assets.feedblitz.com/i/rss20.png" style="border:0;margin:0;padding:0;"></a>&#160;<a title="Tweet This" rel="NOFOLLOW" href="http://p.feedblitz.com/t3.asp?/217585/38710045/5118572_/p.feedblitz.com/f.share?_/24/114100787/Community+meeting%3b+Dealing+with+dementia"><img height="20" src="http://assets.feedblitz.com/i/twitter20.png" style="border:0;margin:0;padding:0;"></a>&#160;</div><!--<![endif]--><div style="padding:8px 0 8px;font-size: 8pt; clear:left;"> &#x2022; <a href="http://www.feedblitz.com/f/f.fbz?Fwd2FriendEdit=217585;3012146;http://www.example2.com/community-meeting-dealing-with-dementia/;Community meeting; Dealing with dementia;5118572">Email to a friend</a> &#x2022; <a title="Find related posts" href="http://www.feedblitz.com/f/f.fbz?Search=217585;3012146;Announcements;Community meeting; Dealing with dementia;5118572">Article Search</a> &#x2022; <a title="View comments" rel="NOFOLLOW" href="http://p.feedblitz.com/t3.asp?/217585/38710045/5118572_/www.example2.com/community-meeting-dealing-with-dementia/#comments">View&nbsp;comments</a> &#x2022; <a rel="NOFOLLOW" title="Track comments" href="http://www.feedblitz.com/f/f.fbz?Track=http%3a%2f%2fwww.example2.com%2fcommunity-meeting-dealing-with-dementia%2ffeed%2fatom%2f&ref=comment:217585">Track&nbsp;comments</a> &#x2022;</div><!--<![endif]--></p>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<br />\r\n<!-- Begin .post --></p>\r\n\t\t\t\t\t\t\t<p>\r\n\t\t\t\t\t\t\t\t&nbsp;</p>\r\n\t\t\t\t\t\t\t<h3>\r\n\t\t\t\t\t\t\t\t<a name="217585_recap"></a><a href="http://www.feedblitz.com/f/f.fbz?goto=217585" title="external link">More Recent Articles</a></h3>\r\n\t\t\t\t\t\t\t<div>\r\n\t\t\t\t\t\t\t\t<p>\r\n\t\t\t\t\t\t\t\t\t<a name="217585_recap"></a><ul>\r\n<li><a rel="NOFOLLOW" href="http://p.feedblitz.com/t3.asp?/217585/38710045/5118572_/www.example2.com/beaver-valley-school-brainstorming-time-wednesday-feb-24th/">Beaver Valley School Brainstorming Time Wednesday Feb 24th</a></li>\r\n<li><a rel="NOFOLLOW" href="http://p.feedblitz.com/t3.asp?/217585/38710045/5118572_/www.example2.com/free-smoke-detector-inspections-replacements/">FREE Smoke Detector Inspections & Replacements</a></li>\r\n<li><a rel="NOFOLLOW" href="http://p.feedblitz.com/t3.asp?/217585/38710045/5118572_/www.example2.com/annual-moose-dewlap-hosted-by-the-leavenworth-winter-sports-club/">Annual Moose Dewlap hosted by The Leavenworth Winter Sports Club</a></li>\r\n<li><a rel="NOFOLLOW" href="http://p.feedblitz.com/t3.asp?/217585/38710045/5118572_/www.example2.com/firewise-meeting/">Firewise Meeting</a></li>\r\n<li><a rel="NOFOLLOW" href="http://p.feedblitz.com/t3.asp?/217585/38710045/5118572_/www.example2.com/republican-and-democrat-caucuses/">REPUBLICAN AND DEMOCRAT CAUCUSES</a></li></ul><!--<![endif]--></p>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<br />\r\n</td>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t</tbody>\r\n\t\t\t</table>\r\n\t\t</div>\r\n\t\t<p>\r\n\t\t\t&nbsp;</p>\r\n\t<!--<![endif]-->\r\n<hr style="clear:both;">\r\n<div align="center" style="padding-bottom:0.5em"><i><span style="font-size:8pt;">\r\n<a rel="NOFOLLOW" href="http://www.feedblitz.com/f/f.fbz?EmailRemove=_38710045%7c217585%7cece4f2f29b4d3920af180e7d9e3aa14a%7c5118572_"><u>Click here to safely unsubscribe</u></a> from "Lake Wenatchee Info."<br><!-- _!fbztxtlnk!_ http://www.feedblitz.com/f/f.fbz?EmailRemove=_38710045%7c217585%7cece4f2f29b4d3920af180e7d9e3aa14a%7c5118572_ --> \r\n<a href="http://archive.feedblitz.com/217585"><u>Click here to view mailing archives</u></a>, <A href="http://www.feedblitz.com/f/f.fbz?Subscriptions=217585"><u>here to change your preferences</u></a>, or <a href="http://www.feedblitz.com/f/f.fbz?Sub=217585"><u>here to subscribe</u></a>\r\n &bull; <a href="http://www.feedblitz.com/f/?Privacy"><u>Privacy</u></a></span></i></div>\r\n<hr class="dottedline"><!--<![endif]-->\r\n<div align="center" style="padding:0.5em;display:block;background-color:white;color:black;margin:0"><span style="font-size:8pt;">Email subscriptions powered by <a style="display:inline" href="http://www.feedblitz.com">FeedBlitz</a>, LLC, 365 Boston Post Rd, Suite 123, Sudbury, MA 01776, USA.</span></div>\r\n</body></html>',  
  u'template': None, u'spam_report': {u'score': 1.3, u'matched_rules': [  
    {u'score': 0, u'name': u'RCVD_IN_DNSWL_NONE',  
     u'description': u'RBL: Sender listed at http://www.dnswl.org/, no'},  
    {u'score': 0, u'name': None, u'description': None},  
    {u'score': 0, u'name': u'listed', u'description': u'in list.dnswl.org]'},  
    {u'score': 0, u'name': u'URIBL_BLOCKED',  
     u'description': u'ADMINISTRATOR NOTICE: The query to URIBL was blocked.'},  
    {u'score': 0, u'name': u'more', u'description': u'information.'},  
    {u'score': 0, u'name': u'example2.com]', u'description': None},  
    {u'score': 0, u'name': u'HTML_MESSAGE', u'description': u'BODY: HTML included in message'},  
    {u'score': 0.1, u'name': u'DKIM_SIGNED',  
     u'description': u'Message has a DKIM or DK signature, not necessarily valid'},  
    {u'score': -0.1, u'name': u'DKIM_VALID',  
     u'description': u'Message has at least one valid DKIM or DK signature'}, {u'score': 1.3, u'name': u'RDNS_NONE',  
                                                                               u'description': u'Delivered to internal network by a host with no rDNS'}]},  
  u'dkim': {u'valid': True, u'signed': True}, u'subject': u'Community meeting; Dealing with dementia',  
  u'email': u'[email protected]', u'spf': {u'result': u'pass', u'detail': u'sender SPF authorized'},  
  u'headers': {u'Delivered-To': u'[email protected]',  
               u'Received-Spf': u'pass (google.com: domain of [email protected] designates 74.208.222.161 as permitted sender) client-ip=74.208.222.161;',  
               u'From': u'"Lake Wenatchee Info" <[email protected]>', u'X-En-Origip': u'209.85.217.178',  
               u'Feedback-Id': u'5118572_217585:217585:news:FeedBlitz',  
               u'X-Google-Dkim-Signature': u'v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:dkim-signature:from:reply-to:sender :to:date:subject:list-unsubscribe:keywords:feedback-id:mime-version :content-type:message-id; bh=zr4kzICC8mfzxSgnoe+58iXom96MdpWe8Q7G/EXg2/A=; b=QjLpVO7AqWFmaXtxh+g9PO9Q3VUIoVo+b9PN5JDYCXUYtVijM1qfcHDKR6G/5e+O46 sZcOW/taOG5tgs2MlLKPIzgk2X5LHYAswJREsD0GQ91O5LGzffUvd8IxcGxIrAoXkUSd Xupqv1d7Tj7M8TuwghZp8RM8itTf8pa2PCSMkmIsPK02dA7V30X9hL9xWlvp2EPsaJJ/ /hv63OYGp5XJF4A2YbFokpGtzyb+bg89xtT+SNyEDF2xAs3Lw8KkPI0NJwq9nXnB/noS jAigVL718UzwBakUSghGTIqGQh6PRJYQXsp8KQpQ7dTEujm5zCw/rfgsqdpEmEuBQzX9 VIRw==',  
               u'X-Gm-Message-State': u'AG10YOSZe0Hopx8NAVVNMCfoFIkQP4BUdAsCDPiVk63IYC8BgNTa5hMVwcMKcsj07HMrvEYa4hfcPizwNtkKSiWcxOTe5cI=',  
               u'To': u'example <[email protected]>',  
               u'Dkim-Signature': u'v=1; a=rsa-sha1; c=relaxed/relaxed; d=mail.feedblitz.com; s=mdaemon; [email protected]; q=dns/txt; h=From:Reply-To:Sender:To:Date:Subject: List-Unsubscribe:Keywords:Feedback-ID:MIME-Version:Content-Type; bh=lVqV/bRcvEzm++/XN5KLUl0hYTE=; b=YFEbYeYJZimkvB0OmEd6p9TaZNtVn DB4DkTla8aq4lgHCXpjbA1Z/7BaDRaMlp8kDYWmtMHGlY7gI3kRvEsxDppIKyeDb gQlgjTWQ2o04NA5JkkKZcn3oYlAeSzYjiQNWbrjK9unZMqNi5BIypy28hH7l2oB/ 3ONgMrAOzzIiTU=',  
               u'X-Received': [  
                   u'by 10.112.132.36 with SMTP id or4mr16099031lbb.50.1456393062925; Thu, 25 Feb 2016 01:37:42 -0800 (PST)',  
                   u'by 10.107.164.212 with SMTP id d81mr2297952ioj.169.1456393061104; Thu, 25 Feb 2016 01:37:41 -0800 (PST)'],  
               u'Date': u'Thu, 25 Feb 2016 04:35:30 -0500',  
               u'Message-Id': u'<[email protected]>', u'X-Mailer': u'FeedBlitz',  
               u'Mime-Version': u'1.0', u'Received': [  
          u'from bosmailout09.eigbox.net (unknown [66.96.190.9]) by relay-2.us-west-2.relay-prod (Postfix) with ESMTPS id 04E0A60953 for <[email protected]>; Thu, 25 Feb 2016 09:37:47 +0000 (UTC)',  
          u'from bosmailscan09.eigbox.net ([10.20.15.9]) by bosmailout09.eigbox.net with esmtp (Exim) id 1aYsMk-0000Wo-AA for [email protected]; Thu, 25 Feb 2016 04:37:46 -0500',  
          u'from [10.115.3.11] (helo=smtp.maileig.com) by bosmailscan09.eigbox.net with esmtp (Exim) id 1aYsMk-0000Ex-20 for [email protected]; Thu, 25 Feb 2016 04:37:46 -0500',  
          u'from mail-lb0-f178.google.com ([209.85.217.178]) by bosimpinc11 with bizsmtp id NZdj1s0223rXcbV01ZdlKV; Thu, 25 Feb 2016 04:37:46 -0500',  
          u'by mail-lb0-f178.google.com with SMTP id bc4so25601373lbc.2 for <[email protected]>; Thu, 25 Feb 2016 01:37:45 -0800 (PST)',  
          u'by 10.114.4.166 with SMTP id l6csp118743ldl; Thu, 25 Feb 2016 01:37:41 -0800 (PST)',  
          u'from mail00.feedblitz.com (mail00.feedblitz.com. [74.208.222.161]) by mx.google.com with ESMTP id p128si9234723iop.87.2016.02.25.01.37.40 for <[email protected]>; Thu, 25 Feb 2016 01:37:41 -0800 (PST)',  
          u'from mail00.feedblitz.com ([127.0.0.1]) by mail00.feedblitz.com with Microsoft SMTPSVC(7.5.7601.17514); Thu, 25 Feb 2016 04:35:30 -0500'],  
               u'Sender': u'FeedBlitz <[email protected]>',  
               u'Authentication-Results': u'mx.google.com; spf=pass (google.com: domain of [email protected] designates 74.208.222.161 as permitted sender) [email protected]; dkim=pass [email protected]',  
               u'X-En-Impsid': u'NZdj1s0223rXcbV01ZdlKV', u'Keywords': u'Announcements',  
               u'Reply-To': u'"Lake Wenatchee Info" <[email protected]>',  
               u'X-Campaignid': u'feedblitz_5118572_217585_20160225',  
               u'X-Forwarded-For': u'[email protected] [email protected]', u'X-Fbzpid': u'20972',  
               u'X-Originalarrivaltime': u'25 Feb 2016 09:35:30.0845 (UTC) FILETIME=[DE354CD0:01D16FAF]',  
               u'List-Unsubscribe': u'<mailto:[email protected]?subject=unsubscribe%[email protected]&body=remove%[email protected]%[email protected]>',  
               u'Content-Type': u'multipart/alternative; charset="UTF-8"; boundary="f33dBL1tz_mIME_pART_bOUNDARY==38710045==v1_"',  
               u'X-Forwarded-To': u'[email protected]',  
               u'Subject': u'Community meeting; Dealing with dementia'}}  

and I run this code to store it:

def store_message(data, mbx):  
    assert isinstance(mbx, Mailbox)  
    email_obj = email.message_from_string(smart_bytes(data['raw_msg'], errors='ignore'))  
    msg = mbx._process_message(email_obj)  

    msg.outgoing = False  

    msg.save()

I got this message {UnicodeEncodeError}'ascii' codec can't encode character u'\xa0' in position 435: ordinal not in range(128) when I run it.

Python 3 path issue with local maildir (and possibly other local file-based) mailboxes

I can't get messages from a local maildir Mailbox for django_mailbox 4.4.2 with python3 on linux:

>>> from django_mailbox.models import Mailbox
>>> from mailbox import Maildir
>>> from email.message import Message
>>> maildir = Maildir('/tmp/maildir')
>>> mailbox = Mailbox.objects.create(uri='maildir:///tmp/maildir')
>>> msg = Message()
>>> msg.set_payload('testing 123')
>>> msg['Subject'] = 'Testing One Two Three'
>>> maildir.add(msg)
'1437492223.M426964P22857Q1.leifurpc'
>>> mailbox.get_new_mail()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/leifur/.virtualenvs/temp/lib/python3.4/site-packages/django_mailbox/models.py", line 399, in get_new_mail
    for message in connection.get_message(condition):
  File "/home/leifur/.virtualenvs/temp/lib/python3.4/site-packages/django_mailbox/transports/generic.py", line 20, in get_message
    repository = self.get_instance()
  File "/home/leifur/.virtualenvs/temp/lib/python3.4/site-packages/django_mailbox/transports/maildir.py", line 9, in get_instance
    return self._variant(self._path, None)
  File "/usr/lib64/python3.4/mailbox.py", line 272, in __init__
    'tmp': os.path.join(self._path, 'tmp'),
  File "/home/leifur/.virtualenvs/temp/lib/python3.4/posixpath.py", line 89, in join
    "components") from None
TypeError: Can't mix strings and bytes in path components

The probem appears to be due to the fact that GenericFileMailbox is passing the path as a bytestring to mailbox.Maildir (see django_mailbox.transports.generic line 12; on py3, str.encode returns a bytestring ). Bytestring paths are allowed in python 3, but mailbox.Maildir in the standard library is calling os.path.join on the path with string literals, which (at list on *nix) causes the TypeError about mixing strings and bytes.

# mailbox.Maildir
class Maildir(Mailbox):
    """A qmail-style Maildir mailbox."""

    colon = ':'

    def __init__(self, dirname, factory=None, create=True):
    """Initialize a Maildir instance."""
    Mailbox.__init__(self, dirname, factory, create)
    self._paths = {
        'tmp': os.path.join(self._path, 'tmp'),
        'new': os.path.join(self._path, 'new'),
        'cur': os.path.join(self._path, 'cur'),
        }
    ...

`google_api_get()` function does not refresh headers and does same request twice with 401 error.

Hi there,

I'm trying to use django-mailbox library on one of my projects together with python-social-auth. The problem I found related to google_api_get() function here:
https://github.com/coddingtonbear/django-mailbox/blob/master/django_mailbox/google_utils.py#L53

Your first request on the line 57 in case of expired token will return 401 status code. So after this, you trying to refresh access token and store it in the database by calling refresh_authorization() function on line 61.

But after token refreshed and stored back to database you doing the same GET request on line 62. You still using old headers with old access token. This request also return 401 status code and there's None returned from this function.

Looks like you missed to update headers before doing this second GET request?

python 3.3.3 compatiblity error

I try get new messages, but component crashes in django_mailbox\models.py in line 133 - 'module' object has no attribute 'unquote'. I have no idea how to figure it out.

Stripping message body

Hi,

I am only interested with message subjects and headers but not the body.

I have tried these settings but the body is still saved in the database.

DJANGO_MAILBOX_STRIP_UNALLOWED_MIMETYPES = True
DJANGO_MAILBOX_ALLOWED_MIMETYPES = []
DJANGO_MAILBOX_TEXT_STORED_MIMETYPES = []

Any pointers to the right direction? Or perhaps the stripping function could be implemented as a custom model admin action?

Thanks in advance

LookupError: unknown encoding: _iso-2022-jp$esc

Traceback (most recent call last):
  File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/mounir/Devel/document_search_env/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/home/mounir/Devel/document_search_env/lib/python2.7/site-packages/django/core/management/__init__.py", line 377, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/mounir/Devel/document_search_env/lib/python2.7/site-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/mounir/Devel/document_search_env/lib/python2.7/site-packages/django/core/management/base.py", line 338, in execute
    output = self.handle(*args, **options)
  File "/home/mounir/Devel/document_search_env/lib/python2.7/site-packages/django_mailbox/management/commands/getmail.py", line 24, in handle
    messages = mailbox.get_new_mail()
  File "/home/mounir/Devel/document_search_env/lib/python2.7/site-packages/django_mailbox/models.py", line 342, in get_new_mail
    msg = self.process_incoming_message(message)
  File "/home/mounir/Devel/document_search_env/lib/python2.7/site-packages/django_mailbox/models.py", line 225, in process_incoming_message
    msg = self._process_message(message)
  File "/home/mounir/Devel/document_search_env/lib/python2.7/site-packages/django_mailbox/models.py", line 324, in _process_message
    message = self._get_dehydrated_message(message, msg)
  File "/home/mounir/Devel/document_search_env/lib/python2.7/site-packages/django_mailbox/models.py", line 301, in _get_dehydrated_message
    msg.get_payload(decode=True).decode(content_charset)
LookupError: unknown encoding: _iso-2022-jp$esc

Deleting E-mail

(Issue copied from bitbucket; originally created by @eamonn_faherty).

Firstly, thank you for this library! This is an awesome piece of work!
I read in the docs that this deletes the emails from the email inbox once they have been read. I was wondering is this really true and is there a switch I could activate to disable this behaviour?

Error in IMAP command UID STORE: Flags list contains non-atoms.

Not sure what to do with this error. Any help?

UID command error: BAD ['Error in IMAP command UID STORE: Flags list contains non-atoms.']

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/admin/django_mailbox/mailbox/

Django Version: 1.4.1
Python Version: 2.7.5
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.comments',
 'django_extensions',
 'djangocms_admin_style',
 'admin_shortcuts',
 'django.contrib.admin',
 'south',
 'paypal.standard.ipn',
 'djcelery',
 'kombu.transport.django',
 'djsupervisor',
 'avatar',
 'autocomplete_light',
 'genericm2m',
 'import_export',
 'django_mailbox',
 'scheduler',
 'teammgr',
 'django_facebook',
 'email_tool',
 'djwepay',
 'team_payments',
 'file_uploads',
 'rsvp',
 'schedule_maker',
 'stats',
 'cms',
 'mptt',
 'menus',
 'south',
 'sekizai',
 'cms.plugins.file',
 'cms.plugins.googlemap',
 'cms.plugins.link',
 'cms.plugins.picture',
 'cms.plugins.snippet',
 'cms.plugins.teaser',
 'cms.plugins.text',
 'cms.plugins.video',
 'tinymce')
Installed Middleware:
('mysite.middleware.PlayerExceptionMiddleware',
 'mysite.middleware.ErrorMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'cms.middleware.page.CurrentPageMiddleware',
 'cms.middleware.user.CurrentUserMiddleware',
 'cms.middleware.toolbar.ToolbarMiddleware',
 'cms.middleware.language.LanguageCookieMiddleware',
 'mysite.middleware.ConsoleExceptionMiddleware')


Traceback:
File "/Users/felixboehme/.virtualenvs/tm/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Users/felixboehme/.virtualenvs/tm/lib/python2.7/site-packages/django/contrib/admin/options.py" in wrapper
  366.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "/Users/felixboehme/.virtualenvs/tm/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view
  91.                     response = view_func(request, *args, **kwargs)
File "/Users/felixboehme/.virtualenvs/tm/lib/python2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  89.         response = view_func(request, *args, **kwargs)
File "/Users/felixboehme/.virtualenvs/tm/lib/python2.7/site-packages/django/contrib/admin/sites.py" in inner
  196.             return view(request, *args, **kwargs)
File "/Users/felixboehme/.virtualenvs/tm/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapper
  25.             return bound_func(*args, **kwargs)
File "/Users/felixboehme/.virtualenvs/tm/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view
  91.                     response = view_func(request, *args, **kwargs)
File "/Users/felixboehme/.virtualenvs/tm/lib/python2.7/site-packages/django/utils/decorators.py" in bound_func
  21.                 return func(self, *args2, **kwargs2)
File "/Users/felixboehme/.virtualenvs/tm/lib/python2.7/site-packages/django/contrib/admin/options.py" in changelist_view
  1153.                 response = self.response_action(request, queryset=cl.get_query_set(request))
File "/Users/felixboehme/.virtualenvs/tm/lib/python2.7/site-packages/django/contrib/admin/options.py" in response_action
  908.             response = func(self, request, queryset)
File "/Users/felixboehme/.virtualenvs/tm/lib/python2.7/site-packages/django_mailbox/admin.py" in get_new_mail
  16.         mailbox.get_new_mail()
File "/Users/felixboehme/.virtualenvs/tm/lib/python2.7/site-packages/django_mailbox/models.py" in get_new_mail
  315.         for message in connection.get_message():
File "/Users/felixboehme/.virtualenvs/tm/lib/python2.7/site-packages/django_mailbox/transports/imap.py" in get_message
  93.             self.server.uid('store', uid, "+FLAGS", "\\Deleted")
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/imaplib.py" in uid
  760.         typ, dat = self._simple_command(name, command, *args)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/imaplib.py" in _simple_command
  1070.         return self._command_complete(name, self._command(name, *args))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/imaplib.py" in _command_complete
  905.             raise self.error('%s command error: %s %s' % (name, typ, data))

Exception Type: error at /admin/django_mailbox/mailbox/
Exception Value: UID command error: BAD ['Error in IMAP command UID STORE: Flags list contains non-atoms.']

Potential security issue

Hello,

There is a potential security issue with django_mailbox's admin. The Message admin displays HTML that is unsanitized and could potentially contain script tags. The following scenario, while slightly far fetched, is still a risk:

  1. An attacker knows a certain address is fetched using django_mailbox
  2. Attacker sends an email to that address containing javascript code that steals the user's cookie
  3. Attacker waits and hopes the admin views his message

https://github.com/jsocol/bleach can be used to process the message's HTML before displaying it.

How to handle a reply of a fetched mail?

Hi,

How can you handle a reply to a mail fetched with django-mailbox?

If I get mails from N pop3 servers. If I reply to a fetched mail, the mail needs to go out to the matching smtp server. There are N correspoding smtp servers to send mails.

I read the docs, but this app seems to only handle the "fetch part".

Can you please give me an advice how to send mails?

No docs for model

I am want mark there is no docs for models.

This make painful to use. Models class have very many (useful) methods, but I have to always analyse code to get knows how to use it.

Unfortunately, my English are not enough to write docs.

Incorrectly encoded e-mail messages may cause mail to fail to be retrieved

Encountered this strange issue:

Traceback (most recent call last):
  File "/home/project/instances/project/manage.py", line 11, in <module>
    execute_manager(settings)
  File "/home/project/instances/project/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/home/project/instances/project/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/project/instances/project/venv/lib/python2.7/site-packages/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/project/instances/project/venv/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/home/project/instances/project/freight/management/commands/get_attachments.py", line 71, in handle
    body = message.text,
  File "/home/project/instances/project/venv/lib/python2.7/site-packages/django_mailbox/models.py", line 415, in text
    return self.get_text_body()
  File "/home/project/instances/project/venv/lib/python2.7/site-packages/django_mailbox/models.py", line 434, in get_text_body
    self.get_email_object()
  File "/home/project/instances/project/venv/lib/python2.7/site-packages/django_mailbox/models.py", line 430, in get_body_from_message
    body += this_part
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 10: ordinal not in range(128)

My code was calling message.text, which calls django_mailbox/models.py Message -> text -> get_text_body

It was failing in body += this part because the code protecting that line:

             if (
                    part.get_content_maintype() == 'text'
                    and part.get_content_subtype() == 'plain'
                ):
                    charset = part.get_content_charset()
                    this_part = part.get_payload(decode=True)
                    if charset:
                        this_part = this_part.decode(charset, 'replace')
                    body += this_part

wasn't expecting the horrible email that was being parsed through it, namely, a base64 attachment/message body that declared itself text/plain but basically contained the text/binary of an unencoded pdf, so was crashing when trying to add that part to the message body.

As a temporary workaround I added:

                    try:
                        body += this_part
                    except Exception,e:
                        body += this_part.decode('utf-8', 'replace')

Obviously not ideal, I'm not sure what the right solution is in this codebase, but I figured I'd pass this along to see if it gives you any ideas.

I was using version 3.0.3 and tried all of the newer versions, none of which solved this particular issue, and version 3.3 threw a different sort of error, so I backed off to version 3.1.2

The error I got from 3.3:

Traceback (most recent call last):
  File "/home/project/instances/project/manage.py", line 11, in <module>
    execute_manager(settings)
  File "/home/project/instances/project/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/home/project/instances/project/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/project/instances/project/venv/lib/python2.7/site-packages/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/project/instances/project/venv/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/home/project/instances/project/freight/management/commands/get_attachments.py", line 24, in handle
    mailbox.get_new_mail()
  File "/home/project/instances/project/venv/lib/python2.7/site-packages/django_mailbox/models.py", line 315, in get_new_mail
    for message in connection.get_message():
  File "/home/project/instances/project/venv/lib/python2.7/site-packages/django_mailbox/transports/imap.py", line 84, in get_message
    typ, msg_contents = self.server.uid('fetch', uid, '(RFC822)')
  File "/usr/lib64/python2.7/imaplib.py", line 760, in uid
    typ, dat = self._simple_command(name, command, *args)
  File "/usr/lib64/python2.7/imaplib.py", line 1070, in _simple_command
    return self._command_complete(name, self._command(name, *args))
  File "/usr/lib64/python2.7/imaplib.py", line 905, in _command_complete
    raise self.error('%s command error: %s %s' % (name, typ, data))
imaplib.error: UID command error: BAD ['The specified message set is invalid.']

No received date/time field?

Hi

I first noticed your addon a couple of years ago, and I am finaly back to implement it on my site :)

But there doesn't seem to be a "received date/time" field in the Message model, and no property to get it either.

And how does it handle Cc and Bcc?

Get cc addresses

There is no convenient way to get Cc addresses of a message.

It would be great to have the same process than the To field done on Cc field (i.e. storing the field when at _process_message, and giving a cc_addresses property, equivalent to to_addresses).

Error when getting mail with UTF-8 bytes in `from` header

If you use manage.py getmail and you have UTF-8 characters in you from_header field, you will get a MySQL exception. For example, if from_header contains the string Călin this exception will be thrown.

Traceback (most recent call last):
  File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
    utility.execute()
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django/core/management/base.py", line 242, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django/core/management/base.py", line 285, in execute
    output = self.handle(*args, **options)
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django_mailbox/management/commands/getmail.py", line 24, in handle
    messages = mailbox.get_new_mail()
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django_mailbox/models.py", line 320, in get_new_mail
    msg = self.process_incoming_message(message)
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django_mailbox/models.py", line 203, in process_incoming_message
    msg = self._process_message(message)
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django_mailbox/models.py", line 301, in _process_message
    msg.save()
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django/db/models/base.py", line 545, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django/db/models/base.py", line 573, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django/db/models/base.py", line 654, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django/db/models/base.py", line 687, in _do_insert
    using=using, raw=raw)
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django/db/models/manager.py", line 232, in _insert
    return insert_query(self.model, objs, fields, **kwargs)
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django/db/models/query.py", line 1514, in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 903, in execute_sql
    cursor.execute(sql, params)
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django/db/backends/util.py", line 69, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django/db/backends/util.py", line 53, in execute
    return self.cursor.execute(sql, params)
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 124, in execute
    return self.cursor.execute(query, args)
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/MySQLdb/cursors.py", line 207, in execute
    if not self._defer_warnings: self._warning_check()
  File "/home/dragos/.virtualenvs/h2o/local/lib/python2.7/site-packages/MySQLdb/cursors.py", line 117, in _warning_check
    warn(w[-1], self.Warning, 3)
_mysql_exceptions.Warning: Incorrect string value: '\xC4\x83lin ...' for column 'from_header' at row 1

UnicodeDecodeError on get_mail

Hi! Thank you for app.
We have some problems with get_mail:

Django Version: 1.6.1
Python Version: 2.7.6
...

Traceback:
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/site-packages/django/views/generic/base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch
  87.         return handler(request, *args, **kwargs)
File "/home/leha/django-site/proj/views.py" in get
  140.             messages = mailbox.get_new_mail()
File "/usr/local/lib/python2.7/site-packages/django_mailbox/models.py" in get_new_mail
  285.             msg = self.process_incoming_message(message)
File "/usr/local/lib/python2.7/site-packages/django_mailbox/models.py" in process_incoming_message
  183.         msg = self._process_message(message)
File "/usr/local/lib/python2.7/site-packages/django_mailbox/models.py" in _process_message
  266.         msg.save()
File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py" in save
  545.                        force_update=force_update, update_fields=update_fields)
File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py" in save_base
  573.             updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py" in _save_table
  654.             result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py" in _do_insert
  687.                                using=using, raw=raw)
File "/usr/local/lib/python2.7/site-packages/django/db/models/manager.py" in _insert
  232.         return insert_query(self.model, objs, fields, **kwargs)
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py" in insert_query
  1511.     return query.get_compiler(using=using).execute_sql(return_id)
File "/usr/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py" in execute_sql
  898.             cursor.execute(sql, params)
File "/usr/local/lib/python2.7/site-packages/django/db/backends/util.py" in execute
  73.             sql = self.db.ops.last_executed_query(self.cursor, sql, params)
File "/usr/local/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/operations.py" in last_executed_query
  214.             return cursor.query.decode('utf-8')
File "/usr/local/lib/python2.7/encodings/utf_8.py" in decode
  16.     return codecs.utf_8_decode(input, errors, True)

Exception Type: UnicodeDecodeError at proj/new_mail/
Exception Value: 'utf8' codec can't decode byte 0xd3 in position 187: invalid continuation byte

Process each messages in invidual transaction

Hello,

I am would like suggest add support for transaction - indepent transaction for each messages. Then any exception in message processing, especially signals processign will be safe for database.

In Django many installation use ATOMIC_REQUESTS, so each views (requests) use transaction by default, but in commands you have to add support for transaction handsome.

Greetings,

Getting 404 when trying to download attachment from admin

Hi,

I've installed django-mailbox inside my apps folder and everything is working fine util I try
to download PDF attachment for one of my emails. When I click on the pdf link on the admin page for this attachment, it says 404. Here's the generated URL :

http://localhost:8000/adminpanel/django_mailbox/messageattachment/1/mailbox_attachments/2014/07/28/84f6b5bc2fd8424db138a707658d7d7d.pdf/

I've noticed that the dir with this file exists and is at the root of my project, not inside apps/django-mailbox.

How should I fix this?

Can't download IMAP messages from GMail

From version 3.2 i'm having errors:

   new_email_list = mailbox.get_new_mail()
  File "/srv/mieszkaniec-prod/webapp/env/lib/python2.7/site-packages/django_mailbox/models.py", line 315, in get_new_mail
    for message in connection.get_message():
  File "/srv/mieszkaniec-prod/webapp/env/lib/python2.7/site-packages/django_mailbox/transports/imap.py", line 84, in get_message
    typ, msg_contents = self.server.uid('fetch', uid, '(RFC822)')
  File "/usr/lib/python2.7/imaplib.py", line 760, in uid
    typ, dat = self._simple_command(name, command, *args)
  File "/usr/lib/python2.7/imaplib.py", line 1070, in _simple_command
    return self._command_complete(name, self._command(name, *args))
  File "/usr/lib/python2.7/imaplib.py", line 905, in _command_complete
    raise self.error('%s command error: %s %s' % (name, typ, data))
error: UID command error: BAD ['Could not parse command']

Had to downgrade to 3.1 and now IMAP downloading is working.

django_mailbox & ./manage.py makemigrations

Just upgraded django_mailbox (django-mailbox (4.3.0)) with pip. And now have some problem with migrations, manage.py propose me to make new migrations for django_mailbox ( i think it's not good idea for site-packages):

% ./manage.py makemigrations --dry-run -v 3 django_mailbox

Migrations for 'django_mailbox':
  0003_auto_20150408_1241.py:
    - Alter field eml on message
Full migrations file '0003_auto_20150408_1241.py':
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

    dependencies = [
        ('django_mailbox', '0002_add_eml_to_message'),
    ]

    operations = [
        migrations.AlterField(
            model_name='message',
            name='eml',
            field=models.FileField(help_text='Original full content of message', upload_to=b'messages', null=True, verbose_name='Raw message contents'),
            preserve_default=True,
        ),
    ]

Previous migration, the only difference is verbose_name..

from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

    dependencies = [
        ('django_mailbox', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='message',
            name='eml',
            field=models.FileField(help_text='Original full content of message', upload_to=b'messages', null=True, verbose_name='Message as a file'),
            preserve_default=True,
        ),
    ]

Storing original message

Hello,

During using this package by IMAP transport I observe the message was removed from server after processing. I can reproduce msg file, but with changes in eg. attachment, headers order.

Is there any reason to not add extra model FileField to store original msg file (*.eml) without any changes? I want use data processes by django_mailbox in court, so this is important for me. I know this can produce high capacity usage, so I think about extra settings DJANGO_MAILBOX_STORE_ORIGINAL_MESSAGE .

I can implement that.

Q. How to test incoming messages ?

Hello,
I'm trying to test the message part of my application.

I can create Mailboxes and link it to my test users, but how to simulate new incoming messages ?
I have to fill ALL the Message objects and save it or there is a simply way ?

Thanks in advance !

Encoding error: Don Quijote from Thunderbird

Hi, thanks for a great app! It's a lifesaver for my work. I noticed a recurring problem as of recent. If I send the first paragraph of Don Quijote (won't copy it here: http://letrasobscuras.blogspot.com/2007/07/primeras-lneas-el-ingenioso-hidalgo-don.html) from Gmail, everything is fine when I download the message with django_mailbox. But if I use Thunderbird, I get an encoding error as shown below:

 ERROR [...]: 'ascii' codec can't decode byte 0xc3 in position 3360: ordinal not in range(128)
Traceback (most recent call last):
[...]
  File "/home/ubuntu/Envs/peanutbutter/local/lib/python2.7/site-packages/django_mailbox/models.py", line 584, in get_email_object
    body = self.get_body()
  File "/home/ubuntu/Envs/peanutbutter/local/lib/python2.7/site-packages/django_mailbox/models.py", line 574, in get_body
    return self.body.encode('utf-8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3360: ordinal not in range(128)

Does this seem like something django_mailbox could handle correctly, or maybe fail gracefully by dropping invalid characters? I'm thinking:

return self.body.encode('utf-8', 'ignore')

In-Reply-To is empty in a fetched e-mail

This is a kind of follow-up to issue #39.

I have sent an e-mail from my Django website; I used a method explained in the issue #25: first send the message, then make a record in the mailbox.

The message went out fine, it has the non-empty Message-ID, I've found it in the inbox on the other side (GMail box), and then I've sent a reply back. Then I've ran get_new_mail back in my Django website.

And here is the problem: the In-Reply-To header is empty in the local copy of my reply. The original message does contain this header, it is not empty, and it contains the ID of the message that has originally been replied to.

I can see that replies are processed so I assume that such behaviour is not intended.

What might be a problem here?

Quick update: looks like I've found the problem. In fact, message-IDs in the sent message and its local copy are not the same. Looks like I need to reopen #39.

TypeError when getting mail

First of all - awesome work.
This library will be quite useful to me, especially when I have customized it a bit :)

But I get the following error when using getmail:
TypeError: info must be a string: <type 'unicode'>

The test messages are just plain text. Can't seem to figure out why it says this?

//rulzart

Problem when attachment's filenames are encoded

Hi Adam,

I think there might be a bug in the get_filename method of MessageAttachment class when attachment's name contains non-ascii chars.

To reproduce this bug, you can send an email with a file named test_é.pdf (here is a sample code to create such an empty file, whose filename is unicode : os.close(os.open("test_\xc3\xa9.pdf", os.O_CREAT))).

In the mail body, the attachment's name might appear as Content-Disposition: attachment; filename*=iso-8859-1''test_%E9%2Epdf (or Content-Disposition: attachment; filename*=utf-8''test_%C3%A9%2Epdf I guess, depending on the encoding), which is the correct header, but when getting the filename through get_filename, I got a unicode containing PJ_é.pdf (which is "\xc3\xa9".decode("iso-8859-1")).

In fact, in get_filename, the file_name got from file_name = self._get_rehydrated_headers().get_filename() already is unicode, but is decoded using default charset (iso-8859-1) by convert_header_to_unicode.

Here is a pull-request with a fix

GMAIL OAuth2 gives AUTHENTICATIONFAILED

Hello,

I am using python-social-auth.
Its working well and I can login to my site using google.

However, when I follow the docs, and use like this
gmail+ssl://youremailaddress%40yourdomain.com.com:[email protected]?archive=Archived
It always gives authentication failed, presumably because the oauth2 password fails.
But why does it even need to use the password? It should be able to grab the auth token from python social auth.

The docs could be missing something?
but in the code, get_connection method seems to always try to use a password

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.