メール監視機能を強化し、新しいメールをUIDで取得するメソッドを追加
This commit is contained in:
58
app.py
58
app.py
@@ -96,6 +96,52 @@ class EmailMonitor:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning(f"メールサーバーからの切断でエラーが発生しました: {str(e)}")
|
logger.warning(f"メールサーバーからの切断でエラーが発生しました: {str(e)}")
|
||||||
|
|
||||||
|
def get_latest_email_uid(self) -> Optional[str]:
|
||||||
|
"""最新のメールUIDを取得"""
|
||||||
|
try:
|
||||||
|
typ, data = self.mail_client.search(None, 'ALL')
|
||||||
|
if typ != 'OK' or not data[0]:
|
||||||
|
logger.warning("メールボックスが空です")
|
||||||
|
return None
|
||||||
|
|
||||||
|
email_ids = data[0].split()
|
||||||
|
return email_ids[-1].decode() # 最新のUIDを取得
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"最新メールUIDの取得に失敗しました: {str(e)}")
|
||||||
|
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 []
|
||||||
|
|
||||||
def get_new_emails(self) -> List[EmailMessage]:
|
def get_new_emails(self) -> List[EmailMessage]:
|
||||||
"""新しいメールを取得"""
|
"""新しいメールを取得"""
|
||||||
try:
|
try:
|
||||||
@@ -275,14 +321,16 @@ class EmailMonitor:
|
|||||||
|
|
||||||
while self.running:
|
while self.running:
|
||||||
try:
|
try:
|
||||||
# メールサーバーに接続
|
|
||||||
if not self.connect_to_email():
|
if not self.connect_to_email():
|
||||||
logger.warning(f"{self.check_interval}秒後に再試行します...")
|
logger.warning(f"{self.check_interval}秒後に再試行します...")
|
||||||
time.sleep(self.check_interval)
|
time.sleep(self.check_interval)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# 新しいメールをチェック
|
if self.last_processed_uid is None:
|
||||||
new_emails = self.get_new_emails()
|
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)
|
||||||
|
|
||||||
if new_emails:
|
if new_emails:
|
||||||
logger.info(f"{len(new_emails)}件の新しいメールが見つかりました")
|
logger.info(f"{len(new_emails)}件の新しいメールが見つかりました")
|
||||||
@@ -290,15 +338,13 @@ class EmailMonitor:
|
|||||||
for email_msg in new_emails:
|
for email_msg in new_emails:
|
||||||
if self.send_to_discord(email_msg):
|
if self.send_to_discord(email_msg):
|
||||||
logger.info(f"処理完了: {email_msg.subject}")
|
logger.info(f"処理完了: {email_msg.subject}")
|
||||||
|
self.last_processed_uid = email_msg.uid # 最後に処理したUIDを更新
|
||||||
else:
|
else:
|
||||||
logger.warning(f"Discord送信失敗: {email_msg.subject}")
|
logger.warning(f"Discord送信失敗: {email_msg.subject}")
|
||||||
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}秒後に次のチェックを実行します")
|
||||||
time.sleep(self.check_interval)
|
time.sleep(self.check_interval)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user