test
This commit is contained in:
26
app/utils.py
26
app/utils.py
@@ -44,12 +44,12 @@ class CustomSMTPServer(smtpd.SMTPServer):
|
|||||||
def process_message(self, peer, mailfrom, rcpttos, data):
|
def process_message(self, peer, mailfrom, rcpttos, data):
|
||||||
try:
|
try:
|
||||||
# 记录接收到的邮件基本信息
|
# 记录接收到的邮件基本信息
|
||||||
logger.info(f'Received mail from {mailfrom} to {rcpttos}')
|
logger.info(f"Received mail from {mailfrom} to {rcpttos}")
|
||||||
|
|
||||||
# 验证收件人域名
|
# 验证收件人域名
|
||||||
for rcpt in rcpttos:
|
for rcpt in rcpttos:
|
||||||
if not rcpt.endswith('@nosqli.com'):
|
if not rcpt.endswith('@nosqli.com'):
|
||||||
logger.warning(f'Rejected mail to {rcpt}: invalid domain')
|
logger.warning(f"Rejected mail to {rcpt}: invalid domain")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# 解析邮件
|
# 解析邮件
|
||||||
@@ -63,7 +63,7 @@ class CustomSMTPServer(smtpd.SMTPServer):
|
|||||||
|
|
||||||
# 构建邮件数据
|
# 构建邮件数据
|
||||||
timestamp = datetime.now().isoformat()
|
timestamp = datetime.now().isoformat()
|
||||||
message_id = email.get('Message-ID', f'<{timestamp}@nosqli.com>')
|
message_id = email.get('Message-ID', f"<{timestamp}@nosqli.com>")
|
||||||
|
|
||||||
email_data = {
|
email_data = {
|
||||||
'message_id': message_id,
|
'message_id': message_id,
|
||||||
@@ -80,10 +80,10 @@ class CustomSMTPServer(smtpd.SMTPServer):
|
|||||||
# 存储邮件
|
# 存储邮件
|
||||||
self._store_email(email_data)
|
self._store_email(email_data)
|
||||||
|
|
||||||
logger.info(f'Successfully processed mail: {message_id}')
|
logger.info(f"Successfully processed mail: {message_id}")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f'Error processing email: {str(e)}', exc_info=True)
|
logger.error(f"Error processing email: {str(e)}", exc_info=True)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
def _get_email_body(self, email):
|
def _get_email_body(self, email):
|
||||||
@@ -97,7 +97,7 @@ class CustomSMTPServer(smtpd.SMTPServer):
|
|||||||
return email.get_payload(decode=True).decode()
|
return email.get_payload(decode=True).decode()
|
||||||
return ""
|
return ""
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f'Error extracting email body: {str(e)}')
|
logger.error(f"Error extracting email body: {str(e)}")
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
def _process_attachments(self, email):
|
def _process_attachments(self, email):
|
||||||
@@ -121,42 +121,42 @@ class CustomSMTPServer(smtpd.SMTPServer):
|
|||||||
'size': len(attachment_data)
|
'size': len(attachment_data)
|
||||||
})
|
})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f'Error processing attachments: {str(e)}')
|
logger.error(f"Error processing attachments: {str(e)}")
|
||||||
return attachments
|
return attachments
|
||||||
|
|
||||||
def _store_email(self, email_data):
|
def _store_email(self, email_data):
|
||||||
"""存储邮件到 Redis"""
|
"""存储邮件到 Redis"""
|
||||||
try:
|
try:
|
||||||
# 使用 message_id 作为主键
|
# 使用 message_id 作为主键
|
||||||
email_key = f'email:{email_data["message_id"]}'
|
email_key = f"email:{email_data['message_id']}"
|
||||||
redis_client.hmset(email_key, email_data)
|
redis_client.hmset(email_key, email_data)
|
||||||
|
|
||||||
# 为每个收件人创建索引
|
# 为每个收件人创建索引
|
||||||
recipients = json.loads(email_data['recipients'])
|
recipients = json.loads(email_data['recipients'])
|
||||||
for recipient in recipients:
|
for recipient in recipients:
|
||||||
recipient_key = f'recipient:{recipient}'
|
recipient_key = f"recipient:{recipient}"
|
||||||
redis_client.lpush(recipient_key, email_key)
|
redis_client.lpush(recipient_key, email_key)
|
||||||
|
|
||||||
# 创建时间索引
|
# 创建时间索引
|
||||||
time_key = f'time:{email_data["timestamp"]}'
|
time_key = f"time:{email_data['timestamp']}"
|
||||||
redis_client.set(time_key, email_key)
|
redis_client.set(time_key, email_key)
|
||||||
|
|
||||||
# 设置过期时间(可选,这里设置为30天)
|
# 设置过期时间(可选,这里设置为30天)
|
||||||
redis_client.expire(email_key, 30 * 24 * 60 * 60)
|
redis_client.expire(email_key, 30 * 24 * 60 * 60)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f'Error storing email: {str(e)}')
|
logger.error(f"Error storing email: {str(e)}")
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
def start_smtp_server(host='0.0.0.0', port=25):
|
def start_smtp_server(host='0.0.0.0', port=25):
|
||||||
"""启动 SMTP 服务器"""
|
"""启动 SMTP 服务器"""
|
||||||
try:
|
try:
|
||||||
logger.info(f'Starting SMTP server on {host}:{port}')
|
logger.info(f"Starting SMTP server on {host}:{port}")
|
||||||
server = CustomSMTPServer((host, port), None)
|
server = CustomSMTPServer((host, port), None)
|
||||||
asyncore.loop()
|
asyncore.loop()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f'Error starting SMTP server: {str(e)}')
|
logger.error(f"Error starting SMTP server: {str(e)}")
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user