有馬総一郎のブログ

(彼氏の事情)

2021年08月30日 23:00:28 JST - 4 minute read - Linux

OfflineIMAPとNeoMuttを合わせて使う 前半(失敗例)

neomutt、一度メールヘッダーをキャッシュさせれば、次回からの起動は10秒もかからないが、それでも参照するラベル(フォルダ)を変えたりすると、少々待たされる。裏で読んでくれるとありがたいのだけど、読み終わるまで操作できないのが玉に瑕。ということで OfflineIMAPを導入して少しでも快適にメール操作したい。

こちら前半は失敗ばかり書き連ねているので、とっとと成功例を知りたい人は 後半へ

isyncは失敗

初めは isyncを導入しようとしたのだけど、以下にように認証エラーになってしまうので諦めた。

$  mbsync -a
Notice: Master/Slave are deprecated; use Far/Near instead.
C: 0/1  B: 0/0  F: +0/0 *0/0 #0/0  N: +0/0 *0/0 #0/0
IMAP command 'AUTHENTICATE PLAIN <authdata>' returned an error: NO [AUTHENTICATIONFAILED] Invalid credentials (Failure)
C: 1/1  B: 0/0  F: +0/0 *0/0 #0/0  N: +0/0 *0/0 #0/0

ちなみに

#Pass
# To store the password in an encrypted file use PassCmd instead of Pass
PassCmd "gpg2 -q --for-your-eyes-only --no-tty -d ~/.config/neomutt/mailpass.gpg"

PassでもPassCmdどっちも駄目だった。ちゃんとコマンド上で確認してもパスワードやユーザー名が合っているのに…1

OfflineIMAP

ということで OfflineIMAP - ArchWikiを見て設定していく。

手続きとしては難しくない。設定ファイルさえ ちゃんと 記述できれば、という当たり前な条件付きだが。

 $ mkdir ~/Maildir
 $ nvim $HOME/.offlineimaprc
 $ offlineimap
 $ nvim $HOME/.config/neomutt/neomuttrc

ドキュメントをちゃんと読むなり、ちゃんと知ってる人がみたら、バカじゃないか?というエラーにぶち当ったので、折角なので解説していく。

アカウント名が違うエラー

OfflineIMAP 7.3.4
  Licensed under the GNU GPL v2 or any later version (with an OpenSSL exception)
imaplib2 v2.101 (bundled), Python v2.7.18, OpenSSL 1.1.1k  25 Mar 2021
Account sync main:
ERROR: Could not find section 'Repository main-remote' in configuration. Required for account 'main'.
ERROR: Exceptions occurred during the run!
ERROR: Could not find section 'Repository main-remote' in configuration. Required for account 'main'.

Traceback:
  File "/usr/lib/python2.7/site-packages/offlineimap/accounts.py", line 278, in syncrunner
    self.remoterepos = Repository(self, 'remote')
  File "/usr/lib/python2.7/site-packages/offlineimap/repository/__init__.py", line 73, in __new__
    exc_info()[2])
  File "/usr/lib/python2.7/site-packages/offlineimap/repository/__init__.py", line 67, in __new__
    repostype = config.get('Repository ' + name, 'type').strip()
  File "/usr/lib/python2.7/ConfigParser.py", line 607, in get
    raise NoSectionError(section)

アカウント名がズレてる。

[Account main]
[Repository main-local]
[Repository main-remote]

と合わせる必要がある。 ArchWikiにはGmail の設定として[Repository gmail-remote]と記述されているので、コピペするとこうなる。

括弧が足らないエラー

$ offlineimap
OfflineIMAP 7.3.4
  Licensed under the GNU GPL v2 or any later version (with an OpenSSL exception)
imaplib2 v2.101 (bundled), Python v2.7.18, OpenSSL 1.1.1k  25 Mar 2021
Thread 'Account sync main' terminated with exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/offlineimap/threadutil.py", line 159, in run
    Thread.run(self)
  File "/usr/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib/python2.7/site-packages/offlineimap/accounts.py", line 278, in syncrunner
    self.remoterepos = Repository(self, 'remote')
  File "/usr/lib/python2.7/site-packages/offlineimap/repository/__init__.py", line 84, in __new__
    return repo(name, account)
  File "/usr/lib/python2.7/site-packages/offlineimap/repository/Gmail.py", line 33, in __init__
    IMAPRepository.__init__(self, reposname, account)
  File "/usr/lib/python2.7/site-packages/offlineimap/repository/IMAP.py", line 37, in __init__
    BaseRepository.__init__(self, reposname, account)
  File "/usr/lib/python2.7/site-packages/offlineimap/repository/Base.py", line 55, in __init__
    self.getconf('nametrans'), {'re': re})
  File "/usr/lib/python2.7/site-packages/offlineimap/localeval.py", line 48, in eval
    return eval(text, names)
  File "<string>", line 1
    lambda foldername:
                     ^
SyntaxError: invalid syntax

フォルダ名の変更の設定で、括弧が足りてなかった。

nametrans = lambda foldername: re.sub('^\[Gmail\]/ゴミ箱', 'ゴミ箱',
                               re.sub('^\[Gmail\]/スター付き', 'スター付き',
                               re.sub('^\[Gmail\]/迷惑メール', '迷惑メール',
                               re.sub('^\[Gmail\]/下書き', '下書き',
                               re.sub('^\[Gmail\]/迷惑メール', '迷惑メール',
                               re.sub('^\[Gmail\]/送信済みメール', '送信済みメール',
                               re.sub('^\[Gmail\]/重要', '重要', foldername)))))))

とちゃんと閉じられるように記述する。

削除されたオプションを指定していた

Last 1 debug messages logged for Account sync main prior to exception:
thread: Register new thread 'Account sync main' (account 'main')
 arimasou16  lemur  ~  100  %  offlineimap
OfflineIMAP 7.3.4
  Licensed under the GNU GPL v2 or any later version (with an OpenSSL exception)
imaplib2 v2.101 (bundled), Python v2.7.18, OpenSSL 1.1.1k  25 Mar 2021
Account sync main:
ERROR: the 'status_backend' configuration option is not supported anymore; please, remove this configuration option.
ERROR: Exceptions occurred during the run!
ERROR: the 'status_backend' configuration option is not supported anymore; please, remove this configuration option.

Traceback:
  File "/usr/lib/python2.7/site-packages/offlineimap/accounts.py", line 280, in syncrunner
    self.statusrepos = Repository(self, 'status')
  File "/usr/lib/python2.7/site-packages/offlineimap/repository/__init__.py", line 58, in __new__
    return LocalStatusRepository(name, account)
  File "/usr/lib/python2.7/site-packages/offlineimap/repository/LocalStatus.py", line 45, in __init__
    OfflineImapError.ERROR.REPO

status_backend = sqliteが要らなかった。 ArchWikiMinimalには存在しているが削除する必要があった。

ちょっと調べると status_backend replacement? · Issue #527 · OfflineIMAP/offlineimap · GitHubには、それまでデフォルトがテキストだったけど、今ではsqliteだけしか対応していないために、このオプションは削除されたとのこと。

回答にもあるが、sqliteをインストール記憶がなかったが、find ~/.offlineimap/* -type f -exec file '{}' \+で確認すると

/home/arimasou16/.offlineimap/Account-main/LocalStatus-sqlite/INBOX:                                     SQLite 3.x database, last written using SQLite version 3036000

とちゃんと使われいた。

長くなったので 続く


  1. offlineimapでは成功しているのでアプリ側の問題と思うのだけど。 ↩︎