docker-offlineimap/offlineimap/repository/Gmail.py
Ævar Arnfjörð Bjarmason 7b59d6b3ae GMail: Add ability to set a custom host/port/ssl etc.
The GMail repository added in 81b86fb has the restriction that you
can't override the host/port/ssl etc. There's no good reason for this,
and I'd like to use some of the defaults while connecting to GMail via
an stunnel, i.e.:

    $ grep -v -e ^# -e ^$ .stunnel.work-gmail-imap
    foreground = yes
    debug = info
    pid =
    [work-imap-gmail-ssl-tunnel]
    client = yes
    accept = 127.0.0.1:1431
    connect = imap.gmail.com:993
    delay = yes

And then in my .offlineimaprc:

    type = Gmail
    remotehost = localhost
    remoteport = 1431
    ssl = no

While I was at it I also allowed overriding all the other previously
hardcoded options, e.g. the "oauth2_request_url" can now be overridden
to e.g. a local non-https proxy to sniff & debug the traffic going
over the wire.

This doesn't break any existing configuration, since we still use the
provided defaults. It just allows odd uses like my own to use this
repository while e.g. not having to supply "trashfolder", "spamfolder"
& "oauth2_request_url". While I'm at it document in the
offlineimap.conf that we're setting those options to defaults in this
repository.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Nicolas Sebrecht <nicolas.s-dev@laposte.net>
2016-11-17 17:53:38 +01:00

107 lines
3.9 KiB
Python

# Gmail IMAP repository support
# Copyright (C) 2008 Riccardo Murri <riccardo.murri@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
from offlineimap.repository.IMAP import IMAPRepository
from offlineimap import folder, OfflineImapError
class GmailRepository(IMAPRepository):
"""Gmail IMAP repository.
This class just has default settings for GMail's IMAP service. So
you can do 'type = Gmail' instead of 'type = IMAP' and skip
specifying the hostname, port etc. See
http://mail.google.com/support/bin/answer.py?answer=78799&topic=12814
for the values we use."""
def __init__(self, reposname, account):
"""Initialize a GmailRepository object."""
IMAPRepository.__init__(self, reposname, account)
def gethost(self):
"""Return the server name to connect to.
We first check the usual IMAP settings, and then fall back to
imap.gmail.com if nothing is specified."""
try:
return super(GmailRepository, self).gethost()
except OfflineImapError:
# Nothing was configured, cache and return hardcoded
# one. See the parent class (IMAPRepository) for how this
# cache is used.
self._host = "imap.gmail.com"
return self._host
def getoauth2_request_url(self):
"""Return the OAuth URL to request tokens from.
We first check the usual OAuth settings, and then fall back to
https://accounts.google.com/o/oauth2/token if nothing is
specified."""
url = super(GmailRepository, self).getoauth2_request_url()
if url is None:
# Nothing was configured, cache and return hardcoded one.
self.setoauth2_request_url("https://accounts.google.com/o/oauth2/token")
else:
self.setoauth2_request_url(url)
return self.oauth2_request_url
def getport(self):
"""Return the port number to connect to.
This Gmail implementation first checks for the usual IMAP settings
and falls back to 993 if nothing is specified."""
port = super(GmailRepository, self).getport()
if port is None:
return 993
else:
return port
def getssl(self):
ssl = self.getconfboolean('ssl', None)
if ssl is None:
# Nothing was configured, return our default setting for
# GMail. Maybe this should look more similar to gethost &
# we could just rely on the global "ssl = yes" default.
return True
else:
return ssl
def getpreauthtunnel(self):
return None
def getfolder(self, foldername):
return self.getfoldertype()(self.imapserver, foldername,
self)
def getfoldertype(self):
return folder.Gmail.GmailFolder
def gettrashfolder(self, foldername):
# Where deleted mail should be moved
return self.getconf('trashfolder', '[Gmail]/Trash')
def getspamfolder(self):
# Depending on the IMAP settings (Settings -> Forwarding and
# POP/IMAP -> IMAP Access -> "When I mark a message in IMAP as
# deleted") GMail might also deletes messages upon EXPUNGE in
# the Spam folder.
return self.getconf('spamfolder', '[Gmail]/Spam')