shell/mu: offlineimap => mbsync + refactor

This commit is contained in:
Henrik Lissner 2017-04-14 14:11:33 -04:00
parent 4f66acff53
commit 921a445348
4 changed files with 173 additions and 30 deletions

131
shell/mu/.mbsyncrc Normal file
View file

@ -0,0 +1,131 @@
########################################
# gmail.com
########################################
IMAPAccount gmail
Host imap.gmail.com
User hlissner@gmail.com
PassCmd "pass email/gmail.com | head -n1"
Port 993
AuthMechs LOGIN
SSLType IMAPS
CertificateFile /etc/ssl/certs/ca-certificates.crt
# CertificateFile /usr/local/etc/openssl/cert.pem # MacOS
##
# Remote
IMAPStore gmail-remote
Account gmail
# Local
MaildirStore gmail-local
Path ~/.mail/gmail.com/
Inbox ~/.mail/gmail.com/Inbox
## Connections
Channel gmail-all
Master :gmail-remote:"[Gmail]/All Mail"
Slave :gmail-local:"All Mail"
Create Both
Expunge Both
SyncState *
Channel gmail-inbox
Master :gmail-remote:"INBOX"
Slave :gmail-local:"Inbox"
Create Both
Expunge Both
SyncState *
Channel gmail-drafts
Master :gmail-remote:"[Gmail]/Drafts"
Slave :gmail-local:"Drafts"
Create Both
Expunge Both
SyncState *
Channel gmail-sent
Master :gmail-remote:"[Gmail]/Sent Mail"
Slave :gmail-local:"Sent Mail"
Create Both
Expunge Both
SyncState *
Channel gmail-trash
Master :gmail-remote:"[Gmail]/Trash"
Slave :gmail-local:"Trash"
Create Both
Expunge Both
SyncState *
## Groups
Group gmail
Channel gmail-all
Channel gmail-inbox
Channel gmail-drafts
Channel gmail-sent
Channel gmail-trash
# ########################################
# # lissner.net
# ########################################
IMAPAccount lissner
Host imap.gmail.com
User henrik@lissner.net
PassCmd "pass email/lissner.net | head -n1"
Port 993
AuthMechs LOGIN
SSLType IMAPS
CertificateFile /etc/ssl/certs/ca-certificates.crt
# CertificateFile /usr/local/etc/openssl/cert.pem # MacOS
IMAPStore lissner-remote
Account lissner
MaildirStore lissner-local
Path ~/.mail/lissner.net/
Inbox ~/.mail/lissner.net/Inbox
## Connections
Channel lissner-all
Master :lissner-remote:"[Gmail]/All Mail"
Slave :lissner-local:"All Mail"
Create Both
Expunge Both
SyncState *
Channel lissner-inbox
Master :lissner-remote:"INBOX"
Slave :lissner-local:"Inbox"
Create Both
Expunge Both
SyncState *
Channel lissner-drafts
Master :lissner-remote:"[Gmail]/Drafts"
Slave :lissner-local:"Drafts"
Create Both
Expunge Both
SyncState *
Channel lissner-sent
Master :lissner-remote:"[Gmail]/Sent Mail"
Slave :lissner-local:"Sent Mail"
Create Both
Expunge Both
SyncState *
Channel lissner-trash
Master :lissner-remote:"[Gmail]/Trash"
Slave :lissner-local:"Trash"
Create Both
Expunge Both
SyncState *
# ## Groups
Group lissner
Channel lissner-all
Channel lissner-inbox
Channel lissner-drafts
Channel lissner-sent
Channel lissner-trash

View file

@ -1,13 +1,16 @@
[general]
accounts = Lissner,Gmail
pythonfile = ~/.dotfiles/shell/mu/offlineimaprc.py
maxsynaccounts = 2
pythonfile = ~/.dotfiles/shell/mu/lib.py
fsync = False
[DEFAULT]
[Account Gmail]
localrepository = LocalGmail
remoterepository = RepositoryGmail
autorefresh = 5
quick = 10
postsynchook = mu index --maildir ~/.mail/gmail.com
postsynchook = mu index --maildir ~/.mail
status_backend = sqlite
[Repository LocalGmail]
@ -20,6 +23,7 @@ type = Gmail
remoteusereval = get_pass("gmail.com")["user"]
remotepasseval = get_pass("gmail.com")["password"]
folderfilter = folder_filter
realdelete=no
ssl = true
sslcacertfile = /usr/local/etc/openssl/cert.pem # This will only work for macOS
sslcacertfile = /etc/ssl/certs/ca-certificates.crt
@ -29,8 +33,7 @@ nametrans = nametrans_reverse
[Account Lissner]
localrepository = LocalLissner
remoterepository = RepositoryLissner
quick = 10
postsynchook = mu index --maildir ~/.mail/lissner.net
postsynchook = mu index --maildir ~/.mail
status_backend = sqlite
[Repository LocalLissner]
@ -43,6 +46,7 @@ type = Gmail
remoteusereval = get_pass("lissner.net")["user"]
remotepasseval = get_pass("lissner.net")["password"]
folderfilter = folder_filter
realdelete=no
ssl = true
sslcacertfile = /usr/local/etc/openssl/cert.pem # This will only work for macOS
sslcacertfile = /etc/ssl/certs/ca-certificates.crt

32
shell/mu/lib.py Executable file
View file

@ -0,0 +1,32 @@
#!/usr/bin/env python
from subprocess import check_output
from re import sub
import sys
def get_pass(account):
data = check_output("/usr/bin/pass email/" + account, shell=True).splitlines()
password = data[0]
tmp = [x for x in data if x.startswith('address:')]
user = ""
if len(tmp) > 0:
user = tmp[0].split(":", 1)[1]
return {"password": password, "user": user}
def folder_filter(name):
return not (name in ['[Gmail]/Spam',
'[Gmail]/Important',
'[Gmail]/Starred',
'[Gmail]/All Mail'] or
name.startswith('[Airmail]'))
def nametrans(name):
return sub('^INBOX/(Starred|Sent Mail|Drafts|Trash|All Mail|Spam)$', '[Gmail]/\\1', name)
def nametrans_reverse(name):
return sub('^(\[Gmail\])', 'INBOX.', name)
if __name__ == '__main__':
print(get_pass(sys.argv[1].strip())['password'])

View file

@ -1,24 +0,0 @@
#!/usr/bin/env python
from subprocess import check_output
from re import sub
def get_pass(account):
data = check_output("pass email/" + account, shell=True).splitlines()
password = data[0]
tmp = [x for x in data if x.startswith('address:')]
user = ""
if len(tmp) > 0:
user = tmp[0].split(":", 1)[1]
return {"password": password, "user": user}
def folder_filter(name):
return not (name in ['[Gmail]/Spam', '[Gmail]/Important'] or
name.startswith('[Airmail]'))
def nametrans(name):
return sub('^(Starred|Sent Mail|Drafts|Trash|All Mail|Spam)$', '[Gmail]/\\1', name)
def nametrans_reverse(name):
return sub('^(\[Gmail\]/)', '', name)