メール取得メソッドをUNSEENフラグを使用する方法に統一し、既読マーク機能を追加
This commit is contained in:
61
app.py
61
app.py
@@ -111,36 +111,9 @@ class EmailMonitor:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
def get_new_emails_since_uid(self, last_uid: str) -> List[EmailMessage]:
|
def get_new_emails_since_uid(self, last_uid: str) -> List[EmailMessage]:
|
||||||
"""指定したUID以降の新しいメールを取得"""
|
"""指定したUID以降の新しいメールを取得(廃止予定)"""
|
||||||
try:
|
# この方法は廃止し、UNSEENフラグを使用する方法に統一
|
||||||
typ, data = self.mail_client.search(None, f'UID {last_uid}:*')
|
return self.get_new_emails()
|
||||||
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 []
|
|
||||||
|
|
||||||
def get_new_emails(self) -> List[EmailMessage]:
|
def get_new_emails(self) -> List[EmailMessage]:
|
||||||
"""新しいメールを取得"""
|
"""新しいメールを取得"""
|
||||||
@@ -153,6 +126,10 @@ class EmailMonitor:
|
|||||||
return []
|
return []
|
||||||
|
|
||||||
email_ids = data[0].split()
|
email_ids = data[0].split()
|
||||||
|
if not email_ids:
|
||||||
|
logger.debug("新しい未読メールはありません")
|
||||||
|
return []
|
||||||
|
|
||||||
new_emails = []
|
new_emails = []
|
||||||
|
|
||||||
for email_id in email_ids:
|
for email_id in email_ids:
|
||||||
@@ -259,6 +236,16 @@ class EmailMonitor:
|
|||||||
logger.warning(f"メール本文取得エラー: {str(e)}")
|
logger.warning(f"メール本文取得エラー: {str(e)}")
|
||||||
return '本文の取得に失敗しました'
|
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:
|
def send_to_discord(self, email_msg: EmailMessage) -> bool:
|
||||||
"""DiscordにWebhookでメールを送信"""
|
"""DiscordにWebhookでメールを送信"""
|
||||||
try:
|
try:
|
||||||
@@ -320,6 +307,8 @@ class EmailMonitor:
|
|||||||
batch = email_msgs[i:i + batch_size]
|
batch = email_msgs[i:i + batch_size]
|
||||||
for email_msg in batch:
|
for email_msg in batch:
|
||||||
if self.send_to_discord(email_msg):
|
if self.send_to_discord(email_msg):
|
||||||
|
# Discord送信成功時にメールを既読にマーク
|
||||||
|
self.mark_email_as_read(email_msg.uid)
|
||||||
logger.info(f"処理完了: {email_msg.subject}")
|
logger.info(f"処理完了: {email_msg.subject}")
|
||||||
self.last_processed_uid = email_msg.uid # 最後に処理したUIDを更新
|
self.last_processed_uid = email_msg.uid # 最後に処理したUIDを更新
|
||||||
else:
|
else:
|
||||||
@@ -329,6 +318,7 @@ class EmailMonitor:
|
|||||||
def start_monitoring(self):
|
def start_monitoring(self):
|
||||||
"""メール監視を開始"""
|
"""メール監視を開始"""
|
||||||
logger.info("メール監視を開始します...")
|
logger.info("メール監視を開始します...")
|
||||||
|
logger.info("UNSEENフラグを使用して新しいメールのみを処理します")
|
||||||
self.running = True
|
self.running = True
|
||||||
|
|
||||||
while self.running:
|
while self.running:
|
||||||
@@ -338,17 +328,14 @@ class EmailMonitor:
|
|||||||
time.sleep(self.check_interval)
|
time.sleep(self.check_interval)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if self.last_processed_uid is None:
|
# UNSEENフラグを使用して未読メールのみを取得
|
||||||
self.last_processed_uid = self.get_latest_email_uid()
|
new_emails = self.get_new_emails()
|
||||||
logger.info(f"初期UID: {self.last_processed_uid}")
|
|
||||||
|
|
||||||
new_emails = self.get_new_emails_since_uid(self.last_processed_uid)
|
|
||||||
|
|
||||||
if 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)
|
self.send_to_discord_with_rate_limit(new_emails)
|
||||||
else:
|
else:
|
||||||
logger.debug("新しいメールはありません")
|
logger.debug("新しい未読メールはありません")
|
||||||
|
|
||||||
self.disconnect_from_email()
|
self.disconnect_from_email()
|
||||||
logger.debug(f"{self.check_interval}秒後に次のチェックを実行します")
|
logger.debug(f"{self.check_interval}秒後に次のチェックを実行します")
|
||||||
|
|||||||
Reference in New Issue
Block a user