narita-lab’s blog

成田ラボ 〜テクノロジーと雑学の観察日記〜

AIと共同で“詐欺メールを潰すプログラム”を設計してみる Day2

前回、Yahooメールに大量に届く詐欺メールに嫌気が差し、

「もうPythonで対策ツール作った方が早いのでは?」

ということで、ChatGPTと一緒に設計を始めた。

Day1では、

  • AI判定を使うべきか
  • ルールベースでどこまで戦えるか
  • 「楽 天 カ ー ド」みたいなフィルタ回避をどう処理するか
  • 未登録サービスをどう判定に使うか

この辺りを整理した。

そして今回のDay2。

いよいよ実際にPythonからYahooメールへ接続し、メールを取得できるか試してみることにした。

…とは言っても、今回はまだ“大掛かりなこと”はしない。

目的はかなりシンプルだ。

  • IMAP接続できるか
  • ログインできるか
  • 受信箱を開けるか
  • メール件名を取得できるか

まずはここだけ。

メール削除も、AI判定も、迷惑メールフィルタもまだやらない。

この手の開発は、最初から欲張ると大体沼る。

なので今回は、

「PythonからYahooメールをちゃんと扱えるか」

を確認する、基礎テスト回である。

 

PythonでYahooメールへIMAP接続してみる

今回使ったのは、Python標準ライブラリの imaplib だ。

メール操作というと難しそうに見えるが、受信箱へ接続してメール一覧を取得するだけなら、意外とシンプルに書ける。

大まかな流れはこうだ。

 
import imaplib
import email
from email.header import decode_header
 

まず、YahooメールのIMAPサーバーへSSL接続する。

 
mail = imaplib.IMAP4_SSL("imap.mail.yahoo.co.jp", 993)
 

その後、メールアドレスとパスワードでログイン。

 
mail.login(EMAIL, PASSWORD)
 

ログインできたら、受信箱を選択する。

 
mail.select("INBOX")
 

そしてメール一覧を取得。

 
status, messages = mail.search(None, "ALL")
 

今回はテストなので、最新5件だけ取得して、件名と送信者を表示する形にした。

つまり、今回の目的はあくまで、

「PythonからYahooメールの受信箱を読めるか」

の確認である。

この段階では、メールの削除も移動も一切しない。
安全確認としては、まずこれで十分だと思う。

 

ログインできない。原因はまさかの“海外アクセス遮断”

…と、ここまでは順調だった。

設定も確認した。

  • Yahooメール側でIMAP有効化
  • 他アプリからのログイン許可
  • パスワード変更

準備は完璧。

なのに、ログインできない。

「接続失敗」だけが表示される。

最初は単純に、

「パスワード打ち間違えたか?」

と思った。

でも、ブラウザからは普通にログインできる。
つまり認証情報自体は間違っていない。

となると、原因は別にある。

エラー内容を詳しく表示させたり、設定を見直したりしていたところ、原因が判明した。

Yahoo側で、

“海外からのアクセスを遮断”

していたのである。

完全に盲点だった。

普段ブラウザでログインしている分には問題なかったのだが、PythonからのIMAP接続はYahoo側から見ると“普段と違うアクセス”として扱われていたらしい。

つまり、

「怪しいアクセスだから止めます」

状態になっていた訳だ。

この設定を解除したところ、普通にログイン成功。

メール受信も問題なく動作した。

正直、PythonコードよりYahoo側設定で詰まるとは思っていなかった。
開発あるあるである。

 

実際にメール取得は問題なく成功

海外アクセス遮断の問題を解決した後は、かなりあっさり動いた。

ログイン成功。
INBOX選択成功。
メール一覧取得成功。

そして、最新メールの件名と送信者表示にも成功した。

画面にズラッと件名が並んだ時は、

「おぉ、ちゃんと取れてる」

とちょっと感動した。

メール処理というと、もっと複雑で魔境みたいなものを想像していたのだが、少なくとも“受信箱へ接続してメール一覧を読む”ところまでは、思ったより素直だった。

もちろん、今後はここから色々面倒なことが増えていくと思う。

例えば、

  • HTMLメール解析
  • 日本語文字コード
  • 全角半角問題
  • 「楽 天 カ ー ド」みたいな回避表現
  • URL抽出
  • 本文解析

この辺は確実に出てくる。

ただ、今回の目的はあくまで、

“PythonでYahooメールを扱えるか”

の確認だ。

その意味では、Day2の目標は無事達成できたと思う。

 

今回わかったこと

今回の検証でわかったのは、PythonからYahooメールを読むこと自体は普通にできる、ということだった。

もちろん事前準備は必要だ。

Yahooメール側でIMAPを使えるようにして、他アプリからのログインを許可しておく必要がある。
さらに今回は、海外アクセス遮断の設定が原因でログインできないという罠もあった。

ただ、そこを越えてしまえば、IMAP接続自体はかなり素直だった。

今回できたことは、

  • Yahooメールへ接続
  • ログイン
  • INBOX選択
  • メール一覧取得
  • 件名と送信者の表示

この辺り。

Day1で考えていた「詐欺メールを検出するツール」の土台としては、まず十分だと思う。

何より大きいのは、

「実際に受信箱の中身をPythonで読める」

と確認できたことだ。

ここができないと何も始まらない。

逆にここが通ったので、次からは本文取得や判定処理に進める。

まずは接続確認。
そして受信確認。

地味だけど、開発の第一歩としてはかなり大事な回だった。

 

次回は本文取得と正規化処理へ

という訳で、Day2はここまで。

今回は、PythonからYahooメールへIMAP接続し、受信箱のメールを取得できるか試してみた。

途中で、

「ログイン情報は合っているのにログインできない」

という問題にぶつかったが、原因はYahoo側の海外アクセス遮断だった。

ここを解除したことで、無事にログイン成功。
メールの件名と送信者も取得できた。

これで、詐欺メール対策ツールの土台は作れそうだと分かった。

次回は、いよいよメール本文の取得に進む予定だ。

特にやりたいのは、

  • 本文の取得
  • HTMLメールの処理
  • 全角半角の正規化
  • スペース除去
  • 「楽 天 カ ー ド」みたいな表記ゆれ対策

この辺り。

Day1で考えた設計を、少しずつ実装に落とし込んでいく。

まだ削除処理はしない。
まずは“怪しいメールを見つける”ところから始めたい。

詐欺メールとの戦いは、まだ始まったばかりである。