尊敬的管理员,
有新用户注册了接龙自动打卡系统,请及时审批。
| 用户名 | {user.alias} |
| 用户 ID | {user.id} |
| 注册时间 | {created_time} |
该用户需要在 24 小时内通过审批,否则账户将被自动删除。
请登录管理后台进行审批操作。
""" 邮件业务服务 (高级) 职能:提供业务相关的邮件操作 - 新用户注册通知 - 用户审批通知 - 打卡结果通知 - Token 到期提醒 - 调用底层 EmailNotifier 发送邮件 """ import logging from datetime import datetime from typing import List from sqlalchemy.orm import Session from backend.models import User from backend.workers.email_notifier import EmailNotifier from backend.config import settings logger = logging.getLogger(__name__) class EmailService: """邮件业务服务(高级服务)""" @staticmethod def send_email(to_emails: List[str], subject: str, body_html: str) -> bool: """ 发送邮件(业务层方法,调用底层 EmailNotifier) Args: to_emails: 收件人邮箱列表 subject: 邮件主题 body_html: 邮件正文(HTML 格式) Returns: 是否发送成功 """ return EmailNotifier.send_email(to_emails, subject, body_html) @staticmethod def notify_new_user_registration(user: User, db: Session) -> bool: """ 通知管理员有新用户注册 Args: user: 新注册的用户 db: 数据库会话 Returns: 是否发送成功 """ # 查询所有管理员邮箱 admins = db.query(User).filter(User.role == "admin", User.email.isnot(None)).all() # 使用 str() 转换避免类型检查问题,并过滤空值 admin_emails: List[str] = [] for admin in admins: email_value = admin.email if email_value is not None: # 使用 is not None 避免布尔转换 admin_emails.append(str(email_value)) if not admin_emails: logger.warning("没有找到管理员邮箱,无法发送通知") return False # 构建邮件内容 subject = f"【接龙自动打卡系统】新用户注册通知 - {user.alias}" # 安全获取创建时间 created_at_value = user.created_at created_time = created_at_value.strftime('%Y-%m-%d %H:%M:%S') if created_at_value is not None else '未知' body_html = f"""
尊敬的管理员,
有新用户注册了接龙自动打卡系统,请及时审批。
| 用户名 | {user.alias} |
| 用户 ID | {user.id} |
| 注册时间 | {created_time} |
该用户需要在 24 小时内通过审批,否则账户将被自动删除。
请登录管理后台进行审批操作。
您好,{user.alias}!
恭喜您的账户已通过管理员审批,现在可以使用所有功能了。
| 用户名 | {user.alias} |
| 账户角色 | {user.role} |
| 注册时间 | {created_time} |
接下来您可以:
💡 温馨提示:如果您还没有设置密码,建议在个人设置中设置密码,方便后续登录。
拒绝原因:{reason}
" if reason else "" body_html = f"""您好,{user.alias}!
很遗憾,您的账户注册申请未能通过审批。
如有疑问,请联系系统管理员。
您好,{user.alias}!
您的 QQ 登录凭证即将在 {minutes_left} 分钟后过期。
如何刷新凭证:
您好,{user.alias}!
您的接龙自动打卡任务已执行。
| 执行时间 | {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} |
| 任务 ID | {task_info.get('thread_id', '未知')} |
| 打卡状态 | {status_text} |
| 详细信息 | {message} |
如有问题,请及时检查您的打卡配置。