Postfix でメールを受信したときのファイル名

id:kizashi1122 です。

Postfix で Maildir 形式で受信したときのメールファイルって見たことありますか? なんでこんなファイルなんだろうという感じのファイル名です。

こんな感じです。

1699255256.V10301I4d137d1M401570.ip-192-0-2-0.ap-northeast-1.compute.internal

ざっくり考える

なんとなくわかりますよね。. で分割すると

  • 現在のタイムスタンプのUnix Time(秒)
  • よくわからないけど他のファイルと比較すると V I M は固定っぽい
  • ホスト名

(ホスト名のIPアドレス部分はドキュメント用のIPアドレスにしています。)

いきなり答え合わせ

この辺みたらわかります。
https://github.com/vdukhovni/postfix/blob/702c621b1e985ca0bec9d335e9cfbe05798a0167/postfix/src/local/maildir.c#L203-L208

unix time とホスト名はあってそうです。

V I M については、vsprintf の部分をみてると

  • デバイスID
  • i-node 番号
  • 現在のタイムスタンプのUnix Time(マイクロ秒)

ってことがわかります。

本当かどうか見てみよう。

stat コマンドを使ってみてみます。

[root@ip-192-0-2-0 cur]# stat 1699255256.V10301I4d137d1M401570.ip-192-0-2-0.ap-northeast-1.compute.internal
  File: ‘1699255256.V10301I4d137d1M401570.ip-192-0-2-0.ap-northeast-1.compute.internal’
  Size: 9486            Blocks: 24         IO Block: 4096   regular file
Device: 10301h/66305d   Inode: 80820177    Links: 1
Access: (0600/-rw-------)  Uid: ( 1000/ec2-user)   Gid: ( 1000/ec2-user)
Access: 2023-11-06 07:20:56.399565900 +0000
Modify: 2023-11-06 07:20:56.399565900 +0000
Change: 2023-11-06 07:23:58.749107234 +0000
 Birth: -
[root@ip-192-0-2-0 cur]#

10301 はそのまま Device にのってるのでそのままっぽいです。
4d137d1 は inode なんでしょうか? stat では 80820177 と表示されます。これを16進数にしたら 4d137d1 になるのか?

$ printf %x 80820177
4d137d1

おお。ビンゴですね。
タイムスタンプは 10ms くらい差がありますけど、まあプログラムの実行時とファイル生成時にはそれくらいの差はあるかなという感じです。

いかがでしたでしょうか?

あれ?って思うことでもソースが公開されていると謎が解けてうれしいですね。