Gmailのバックアップ環境を作る

Gmailのバックアップ環境を作る

June 30, 2019
Mail

構成 #

  • getmailでGmailからIMAPで受信しMaildir形式で保存
  • dovecotでMaildirをIMAPでLAN内に公開
  • rainloopでブラウザから閲覧
  • 受信のプッシュ通知とかは今のところ無し

getmail #

mailboxes に日本語の存在しないフォルダを指定するとエラーになる #

  • Ubuntu 18.04 LTS
  • Python 2.7.15+

mailboxes = ALL だと二重に受信しているような気がするので mailboxes = ("[Gmail].すべてのメール", ) としたとき

Unhandled exception follows:
    File "/usr/bin/getmail", line 892, in main
    success = go(configs, options.idle)
    File "/usr/bin/getmail", line 171, in go
    'permissions\n' % (mailbox.encode('utf-8'), o))
  UnicodeEncodeError: 'ascii' codec can't encode characters in position 8-14: ordinal not in range(128)

LC_ALL=ja_JP.UTF8 getmail ... とする

% python -c 'import sys; print(sys.getdefaultencoding())'
ascii

上記は未解決だが,存在しないフォルダを指定したときのエラーメッセージを出そうとして死んでるみたいなので mailboxes を修正

mailboxes = ("[Gmail]/すべてのメール", )

dovecot #

% sudo apt install dovecot-imapd

  • /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir:LAYOUT=fs
  • /etc/dovecot/conf.d/10-auth.conf
auth_mechanisms = plain cram-md5
#!include auth-system.conf.ext
!include auth-passwdfile.conf.ext
  • /etc/dovecot/users
<username>:{CRAM-MD5}xxx ... xxx:<uid>:<gid>::<homedir>

パスワード部分は doveadm pw -s CRAM-MD5 で生成

% sudo chown root:dovecot users

% sudo chmod 640 users

plaintext認証でログインできない #

/var/log/mail.logには下記のようなログが残る

dovecot: imap-login: Aborted login (no auth attempts in 0 secs): user=<>, rip=X.X.X.X, lip=X.X.X.X, session=<XXXXXXXXXXXXXXX>

SSL無効だとplaintext認証が無効になる
解除するには/etc/dovecot/conf.d/10-auth.confdisable_plaintext_auth = no

ついでに古いメーラーのメールもMaildirにぶっこむ #

変換失敗? #

EdMaxでエクスポートしたファイルを変換するとメール数が減ってる

% grep ^From\\s bar.mbox | wc -l
423
% mb2md -s bar.mbox -d ~/temp
Converting /home/foo/bar.mbox to maildir: /home/foo/temp
Source Mbox is /home/foo/bar.mbox
Target Maildir is /home/foo/temp
333 messages.

90通減ってる?

“From " で始まる行の前に空行が無いと前のメールと同じメールとして変換されてしまう

適当に修正

#!/usr/bin/perl
use strict;
use warnings;
use utf8;

my $prev_line = '';

while(<STDIN>)
{
    if (/^From\s/ && $prev_line !~ /^$/) {
        print "\n";
    }
    print;
    $prev_line = $_;
}

rainloop #

参考 #