メール取得メソッドをUNSEENフラグを使用する方法に統一し、既読マーク機能を追加

This commit is contained in:
2025-10-16 20:28:38 +09:00
parent 57681f6172
commit 48fbaadd2d

61
app.py
View File

@@ -111,36 +111,9 @@ class EmailMonitor:
return None
def get_new_emails_since_uid(self, last_uid: str) -> List[EmailMessage]:
"""指定したUID以降の新しいメールを取得"""
try:
typ, data = self.mail_client.search(None, f'UID {last_uid}:*')
if typ != 'OK':
logger.warning("メール検索に失敗しました")
return []
email_ids = data[0].split()[1:] # 最初のUIDは除外
new_emails = []
for email_id in email_ids:
try:
typ, msg_data = self.mail_client.fetch(email_id, '(RFC822)')
if typ != 'OK':
continue
email_body = msg_data[0][1]
email_message = email.message_from_bytes(email_body)
parsed_email = self._parse_email(email_message, email_id.decode())
if parsed_email:
new_emails.append(parsed_email)
except Exception as e:
logger.error(f"メール解析エラー (ID: {email_id}): {str(e)}")
continue
return new_emails
except Exception as e:
logger.error(f"新しいメールの取得に失敗しました: {str(e)}")
return []
"""指定したUID以降の新しいメールを取得(廃止予定)"""
# この方法は廃止し、UNSEENフラグを使用する方法に統一
return self.get_new_emails()
def get_new_emails(self) -> List[EmailMessage]:
"""新しいメールを取得"""
@@ -153,6 +126,10 @@ class EmailMonitor:
return []
email_ids = data[0].split()
if not email_ids:
logger.debug("新しい未読メールはありません")
return []
new_emails = []
for email_id in email_ids:
@@ -259,6 +236,16 @@ class EmailMonitor:
logger.warning(f"メール本文取得エラー: {str(e)}")
return '本文の取得に失敗しました'
def mark_email_as_read(self, email_id: str) -> bool:
"""メールを既読としてマーク"""
try:
self.mail_client.store(email_id, '+FLAGS', '\\Seen')
logger.debug(f"メール {email_id} を既読にマークしました")
return True
except Exception as e:
logger.warning(f"メール {email_id} の既読マークに失敗しました: {str(e)}")
return False
def send_to_discord(self, email_msg: EmailMessage) -> bool:
"""DiscordにWebhookでメールを送信"""
try:
@@ -320,6 +307,8 @@ class EmailMonitor:
batch = email_msgs[i:i + batch_size]
for email_msg in batch:
if self.send_to_discord(email_msg):
# Discord送信成功時にメールを既読にマーク
self.mark_email_as_read(email_msg.uid)
logger.info(f"処理完了: {email_msg.subject}")
self.last_processed_uid = email_msg.uid # 最後に処理したUIDを更新
else:
@@ -329,6 +318,7 @@ class EmailMonitor:
def start_monitoring(self):
"""メール監視を開始"""
logger.info("メール監視を開始します...")
logger.info("UNSEENフラグを使用して新しいメールのみを処理します")
self.running = True
while self.running:
@@ -338,17 +328,14 @@ class EmailMonitor:
time.sleep(self.check_interval)
continue
if self.last_processed_uid is None:
self.last_processed_uid = self.get_latest_email_uid()
logger.info(f"初期UID: {self.last_processed_uid}")
new_emails = self.get_new_emails_since_uid(self.last_processed_uid)
# UNSEENフラグを使用して未読メールのみを取得
new_emails = self.get_new_emails()
if new_emails:
logger.info(f"{len(new_emails)}件の新しいメールが見つかりました")
logger.info(f"{len(new_emails)}件の新しい未読メールが見つかりました")
self.send_to_discord_with_rate_limit(new_emails)
else:
logger.debug("新しいメールはありません")
logger.debug("新しい未読メールはありません")
self.disconnect_from_email()
logger.debug(f"{self.check_interval}秒後に次のチェックを実行します")