2018-01-19

Postfix+Procmail: 電子メールの添付ファイルを自動で保存する方法

Linuxメールサーバ上で, 送られて来た電子メールの添付ファイルを自動で保存する方法をメモする.

Pythonのスクリプトを以下のように用意する.

#! /bin/env python

import sys
import email
import re
import os

re_fname = re.compile('[^\./][^/]*\.[a-zA-Z0-9]*$') # この箇所は適宜修正をすること.
dest_dir = '/home/hoge/email/' # 保存先のディレクトリ

msg = email.message_from_string(sys.stdin.read())
for part in msg.walk():
        fn = part.get_filename()
        if not part.is_multipart() and fn and re_fname.match(fn):
                print dir(part)
                fp = open(os.path.join(dest_dir, fn), 'wb')
                fp.write(part.get_payload(decode=True))
                fp.close()
上記のスクリプトを ~/Maildir/attach2file.pyという名前で保存した場合, .procmailrcに以下のように記述する.
:0c
*^Content-Type: multipart
| $HOME/Maildir/attach2file.py

なお, re_fnameの箇所は, ..など他のディレクトリへファイルを書き込まれないようにするなどセキュリティに配慮して記載する.

2018-01-09

EPSをWMF経由でPowerPointにインポート

以前に, EPSをPowerPoint 2007にインポートすると失敗することを記事にした. InkscapeでWMFに変換してインポートすることで, ベクターフォーマットを保ってPowerPointにインポートできることが分かった. その方法をメモしておく.
  1. EPSをInkscapeでWMFに変換する.
    inkscape tmp.eps --export-wmf tmp.wmf
    GUIで操作する場合, テキストをパスに変換するかなど, 色々なオプションがある.
  2. PowerPointでtmp.wmfをインポートする.
  3. [グループ化解除] を行うことで, ベクターの図になる.
上記のステップ1は, 以下のように, 一度SVGを経由しても良い.
  1. EPSをInkscapeのSVGフォーマットへ変換する.
    inkscape tmp.eps -l tmp.svg
    
  2. 必要に応じて, SVGを編集する. 以下の例では, フォントをTimesからsans-serifへ変換する.
    sed \
      -e 's/font-family:Times;/font-family:sans-serif;/g' \
      -e 's/-inkscape-font-specification:Times-/-inkscape-font-specification:sans-serif,/g' \
      -i tmp.svg
    
  3. WMF形式で出力
    inkscape tmp.svg --export-wmf tmp.wmf
    

私は Inkscape 0.92.2-1.fc26 を使用しているが, 以下の問題が見つかった.

  • 破線が実線になる. (破線の間隔が狭すぎて, 実線に見える.)
  • 網掛けの色が変わる.
  • 枠と塗りつぶしが別々のオブジェクトに分割される. (EPSの仕様?)
  • 白の矩形で消した箇所が現れることがある. (たぶん, 白色の塗りつぶしが消えた.)
  • 矢印が消える