mirror of
https://github.com/coddingtonbear/django-mailbox.git
synced 2026-07-10 06:48:19 +02:00
Merge pull request #3 from mathandpencil/office365-imap
django-mailbox: support office365 oauth2
This commit is contained in:
commit
3ca0b90725
3 changed files with 80 additions and 1 deletions
|
|
@ -31,7 +31,7 @@ from django_mailbox import utils
|
||||||
from django_mailbox.signals import message_received
|
from django_mailbox.signals import message_received
|
||||||
from django_mailbox.transports import Pop3Transport, ImapTransport, \
|
from django_mailbox.transports import Pop3Transport, ImapTransport, \
|
||||||
MaildirTransport, MboxTransport, BabylTransport, MHTransport, \
|
MaildirTransport, MboxTransport, BabylTransport, MHTransport, \
|
||||||
MMDFTransport, GmailImapTransport
|
MMDFTransport, GmailImapTransport, Office365Transport
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
@ -216,6 +216,14 @@ class Mailbox(models.Model):
|
||||||
archive=self.archive
|
archive=self.archive
|
||||||
)
|
)
|
||||||
conn.connect(self.username, self.password)
|
conn.connect(self.username, self.password)
|
||||||
|
elif self.type == 'office365':
|
||||||
|
conn = Office365Transport(
|
||||||
|
self.location,
|
||||||
|
self.username,
|
||||||
|
folder=self.folder,
|
||||||
|
archive=self.archive
|
||||||
|
)
|
||||||
|
conn.connect()
|
||||||
elif self.type == 'pop3':
|
elif self.type == 'pop3':
|
||||||
conn = Pop3Transport(
|
conn = Pop3Transport(
|
||||||
self.location,
|
self.location,
|
||||||
|
|
|
||||||
|
|
@ -8,3 +8,4 @@ from django_mailbox.transports.babyl import BabylTransport
|
||||||
from django_mailbox.transports.mh import MHTransport
|
from django_mailbox.transports.mh import MHTransport
|
||||||
from django_mailbox.transports.mmdf import MMDFTransport
|
from django_mailbox.transports.mmdf import MMDFTransport
|
||||||
from django_mailbox.transports.gmail import GmailImapTransport
|
from django_mailbox.transports.gmail import GmailImapTransport
|
||||||
|
from django_mailbox.transports.office365 import Office365Transport
|
||||||
|
|
|
||||||
70
django_mailbox/transports/office365.py
Normal file
70
django_mailbox/transports/office365.py
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
from .base import EmailTransport, MessageParseError
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class Office365Transport(EmailTransport):
|
||||||
|
def __init__(
|
||||||
|
self, hostname, username, archive='', folder=None
|
||||||
|
):
|
||||||
|
self.integration_testing_subject = getattr(
|
||||||
|
settings,
|
||||||
|
'DJANGO_MAILBOX_INTEGRATION_TESTING_SUBJECT',
|
||||||
|
None
|
||||||
|
)
|
||||||
|
self.hostname = hostname
|
||||||
|
self.username = username
|
||||||
|
self.archive = archive
|
||||||
|
self.folder = folder
|
||||||
|
|
||||||
|
def connect(self):
|
||||||
|
try:
|
||||||
|
import O365
|
||||||
|
except ImportError:
|
||||||
|
raise ValueError(
|
||||||
|
"Install o365 to use oauth2 auth for office365"
|
||||||
|
)
|
||||||
|
|
||||||
|
credentials = (settings.MICROSOFT_O365_CLIENT_ID, settings.MICROSOFT_O365_CLIENT_SECRET)
|
||||||
|
|
||||||
|
if not os.path.isdir(settings.O365_TOKEN_PATH):
|
||||||
|
os.mkdir(settings.O365_TOKEN_PATH)
|
||||||
|
|
||||||
|
token_path=os.path.join(settings.O365_TOKEN_PATH, 'token.txt')
|
||||||
|
self.account = O365.Account(credentials, auth_flow_type='credentials', tenant_id=settings.MICROSOFT_O365_TENENT_ID, token_path=token_path)
|
||||||
|
self.account.authenticate()
|
||||||
|
|
||||||
|
self.mailbox = self.account.mailbox(resource=self.username)
|
||||||
|
self.mailbox_folder = self.mailbox.inbox_folder()
|
||||||
|
if self.folder:
|
||||||
|
self.mailbox_folder = self.mailbox.get_folder(folder_name=self.folder)
|
||||||
|
|
||||||
|
def get_message(self, condition=None):
|
||||||
|
archive_folder = None
|
||||||
|
if self.archive:
|
||||||
|
archive_folder = self.mailbox.get_folder(folder_name=self.archive)
|
||||||
|
if not archive_folder:
|
||||||
|
archive_folder = self.mailbox.create_child_folder(self.archive)
|
||||||
|
|
||||||
|
for o365message in self.mailbox_folder.get_messages(order_by='receivedDateTime'):
|
||||||
|
try:
|
||||||
|
mime_content = o365message.get_mime_content()
|
||||||
|
message = self.get_email_from_bytes(mime_content)
|
||||||
|
|
||||||
|
if condition and not condition(message):
|
||||||
|
continue
|
||||||
|
|
||||||
|
yield message
|
||||||
|
except MessageParseError:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if self.archive and archive_folder:
|
||||||
|
o365message.copy(archive_folder)
|
||||||
|
|
||||||
|
o365message.delete()
|
||||||
|
return
|
||||||
Loading…
Add table
Add a link
Reference in a new issue