0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

google mailをfetchmailでimap取り込みしてみる

Last updated at Posted at 2025-12-18

はじめに

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でできるようだったので、試してみた。
下記は、追加変更したファイル&修正箇所の抜粋。

/etc/postfix/main.cf
・・・
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
/etc/postfix/master.cf
・・・
127.0.0.1:smtp inet n -   y       -       -       smtpd
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipent_restrictions=permit_sasl_authenticated,reject
・・・
/etc/postfix/virtual-mailbox
自垢1@gmail.com            gmail.com/自垢1/Maildir/
自垢2@gmail.com            gmail.com/自垢2/Maildir/
・・・
/etc/postfix/valias_map
(今回は空)

これらの設定を入れてrestartすると、「自垢1@gmail.com」なメールをpostfixが受け取ると、自分宛てと認識して、「/var/spool/テキトーなディレクトリ/gmail.com/自垢1/Maildir/」にspoolしてくれた。

techmailのfetchmailrcを設定してみる

とりあえず、imap over SSLでgmailのimapサーバからメール取得し、postfixには「自垢@gmail.com」で投げるように設定をfetchmailrcに記載。

$HOME/.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

[fetchmail_TODO_Serious]より
Serious Let IMAP code use UID and UIDVALIDITY rather than relying on flags that everyone can alter.

fetchmail、公式のtopページをみると、一応、継続開発されている様子。

image.png
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

ちょっと早合点してしまったみたいです。汗)

[GMAIL_3RD_PARTY_POP]より
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な修正

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?