メール取得メソッドをUNSEENフラグを使用する方法に統一し、既読マーク機能を追加
This commit is contained in:
61
app.py
61
app.py
@@ -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}秒後に次のチェックを実行します")
|
||||
|
||||
Reference in New Issue
Block a user