Ubuntu

Ubuntu20.04 メールの添付ファイルをため込む仕組み

受け取ったメールに添付されたファイルをとにかくため込んでいきたい。



広告


メールを受信するホストを temp(Ubuntu 18.04)、そのメールを刈り取って添付ファイルを取り出すサーバーを work(Ubuntu 20.04)とする。

やること

そんなに多くはなかったが、時間はそれなりにかかった。

メールを受信してキューにため込むテストサーバー

temp をメールを受信してキューにため込むサーバーに仕立てる。

UbuntuのデフォルトMTAはPostfixのようだなので、これをセットアップしていく。
あくまでもテスト用でインターネットにさらすことはしないので設定はユルユル、他のユーザーに公開するわけでもないから証明書もオレオレ。
だけど、メールクライアントソフトを使った最低限のメール送受信はできるようになっている。

Postfixのインストール

まずはPostfixのインストール。

$ sudo apt install postfix

インストール中の問い合わせには以下の回答。
* General type of mail configuration:
 Internet Site

* System mail name:
  temp.hogeserver.hogeddns.jp

サーバーの設定を確認・変更。

/etc/postfix/main.cf

myhostname = temp.hogeserver.hogeddns.jp
mydestination = hogeserver.hogeddns.jp, temp, localhost.localdomain, localhost

設定を反映。反映方法がこれで良いのかどうかはよく分からないが、反映はできる模様。

$ sudo systemctl restart postfix

ここまででMTAの設定が完了。

Dovecotのインストール

workからメールを刈り取るためにpop3サーバーを整備。Dovecotは初めて。

$ sudo apt install dovecot-core dovecot-pop3d

ポートの使用状況を見てみるとデーモンがポートをつかんでいる。

$ sudo ss -p -A tcp,udp,raw state listening state unconnected
Netid   State     Recv-Q    Send-Q                             Local Address:Port                  Peer Address:Port    
tcp     LISTEN    0         100                                      0.0.0.0:pop3s                      0.0.0.0:*        users:(("dovecot",pid=7030,fd=26))
tcp     LISTEN    0         100                                      0.0.0.0:pop3                       0.0.0.0:*        users:(("dovecot",pid=7030,fd=24))
tcp     LISTEN    0         100                                      0.0.0.0:smtp                       0.0.0.0:*        users:(("master",pid=3392,fd=13))
tcp     LISTEN    0         100                                         [::]:pop3s                         [::]:*        users:(("dovecot",pid=7030,fd=27))
tcp     LISTEN    0         100                                         [::]:pop3                          [::]:*        users:(("dovecot",pid=7030,fd=25))
tcp     LISTEN    0         100                                         [::]:smtp                          [::]:*        users:(("master",pid=3392,fd=14))

※メールに関係するところだけ抜粋。

メーラーで動作確認

メールサーバーの動作をチェックするためにメーラーを起動して…おぉ、もう何年もまともに使ってなかったからか、アカウント設定のほとんどがやり直しだったけれど、一応全てが正しく動く状態になった。

で、今回のサーバーのアカウントを追加してみる。

SMTP
25(SMTP over SSL + STARTTLS)で、証明書を検証しない設定(CAで証明書を作ればいいけど、テストなので良し)。

POP
995(POP over SSL)で、証明書を検証しない設定(同)。

これで自分宛のメールを送ったところ、自分にメールが到着。

From:     Rohhie rohhie@hogeserver.hogeddns.jp
To:       rohhie@hogeserver.hogeddns.jp
Subject:  test
Date:     Sat, 13 Feb 2021 12:50:31 +0900
Return-Path: rohhie@hogeserver.hogeddns.jp
X-Original-To: rohhie@hogeserver.hogeddns.jp
Delivered-To: rohhie@hogeserver.hogeddns.jp
Received: from hogeserver.hogeddns.jp (client.hogeserver.hogeddns.jp [172.16.nnn.nnn])
        by temp.hogeserver.hogeddns.jp (Postfix) with ESMTPS id 9F746100A77
        for rohhie@hogeserver.hogeddns.jp; Sat, 13 Feb 2021 03:50:31 +0000 (UTC)
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Message-Id: 26D701BB60098FDDFBEDB8@hogeserver.hogeddns.jp
test mail.
とどくかなー?

まずはこれで。

メールの保管状況

Postfixがどこにメッセージをキューイングしているかというと、/var/mailだった。

$ ll /var/mail/
 total 12
 drwxrwsr-x  2 root   mail 4096 Feb 13 03:56 ./
 drwxr-xr-x 13 root   root 4096 Aug  5  2019 ../
 -rw-------  1 rohhie mail  880 Feb 13 03:50 rohhie

メールをサーバーに残して受信したところ、先程のメールメッセージが保管されていた。

メールを刈り取ったら、以下の内容に変わった。
/var/mail/rohhie

From MAILER_DAEMON  Sat Feb 13 04:07:15 2021
Date: Sat, 13 Feb 2021 04:07:15 +0000
From: Mail System Internal Data <MAILER-DAEMON@temp>
Subject: DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA
Message-ID: <1613189235@temp>
X-IMAP: 1613187483 0000000001
Status: RO

This text is part of the internal format of your mail folder, and is not
a real message.  It is created automatically by the mail system software.
If deleted, important folder data will be lost, and it will be re-created
with the data reset to initial values.

mailbox形式ではこんな感じでメールが管理されていることが分かった。

アカウントの追加

アーカイブしたいメールアドレスが2つあるので、アカウントを追加してみる。

$ sudo adduser journal_one
$ sudo adduser journal_two

これでアカウント間のメール送受信ができるようになった。

$ ll /var/mail
total 20
drwxrwsr-x  2 root        mail 4096 Feb 13 05:12 ./
drwxr-xr-x 13 root        root 4096 Aug  5  2019 ../
-rw-------  1 journal_one mail  883 Feb 13 04:28 journal_one
-rw-------  1 journal_two mail  907 Feb 13 05:12 journal_two
-rw-------  1 rohhie      mail  528 Feb 13 04:07 rohhie

 

メールを刈り取って添付ファイルを取り出すサーバー

work は、tempからメールを刈り取ってきて、添付ファイルを取り出して、アーカイブする作業を定期的に行うサーバーに仕立てる。

Postfixのインストール

メールの刈り取りにfetchmailを使うのだが、fetchmailで刈り取ったメールはデフォルトMTAに送られるので、やっぱりPostfixが必要。

$ sudo apt install postfix

インストール中の問い合わせには以下の回答。
* General type of mail configuration:
 Local only

* System mail name:
  work.hogeserver.hogeddns.jp

※どこにもメールの配送をしないので、Local onlyでセットアップ。

サーバー設定を見直しつつ、メール1通を1ファイルに保管する形式に変更してみる。

/etc/postfix/main.cf

myhostname = work.hogeserver.hogeddns.jp
mydestination = hogeserver.hogeddns.jp, temp, localhost.localdomain, localhost
home_mailbox = .mail/

この設定により、メール保管場所は/var/mail/ユーザー名(mailbox形式)から、~/.mail/メール単位(Maildir形式)に変更される。

Fetchmailのインストールとメールの刈り取り

fetchmailをインストールして設定していく。
定期的に動作させたいものの、メールを刈り取った後にやりたい処理があるので、デーモンモードでは動かさない。

$ sudo apt install fetchmail

fetchmailの動作は、~/.fetchmailrc で制御することができるそう。
最初、クーロンをrootで動かしてメールの刈り取りからアーカイブまでを行うつもりだったが、これは危ないと警告されるので一般ユーザーで実施する。
確かに、外からデーターを取り込む処理なので、sudoersじゃない一般ユーザーの方が安全。

.fetchmailrcについては先輩達が教えてくれている。
はじめての自宅サーバ構築 – Fedora/CentOS – / 外部メールの取り込み(fetchmail)
CentOSで自宅サーバー構築 / 複数ドメイン宛メールの集約(Fetchmail)

マニュアルはこちら。先輩達の教えから、keywordを.fetchmailrcで指定することができると分かる。
ubuntu manuals / fetchmail
ubuntu manuals / fetchmail(日本語) ※読みやすいけれど内容は古い。

/root/.fetchmailrc

# common settings
set postmaster root
set no bouncemail
set logfile "mail/log/fetchmail.log"    # ログ出力先
set daemon 0                            # デーモンモードで起動しない

# default settings
defaults
        fetchall                        # 全てのメールを取り出す
        #no fetchal                     # 新規メールだけを取り出す
        nokeep                          # メールを取り出した後に消す(デフォルト)
        #keep                           # メールを取り出した後に消さない

# journal_one
poll temp.hogeserver.hogeddns.jp
        protocol pop3
        port 995
        username "journal_one"
        password "password"
        ssl
        sslfingerprint "7F:B6:50:B3:88:51:89:1A:4C:45:E7:9A:52:D8:78:3C"
        sslproto TLS1+
        no sslcertck
        is rohhie here                  # rohhieのメールボックスに取り込む

# journal_two
poll temp.hogeserver.hogeddns.jp
        protocol pop3
        port 995
        username "journal_two"
        password "password"
        ssl
        sslfingerprint "7F:B6:50:B3:88:51:89:1A:4C:45:E7:9A:52:D8:78:3C"
        sslproto TLS1+
        no sslcertck
        is rohhie here

※sslfingerprintの指定は次工程。

今回の環境はオレオレ証明書による通信保護になっているため、sslfingerprintを指定しておかないとメッセージが出まくる。設定方法について、こちらで詳しく教えてくれている。
goungounさんのサイト / 2012/03/16、fetchmail(定周期でメールを受信し転送)(リンク切れのためアーカイブへ)

ログファイルを先に作っておいて、実行してみる。

$ mkdir -p mail/log
$ touch mail/log/fetchmail.log
$ fetchmail -v

※-vをパラメーターに渡すと詳細ログが出る。

出力されたログから、fingerprintの内容を取り出して、.fetchmailrcに設定。

fetchmail: temp.hogeserver.hogeddns.jp key fingerprint: 7F:B6:50:B3:88:51:89:1A:4C:45:E7:9A:52:D8:78:3C

これで準備完了。fetchmailを改めて実行。

$ fetchmail

メールが空っぽだと、こんなログが出る。

fetchmail: No mail for journal_one at temp.hogeserver.hogeddns.jp
fetchmail: No mail for journal_two at temp.hogeserver.hogeddns.jp

メールを受信すると、こんなログが出る。

fetchmail: 1 message for journal_one at temp.hogeserver.hogeddns.jp (876 octets).
fetchmail: reading message journal_one@temp.hogeserver.hogeddns.jp:1 of 1 (876 octets) flushed
fetchmail: 1 message for journal_two at temp.hogeserver.hogeddns.jp (876 octets).
fetchmail: reading message journal_two@temp.hogeserver.hogeddns.jp:1 of 1 (876 octets) flushed

受信したメールは、今回の設定であれば以下に保管される。

$ ll .mail/new/
total 16
drwx------ 2 rohhie rohhie 4096 Feb 14 07:20 ./
drwx------ 5 rohhie rohhie 4096 Feb 14 07:20 ../
-rw------- 1 rohhie rohhie 1262 Feb 14 07:20 1613254827.V802I40080M240979.work
-rw------- 1 rohhie rohhie 1262 Feb 14 07:20 1613254827.V802I40083M255173.work

受信したメールの中身はこんな感じ。

Return-Path: <rohhie@hogeserver.hogeddns.jp>
X-Original-To: rohhie@localhost
Delivered-To: rohhie@localhost
Received: from work (localhost [127.0.0.1])
        by work.hogeserver.hogeddns.jp (Postfix) with ESMTP id 359744007D
        for <rohhie@localhost>; Sun, 14 Feb 2021 07:20:27 +0900 (JST)
X-Original-To: journal_one@hogeserver.hogeddns.jp
Delivered-To: journal_one@hogeserver.hogeddns.jp
Received: from temp.hogeserver.hogeddns.jp [172.16.110.2]
        by work with POP3 (fetchmail-6.4.2)
        for <rohhie@localhost> (single-drop); Sun, 14 Feb 2021 07:20:27 +0900 (JST)
Received: from hogeserver.hogeddns.jp (client.hogeserver.hogeddns.jp [172.16.nnn.nnn])
        by temp.hogeserver.hogeddns.jp (Postfix) with ESMTPS id 0A210100154;
        Sat, 13 Feb 2021 22:19:50 +0000 (UTC)
From: Rohhie <rohhie@hogeserver.hogeddns.jp>
To: journal_one@hogeserver.hogeddns.jp,
 journal_two@hogeserver.hogeddns.jp
Subject: =?iso-2022-jp?B?GyRCJWEhPCVrNCIkajxoJGokTiVGJTklSBsoQg==?=
Date: Sun, 14 Feb 2021 07:19:44 +0900
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Message-Id: <2CD7025654CF70DDFBEDB8@hogeserver.hogeddns.jp>

メールを送信。
宛先としてoneとtwoの2つを指定。

---
Rohhie.
---

 

添付されているファイルの切り出し

きっとコマンドがあるだろうと高をくくっていたら、できるけれども想定している動きと少し違う。
ファイルが取り出せなかったり、取り出せるけどヘッダーが全て切り取られてしまったりとか。

そのため、添付さているファイルの切り出しをスクリプトでやってしまえと考えた。

Postfixが保存するファイルはこんな形になっていた。

Return-Path: <rohhie@hogeserver.hogeddns.jp>
X-Original-To: rohhie@localhost
<省略>
From: Rohhie <rohhie@hogeserver.hogeddns.jp>
To: journal_one@hogeserver.hogeddns.jp,
<省略>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="Boundary-x4E2iwnpz7aQVOg93dZLb" ← (0)
X-Mailer: HidemaruMail 6.98 (WinNT,A00)
Message-Id: <2FD70275452C23DDFBEDB8@hogeserver.hogeddns.jp>

--Boundary-x4E2iwnpz7aQVOg93dZLb ← (1)
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

複数のファイルが添付されているメールを添付した場合にどうなるのか。


--Boundary-x4E2iwnpz7aQVOg93dZLb ← (2)
Content-Type: message/rfc822
Content-Transfer-Encoding: 7bit

From: Rohhie <rohhie@hogeserver.hogeddns.jp>
To: journal_one@hogeserver.hogeddns.jp,
<省略>
ここにまるごと元メールが展開される。
さらに添付されているファイルは、添付されたメールのBoundaryで区切られていた。

--Boundary-x4E2iwnpz7aQVOg93dZLb-- ← (3)

こんな形で区切られているので、(2)~(3)の間を抜き出せれば、添付されているファイルを取り出せる。

下調べ

ということで、ほとんどテキストファイルの操作。
メールの中身は表示できる文字ばっかりなので、扱いやすい方なのだろう。

■Content-Typeの境界となる文字列を切り出す
CodeZine / AWKで一番の得意ワザ! シェルで文字列を自在に扱うための文字列関数

$ grep -m1 '^Content-Type:' a.eml | awk 'match($3, /".*"/) {print substr($3, RSTART+1, RLENGTH-2)}'
Boundary-x4E2iwnpz7aQVOg93dZLb

■境界となる文字列が含まれる行の行番号だけを切り出す
stackoverflow / Use grep to report back only line numbers

$ grep -n "Boundary-x4E2iwnpz7aQVOg93dZLb" a.eml | cut -f1 -d:
22
26
33
574

■改行で区切られたテキストを変数配列にする
Qiita / bashでテキストファイルを簡単に配列にする方法

BLINES=(grep -n "Boundary-x4E2iwnpz7aQVOg93dZLb" a.eml | cut -f1 -d: | xargs)

※括弧で囲まないと、空白区切りの文字列が0番目に入る。

■テキストファイルから指定した範囲の行を取り出す
逆引きUNIXコマンド / 指定した範囲の行を取得する方法

$ cat a.eml | sed -n '34,573p' > a-dash.eml

■境界となる文字列の直後に続くContent-*が終わる行

$ grep -m1 -n -v "^Content-" a-dash.eml | cut -f1 -d:
3

■ファイルの最初にある空行を削除
stackoverflow / SED command to delete empty lines till the first occurrence of sentence

$ sed -n '/./,$p'

■大量のファイル削除
PC、サーバーのちょっとした小技 / 大量のファイルをrmコマンドで削除できない場合の備忘録
xargsを使うと、渡せる引数の限界まで渡してrmコマンドが実行される模様。
りんごとバナナとエンジニア / 大量のファイルを一気に消したい時はxargsを使う

$ echo mail/work/* | xargs rm

■Postfixのメール削除
postqueコマンドで問い合わせてみたものの、Maildir形式の場合はPostfixのキューにはならない模様。
直接ファイルを削除することにした。

Dovecotを導入している場合はDovecot経由で削除するっぽいことが書かれているが、このサーバーにはインストールする気がないので多分問題なし。
Stack Exchange / Can I delete or move mail files from maildir cur folder?

それっぽいスクリプト

完全無保証、かつ、素人さんの作り。エラーコードも適当。とりあえず動いたバージョン。

前提となるディレクトリ構成。

~/
 ├ mailwork      … 今回作成したスクリプト
 │
 ├ .mail/
 │  ├ cur/
 │  ├ new/    … Postfixがメールを保管してくれる場所
 │  └ tmp/
 │
 └ mail/
    ├ work/   … 添付が1つだけのメール(添付が取り出される)
    ├ failed/ … 添付がない、あるいは、複数ある(そのまま放り込まれる)
    └ log/    … fetchmailのログ出力先

~/mailwork

#!/bin/bash
RESULT=0
BKNAME=`date "+%Y%m%d_%H%M%S"`

cd

# メールを刈り取ってくる(.fetchmailrcが整備されている前提)
fetchmail
if [ $? -gt 0 ]
then
        exit 16
fi

# 取り込んだメールを全て処理する
for MAILS in `ls .mail/new/`
do
        # 添付ファイルの境界文字列を取り出す
        BSTRING=`grep -m1 '^Content-Type:' .mail/new/$MAILS | awk 'match($3, /".*"/) {print substr($3, RSTART+1, RLENGTH-2)}'`

        # 境界文字列が含まれる行を取り出す
        BLINES=(`grep -n "$BSTRING" .mail/new/$MAILS | cut -f1 -d: | xargs`)

        # 添付ファイルは1つの前提で切り出し処理をしていく
        if [ 4 = ${#BLINES[@]} ]
        then
                # 抜き出し範囲を計算(境界文字列の行も消す)
                ST=$((BLINES[2]+1))
                ED=$((BLINES[3]-1))

                # 添付部分のみ抜き出して保存
                cat .mail/new/$MAILS | sed -n "${ST},${ED}p" > mail/work/$MAILS.eml
                if [ $? -gt 0 ]
                then
                        RESULT=$(($RESULT | 1))
                        cp -a .mail/new/$MAILS mail/failed/$MAILS
                        if [ $? -gt 0 ]
                        then
                                RESULT=$(($RESULT | 2))
                                exit $RESULT
                        fi
                fi

                # 先頭に残っているコンテンツの形式を示す行を削除
                ST=`grep -m1 -n -v "^Content-" mail/work/$MAILS.eml | cut -f1 -d:`
                sed -i -n "${ST},$$p" mail/work/$MAILS.eml

                # 先頭に空行が残っていたら削除
                sed -i -n "/./,$$p" mail/work/$MAILS.eml

        else
                # 添付ファイルがない、あるいは、2つ以上の場合は、他のディレクトリに避けておく
                cp -a .mail/new/$MAILS mail/failed/$MAILS
                if [ $? -gt 0 ]
                then
                        RESULT=$(($RESULT | 4))
                        exit $RESULT
                fi

        fi

        # 処理済みのメールを削除する
        rm .mail/new/$MAILS

done

# ファイルをアーカイブする
cd mail
zip -r -q $BKNAME.zip work/ failed/

if [ $? -gt 0 ]
then
        RESULT=$(($RESULT | 8))
        cd
        exit $RESULT
fi

# アーカイブ済みのファイルを削除
cd
if [ -n "$(ls mail/work)" ]
then
        echo mail/work/* | xargs rm
fi

if [ -n "$(ls mail/failed)" ]
then
        echo mail/failed/* | xargs rm
fi

exit $RESULT

これをcronに登録して定期的に実行すればメールの添付ファイルがアーカイブされる。
呼び出すのが1時間ごとなら1時間単位のアーカイブになるし、1日ごとなら1日単位のアーカイブになる。

アーカイブされたファイルの保管は今回の記事の範疇から外した。

やったこと

You have mail.

temp(メールを受信してキューにため込む側のサーバー)にSSHでログインしたら You have mail. のメッセージ。
メールを確認してみる(mailコマンドがなかったので、mailutilsをインストールしてます)。

$ mail
"/var/mail/rohhie": 1 message
>    1 Mail System Intern Sat Feb 13 04:07  11/482   DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA
? 1
Date: Sat, 13 Feb 2021 04:07:15 +0000
From: Mail System Internal Data <MAILER-DAEMON@temp>
Subject: DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA
Message-ID: <1613189235@temp>
X-IMAP: 1613187483 0000000001
Status: RO

This text is part of the internal format of your mail folder, and is not
a real message.  It is created automatically by the mail system software.
If deleted, important folder data will be lost, and it will be re-created
with the data reset to initial values.
? exit

このテキストはメールフォルダの内部形式の一部であり、実際のメッセージではありません。 メールシステムソフトウェアによって自動的に作成されます。 削除すると重要なフォルダデータが失われ、データが初期値にリセットされて再作成されます。

Google先生による翻訳

これは、メールクライアントやfetchmailでメールを全て刈り取った後に自動的に放り込まれる模様。
消すなと言っているので、そのままにしておこう。

fetchmailが出力するメッセージへの対応

実験中に色々なメッセージが出たので、それぞれについて。

fetchmail: WARNING: Running as root is discouraged.

rootで実行することはオススメできませんよ、という話。
fetchmail自体をやられるとroot権限を取られてしまうのでやめた方がいい、という話。
LinuxQuestions.org / Running fetchmail as root

Logfile “/home/rohhie/mail/log/fetchmail.log” does not exist, ignoring logfile option.

事前にファイルを作っておかないとこのエラーが出る。touchしてファイルを作っておく。

fetchmail: Server CommonName mismatch: temp != temp.hogeserver.hogeddns.jp

どうも、サーバーを逆引きして、サーバー違うけど?と言ってきている模様。
正直なところよく分からないが、このログを無視するように rsyslog にフィルターを掛けてしまうらしい。
LinuxQuestions.org / fetchmail warning : Server CommonName mismatch

fetchmail: Server certificate verification error: self signed certificate

サーバーが自己署名証明書を提示してきているので仕方がない。
この場合、fetchmailを -v オプションを付けて実行し、そこに表示される fingerprint を設定ファイルに入れる。
goungounさんのサイト / 2012/03/16、fetchmail(定周期でメールを受信し転送)(リンク切れのためアーカイブへ)

# fetchmail -v

/var/log/fetchmail.log ※当該の行を抜粋。

fetchmail: temp.hogeserver.hogeddns.jp key fingerprint: 7F:B6:50:B3:88:51:89:1A:4C:45:E7:9A:52:D8:78:3C

これを .fetchmailrc に加える。

poll temp.hogeserver.hogeddns.jp
         username "journal_one"
         password "password"
         ssl
         sslfingerprint "7F:B6:50:B3:88:51:89:1A:4C:45:E7:9A:52:D8:78:3C"

 

fetchmail: Missing trust anchor certificate: /CN=temp

実際にはこんな感じのログが出ている。

fetchmail: Missing trust anchor certificate: /CN=temp
fetchmail: This could mean that the root CA's signing certificate is not in the trusted CA certificate location, or that c_rehash needs to be run on the certificate directory. For details, please see the documentation of --sslcertpath and --sslcertfile in the manual page.
fetchmail: OpenSSL reported: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed
fetchmail: temp.hogeserver.hogeddns.jp: SSL connection failed.

これは、通信プロトコルをtls1に設定することで回避できる模様。
LinuxQuestions.org / openssl-1.1.1 upgrade breaks fetchmail with gmail

poll temp.hogeserver.hogeddns.jp
         ssl
         sslfingerprint "7F:B6:50:B3:88:51:89:1A:4C:45:E7:9A:52:D8:78:3C"
         sslproto TLS1+

※最終的にマニュアルを見て TLS+ として解決。

fetchmail: OpenSSL reported: error:141E70BF:SSL routines:tls_construct_client_hello:no protocols available

日本語のマニュアルを見ても分からなかったが…バージョンアップで証明書のチェックがオンになっているそうで。
オレオレなので証明書のチェックを外す。
ubuntu manuals / fetchmail

poll temp.hogeserver.hogeddns.jp
         ssl
         sslfingerprint "7F:B6:50:B3:88:51:89:1A:4C:45:E7:9A:52:D8:78:3C"
         sslproto TLS1+
         no sslcertck

 

ツールを使った添付ファイルの取り出し

さて、添付ファイルをどうやって取り出すか…procmailを使うと色々できそうではあるもののなんか壮大。

munpack

最初に見つかったのがこちら。
マイノリティでいこう / 複数のメールファイルから添付ファイルをまとめて取り出し(munpack)

早速インストールして実行してみる。

$ sudo apt install mpack
$ munpack from.eml
tempdesc.txt: File exists
Did not find anything to unpack from from.eml

これは、メール(emlファイル)を添付したメールでの実験結果で、取り出すことはできなかった。
どうやらこのコマンドはだいぶ古く、しかもあるところからLinux版のメンテナンスが終わっていて、最終版はWindows用なのだとか。
以前のバージョンのUbuntuだったらイケたのかもしれないが、今回は断念。

ripMIME

そこから色々たどっていったら、ここにたどり着く。
LinuxQuestions.org / munpack 1.6 does not unpack to correct filenames
ubuntu manuals / ripMIME

$ sudo apt install ripmime

やってみたところ、メールが3分割されて格納された。
メールの着信時間やメッセージIDでファイルを作ることができず、ユニークを保つのが大変そう。

そして、分割されたメッセージを確認したところ、ヘッダ情報が全てカットされていた。
これは狙っているものと違うので断念した。

さいごに

出だしのPostfixやDovecotは実はサクサクと設定ができて快調だったのだが、fetchmailあたりから進捗が落ちてきて、最後の添付ファイル取り出しに至っては調査に手間が掛かってヤバかった…。

ところで、Maildir形式というのは今回初めて扱ったけれど、なんか簡単でいいな。
色々なところから来るメッセージの全てをこのロジックで処理できるといいのだけれど。

広告

コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他