📩
受信Mailをディスプレイに表示する
Raspberry PiにHDMIディスプレイを接続し、常に新しいメールを受信して差出人と本文を大きく表示する方法は、Pythonで簡単に実装できます。ここでは、IMAPプロトコルを使ってメールを定期的にチェックし、tkinterライブラリを使って差出人と本文を大きく表示するアプリケーションを構築する方法を説明します。
準備
1. Raspberry Pi
2. Python3 と必要なライブラリ
3. Gmailアカウント(IMAPが有効化されたもの)
必要なライブラリのインストール
まず、IMAPのためのimaplibはPython標準ライブラリに含まれていますが、tkinterライブラリをインストールして、GUIでテキストを表示できるようにします。
sudo apt update
sudo apt install python3-tk
手順
1. Pythonスクリプトでメールを取得する
IMAPを使って、Gmailアカウントから新しいメールを取得し、差出人と本文を抽出するコードを作成します。
import imaplib
import email
from email.header import decode_header
import tkinter as tk
import time
# メールアカウント設定
IMAP_SERVER = 'imap.gmail.com'
EMAIL_ACCOUNT = 'your_email@gmail.com'
PASSWORD = 'your_password'
def get_latest_email():
try:
# メールサーバに接続
mail = imaplib.IMAP4_SSL(IMAP_SERVER)
mail.login(EMAIL_ACCOUNT, PASSWORD)
mail.select("inbox")
# 最新のメールを取得
status, messages = mail.search(None, "ALL")
email_ids = messages[0].split()
latest_email_id = email_ids[-1]
# 最新メールの内容を取得
status, msg_data = mail.fetch(latest_email_id, "(RFC822)")
msg = email.message_from_bytes(msg_data[0][1])
# 差出人をデコード
from_, encoding = decode_header(msg.get("From"))[0]
if isinstance(from_, bytes):
from_ = from_.decode(encoding if encoding else "utf-8")
# 本文を抽出
if msg.is_multipart():
for part in msg.walk():
if part.get_content_type() == "text/plain":
body = part.get_payload(decode=True).decode()
break
else:
body = msg.get_payload(decode=True).decode()
mail.logout()
return from_, body
except Exception as e:
print("エラー:", e)
return "エラー", "メールの取得に失敗しました"
#### 2. TkinterでGUIウィンドウを作成
次に、`tkinter`ライブラリを使ってRaspberry PiのHDMIディスプレイ上にメールの差出人と本文を大きく表示します。
```python
# GUIの設定
def update_display():
# 最新メールの差出人と本文を取得
from_, body = get_latest_email()
# テキストウィジェットに表示内容を更新
sender_label.config(text="差出人: " + from_)
body_text.delete(1.0, tk.END)
body_text.insert(tk.END, body)
# 60秒ごとに最新メールをチェック
root.after(60000, update_display)
# メインウィンドウの設定
root = tk.Tk()
root.title("メール受信モニター")
root.geometry("800x480") # HDMIディスプレイの解像度に合わせる
root.config(bg="black")
# 差出人ラベル
sender_label = tk.Label(root, text="差出人: ", font=("Helvetica", 24), fg="white", bg="black")
sender_label.pack(pady=10)
# 本文表示
body_text = tk.Text(root, wrap="word", font=("Helvetica", 20), fg="white", bg="black", height=15)
body_text.pack(expand=True, fill="both")
# 最初の更新を実行
update_display()
# メインループ
root.mainloop()
コードの説明
1. get_latest_email関数:
• GmailのIMAPサーバーに接続し、最新メールの差出人と本文を取得します。
• decode_headerを使用してエンコードされたメールの差出人をデコードします。
• メールが複数パートの場合(HTMLメールなど)、text/plainパートから本文を抽出します。
2. update_display関数:
• get_latest_email()で取得した差出人と本文をGUIに表示します。
• sender_labelで差出人のテキストを更新し、body_textウィジェットに本文を挿入します。
• root.after(60000, update_display)で、60秒ごとに最新のメールをチェックします。
3. tkinterウィジェットの配置:
• Labelウィジェットを使って差出人情報を表示します。
• Textウィジェットを使ってメール本文を表示し、wrap="word"で自動的に改行するようにします。
注意事項
• Gmailのセキュリティ設定: Gmailを使う場合、「安全性の低いアプリのアクセス」を有効にするか、二段階認証を設定してアプリパスワードを使用する必要があります。
• 更新頻度: root.after(60000, update_display)で60秒ごとにメールをチェックする設定ですが、メールサーバへの負荷を考慮し、必要に応じて調整してください。
実行方法
上記のスクリプトをRaspberry Pi上に保存して、以下のコマンドで実行します。
python3 your_script_name.py
自動起動設定(任意)
Raspberry Piの起動時に自動的にこのスクリプトを実行したい場合は、以下のようにcrontabを使って設定します。
crontab -e
次の行を追加し、Raspberry Piの起動時にスクリプトが実行されるようにします。
@reboot python3 /path/to/your_script_name.py
これで、Raspberry Piが起動するとHDMIディスプレイに最新のメールが大きく表示されるようになります。