From 48fbaadd2d52727bcaf25072b7b040395396b2fd Mon Sep 17 00:00:00 2001 From: mukan-bot Date: Thu, 16 Oct 2025 20:28:38 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=A1=E3=83=BC=E3=83=AB=E5=8F=96=E5=BE=97?= =?UTF-8?q?=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89=E3=82=92UNSEEN=E3=83=95?= =?UTF-8?q?=E3=83=A9=E3=82=B0=E3=82=92=E4=BD=BF=E7=94=A8=E3=81=99=E3=82=8B?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E3=81=AB=E7=B5=B1=E4=B8=80=E3=81=97=E3=80=81?= =?UTF-8?q?=E6=97=A2=E8=AA=AD=E3=83=9E=E3=83=BC=E3=82=AF=E6=A9=9F=E8=83=BD?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 61 +++++++++++++++++++++++----------------------------------- 1 file changed, 24 insertions(+), 37 deletions(-) diff --git a/app.py b/app.py index 2911b6a..5489fd2 100644 --- a/app.py +++ b/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}秒後に次のチェックを実行します")