feat(service): Add email status update handling for bounce cases
This commit is contained in:
parent
1d6f41c3b5
commit
0a01b1c6c6
@ -11,13 +11,13 @@ class EmailBounceService:
|
||||
|
||||
async def process_bounce_event(self, email: str, tenant_id: str, bounce_type: BounceType,
|
||||
reason: str, message_id: str = None) -> Dict:
|
||||
"""处理退信事件,建立email_id关联"""
|
||||
"""handle bounce event, create email_id association"""
|
||||
try:
|
||||
# 1. 查找对应的邮件记录
|
||||
# 1. find corresponding email record
|
||||
email_status_doc = await EmailSendStatusDoc.find_one(
|
||||
EmailSendStatusDoc.recipient_email == email,
|
||||
EmailSendStatusDoc.tenant_id == tenant_id
|
||||
).sort(-EmailSendStatusDoc.created_at) # 获取最新的邮件记录
|
||||
).sort(-EmailSendStatusDoc.created_at)
|
||||
|
||||
email_id = None
|
||||
template_id = None
|
||||
@ -25,6 +25,12 @@ class EmailBounceService:
|
||||
if email_status_doc:
|
||||
email_id = email_status_doc.email_id
|
||||
template_id = email_status_doc.template_id
|
||||
|
||||
# 2. update email status to bounced
|
||||
email_status_doc.status = EmailSendStatus.BOUNCED
|
||||
email_status_doc.updated_at = datetime.utcnow()
|
||||
await email_status_doc.save()
|
||||
|
||||
await self.module_logger.log_info(
|
||||
"Found email record for bounce",
|
||||
properties={
|
||||
@ -42,11 +48,11 @@ class EmailBounceService:
|
||||
}
|
||||
)
|
||||
|
||||
# 2. 创建退信记录
|
||||
# 3. create bounce record
|
||||
bounce_doc = EmailBounceDoc(
|
||||
email=email,
|
||||
tenant_id=tenant_id,
|
||||
email_id=email_id, # 建立关联
|
||||
email_id=email_id,
|
||||
template_id=template_id,
|
||||
bounce_type=bounce_type,
|
||||
reason=reason,
|
||||
@ -89,7 +95,7 @@ class EmailBounceService:
|
||||
raise
|
||||
|
||||
async def get_bounce_info(self, email: str, tenant_id: str) -> Optional[Dict]:
|
||||
"""获取退信信息"""
|
||||
"""get bounce info"""
|
||||
try:
|
||||
bounce_doc = await EmailBounceDoc.find_one(
|
||||
EmailBounceDoc.email == email,
|
||||
@ -125,7 +131,7 @@ class EmailBounceService:
|
||||
raise
|
||||
|
||||
async def mark_bounce_processed(self, email: str, tenant_id: str) -> bool:
|
||||
"""标记退信为已处理"""
|
||||
"""mark bounce as processed"""
|
||||
try:
|
||||
bounce_doc = await EmailBounceDoc.find_one(
|
||||
EmailBounceDoc.email == email,
|
||||
@ -159,14 +165,13 @@ class EmailBounceService:
|
||||
)
|
||||
raise
|
||||
|
||||
async def is_blacklisted(self, email: str, tenant_id: str) -> bool:
|
||||
"""检查邮箱是否在黑名单中"""
|
||||
async def is_blacklisted(self, email: str, tenant_id: str):
|
||||
"""check if email is blacklisted"""
|
||||
try:
|
||||
# 查找该邮箱的退信记录
|
||||
bounce_doc = await EmailBounceDoc.find_one(
|
||||
EmailBounceDoc.email == email,
|
||||
EmailBounceDoc.tenant_id == tenant_id,
|
||||
EmailBounceDoc.bounce_type == BounceType.HARD_BOUNCE # 只检查硬退信
|
||||
EmailBounceDoc.bounce_type == BounceType.HARD_BOUNCE
|
||||
)
|
||||
|
||||
is_blacklisted = bounce_doc is not None
|
||||
|
||||
Loading…
Reference in New Issue
Block a user