BLOGTIMES
2022/02/27

.eml ファイルから URL だけを抽出する

  antispam  phishing  python 
このエントリーをはてなブックマークに追加

spam URL report (2022/02/27) - .eml ファイルから URL だけを抽出する

最近、HTML で書かれたによるフィッシングメールが良く届くので、そのたびにフィッシング対策協議会Google にフィッシング詐欺の URL を報告するようにしています。

ただ、フィッシング詐欺の URL は HTML にしか書かれていないことが多く、僕は普段メールをプレーンテキストで読んでいる関係で、いちいちメールの表示形式を切り替えなければフィッシング詐欺の URL を取り出すことができないので、その作業がちょっと面倒でした。

.eml の URL を自動抽出してみる

というわけで、.eml ファイルに含まれる HTML パートから URL を抽出するスクリプトを Python で書いてみました。

Beautiful Soup を使っているので pip install beautifulsoup4 という感じでインストールしておく必要があります。これ以外は OS 標準のモジュールで動作します。

distil_url.py

import email from email.header import decode_header from email.utils import parsedate_to_datetime from bs4 import BeautifulSoup import glob import re import os import sys IGNORE_PAT = re.compile(r'^(#|mailto|file)') def distil_url(path, result): f = open(path, 'rb') msg = email.message_from_bytes(f.read()) f.close() for part in msg.walk(): if( part.get_content_type() != 'text/html'): continue; html_source = part.get_payload(decode=True) soup = BeautifulSoup(html_source, 'html.parser') links = soup.find_all('a') for link in links: if link.has_attr('href') and not IGNORE_PAT.match(link['href']): result.add(link['href']) result = set() for f in glob.glob(sys.argv[1]): distil_url(f, result) for l in sorted(result): print(l)

これを python distil_url.py path/to/maildir/*.eml のような感じで実行してやれば URL の一覧が出力されます。
今回はサーバ上の spam が入った Maildir を cron で1日1回なめて、メール通知するようにしてみました。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/13078
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン