はじめに
google mail(以下gmail)、今まではpop取り込みで、一部のアカウントのバックアップをローカルのメーラーに残すようにしていたのですが、どうも、来年(2026年)の1月に、popサポート辞めてしまうみたい[GMAIL_POP]なので、「imap取り込みを試さないと!」、と一念発起(?)、しました。
注)余談2で書きましたが、これは、自分の早合点だったようです。
[GMAIL_POP] https://support.google.com/mail/answer/16604719?hl=ja
WSL2上でとりあえず
ファイルサーバとして動いているwindows PC上でバックアップ目的のローカルメーラーをpop取り込みで、ずっと動かしてきていることもあって、
1)linuxを使う場合は、on WSL2、
2)ローカルのメーラーはpop取り込み、
は、私的には譲れず。
※理由は「長年使ってきたon windowsのSylpheedで引き続きバックアップがしたいため」。
gmailサーバからのimap取り込み
gmailサーバからのimap取り込み、ネット検索すると、fetchmailとgetmailというのを見つけた。
fetchmailは昔使っていたことがあったのと、getmailはなんだか使いにくそうなので、fetchmailを選択。
バックエンドはpostfix、対メーラーのpopサーバはdovcotを選択。
いづれも、ubuntuなので、「apt install」でインストール。
postfixのvirtual user設定を試す
virtual userなる設定がpostfixでできるようだったので、試してみた。
下記は、追加変更したファイル&修正箇所の抜粋。
・・・
myhostname = localhost
mydomain = localhost
・・・
inet_interfaces = loopback-only
・・・
# ==================================
# for virtual domain.
# ==================================
##inet_interfaces = all
mydestionation =
・・・
virtual_mailbox_domains = gmail.com
virtual_mailbox_base = /var/spool/テキトーなディレクトリ
virtual_mailbox_maps = hash:/etc/postfix/virtual-mailbox
virtual_alias_maps = hash:/etc/postfix/valias_map
virtual_uid_maps = static:使うUID
virtual_gid_maps = static:使うGID
・・・
127.0.0.1:smtp inet n - y - - smtpd
-o smtpd_sasl_auth_enable=yes
-o smtpd_recipent_restrictions=permit_sasl_authenticated,reject
・・・
自垢1@gmail.com gmail.com/自垢1/Maildir/
自垢2@gmail.com gmail.com/自垢2/Maildir/
・・・
(今回は空)
これらの設定を入れてrestartすると、「自垢1@gmail.com」なメールをpostfixが受け取ると、自分宛てと認識して、「/var/spool/テキトーなディレクトリ/gmail.com/自垢1/Maildir/」にspoolしてくれた。
techmailのfetchmailrcを設定してみる
とりあえず、imap over SSLでgmailのimapサーバからメール取得し、postfixには「自垢@gmail.com」で投げるように設定をfetchmailrcに記載。
# common
set no bouncemail
set invisible
set syslog
# all servers.
defaults
timeout 600
bad-header accept
uidl
protocol auto
no mimedecode
no fetchall
keep
#
poll imap.gmail.com protocol imap
port 993
username "自垢1"
password "自垢1のパス"
ssl
sslproto TLS1.2+
is 自垢1@gmail.com here
#
poll imap.gmail.com protocol imap
port 993
username "自垢2"
password "自垢2のパス"
ssl
sslproto TLS1.2+
is 自垢2@gmail.com here
#
・・・
gmailからの取り込み時の認証、真面目にやるには、OAuthを使うほうが良いみたいなのだが、とりあえず動かしてみるというところで、安易な方法(username, password)でまずはお試し。
gmailサーバのimap取り込みでハマる
オプション無しで起動すると何も取り込まなかった(理由は後述)ため、まずは、全部を取り込む、「--fetchall」オプションを付けて、全部取り込み。
2,000通くらいのgmailアカウントだとわりとすんなり取り込まれて、postfixの指定したspoolに溜まってくれた。
ところが、15万通くらいあるアカウントだと、socket errorが出たり、eofエラーが出たりと、すんなりとは全数は取り込ませてはくれず。
幾度か試すと、10万通くらいは運よく取り込めることがあった。
muttで重複メール整理
幾度か取り込むと重複メールがspoolされるため、on WSL2なubuntuで動くCLIなメーラー、muttを使って、spool内のメールを整理。
muttは普通に「apt install」でインストール。
mbox形式、Maildir形式の両方をサポートしてくれているスグレモノ。
$ mutt -f /var/spool/テキトーなディレクトリ/gmail.com/自垢1/Maildir
メール一覧が出たところで、muttな重複メール削除の呪文(キー操作)を詠唱。
T
~=<ENTER>
;d<ENTER>
これで、重複しているメールに「削除」タグが付くため、「q」で終了をすると、「~/Maildir」内の重複メールが削除される。
fetchmailのimap時の既取り込み管理
どうもいろいろ調べてみると、imap取り込みの場合は、既取り込み管理は、imapサーバ上で、「既読」なら「取り込み済み」、「未読」なら「未取り込み」としていることがわかってきた。
取り込み対象のgmailアカウントでは、取り込み時にはたまたま、メールがすべて既読となっていたため、「--fetchall」を指定しないと「全て取り込み済み」とfetchmailが認識して、新たな取り込みをしてくれない、という動作になっていた様子。(前述のfetchmailが「--fetchall」オプション無しではメールを取り込まなかった原因)
pop3だとuidlというローカル側でユニークなid管理で、良しなに既取り込み管理をしてくれていたのだけれど、imapは違うみたい。
gitlabを追いかけてみたところ、imapについても、似たようなアプローチのコードが過去に書かれたことがあった[fetchmail_imap1][fetchmail_imap2]みたいだが、結局はmainブランチに取り込まれず、left issue化[fetchmail_TODO_Serious]しているみたい。
[ftechmail_imap1] https://gitlab.com/fetchmail/fetchmail/-/merge_requests/9
[fetchmail_imap22] https://gitlab.com/fetchmail/fetchmail/-/merge_requests/8
[fetchmail_TODO_Serious] https://www.fetchmail.info/todo.html
Serious Let IMAP code use UID and UIDVALIDITY rather than relying on flags that everyone can alter.
fetchmail、公式のtopページをみると、一応、継続開発されている様子。
gmailのimap取り込みと「inbox」
gmailのimap取り込み場合、どうも、「inbox」にあるメールのみがfetchmailでimap経由の取り込み対象になることが判明。
そこで、15万通のメールのあるアカウント、今まで取り込めた分を日付検索して、取り込み済みメールを「アーカイブ」(「inbox」から「すべてのメール」に移す?)したところ、gmail上ではメール自体は削除されずに、inboxのメール数のみを5万通くらいに減らすことができた。
結果、fetchmailは、「--fetchall」を指定した場合、inboxにある5万通のみを全数として取り込む動作になった。
メール自体は残っているため、gmailのwebメール上で検索した場合でも、「アーカイブ」されたメールも検索され、検索結果に出てくる。
その後、幾度か取り込みをしたところ、今度は3万通ほど新しく取り込めたため、同じく、取り込んだメールを「アーカイブ」にして、inboxは2万通弱に。
今度は、この2万通弱を「未読」にしたところ、「--fetchall」無しでも、fetchmailが取り込むように。(やったね!>自分)
取り込み対象は、事前に「未読」に
imap取り込みの際は、fetchmailがimapサーバー上の「未読」で「未取り込み」を管理している。
たとえば、スマホのgmailアプリで、fetchmail未取り込みのメールをうっかり(?)「既読」にしてしまった場合、そのまま、fetchmailを「--fetchall」無しで起動すると、そのメールはgmailサーバからはimap取り込みされない。
そのため、muttで、ローカル側の最新メールの日付を確認して、それより新しいメールを未読マークしてからfetchmailで取り込むのが良さそうな気がした。
余談1、googleアプリの「エクスポート」機能
googleアカウントでは、gmailを含む、googleアプリの「エクスポート」機能というのが提供されているようで、それを使うと、現在のgmailの「すべてのメール」をmbox形式でzip圧縮された形で取得できることを確認。
muttでメール数を確認するに、ちゃんと全数取得できている様子。
「エクスポート」機能、ローカル保存目的の自分的に惜しいのは、
1)出力時期が読めない(表示上は数日~数週間、googleアカウントのエクスポート履歴で要ウォッチ)、
2)一旦、googleドライブ等のクラウドに保管しないといけないっぽい、
ところ。
余談2、早合点
google本家の英語版のアナウンス[GMAIL_3RD_PARTY_POP]を再確認したところ、どうも、今回、廃止になるのは、「gmail以外の他社メールサーバからの、gmailアカウントへのpop取り込み」のようで、「gmailサーバからの、他社メールアプリ/メーラーソフトのpop/imap取り込み」は、今回の対象外であることが判明。
[GMAIL_3RD_PARTY_POP] https://support.google.com/mail/answer/16604719?hl=en#zippy=%2Ccan-i-access-gmail-from-a-third-party-app
ちょっと早合点してしまったみたいです。汗)
Q) Can I access Gmail from a third-party app?
A) Yes.
You can connect to Gmail servers from third-party apps with POP or IMAP.
おわりに
gmailサーバからのimap取り込み後、ローカルにspool、それを、ローカルメーラーpop取り込みできる環境を作ることができました。
自分のように、gmailをローカルにバックアップしている人の参考になれば、幸いです。
履歴
20251219、1.0版 (note(2025年10月12日初版)より引っ越し、)
20251220、1.1版 editorialな修正
