从 TempMail 邮箱获取验证码 Args: email: 邮箱地址 email_id: 未使用,保留接口兼容 timeout: 超时时间(秒) pattern: 验证码正则 otp_sent_at: OTP 发送时间戳(用于过滤旧邮件) Returns: 验证码字符串,超时返回 None
(
self,
email: str,
email_id: str = None,
timeout: int = 120,
pattern: str = OTP_CODE_PATTERN,
otp_sent_at: Optional[float] = None,
)
| 676 | raise EmailServiceError(f"创建邮箱失败: {e}") |
| 677 | |
| 678 | def get_verification_code( |
| 679 | self, |
| 680 | email: str, |
| 681 | email_id: str = None, |
| 682 | timeout: int = 120, |
| 683 | pattern: str = OTP_CODE_PATTERN, |
| 684 | otp_sent_at: Optional[float] = None, |
| 685 | ) -> Optional[str]: |
| 686 | """ |
| 687 | 从 TempMail 邮箱获取验证码 |
| 688 | |
| 689 | Args: |
| 690 | email: 邮箱地址 |
| 691 | email_id: 未使用,保留接口兼容 |
| 692 | timeout: 超时时间(秒) |
| 693 | pattern: 验证码正则 |
| 694 | otp_sent_at: OTP 发送时间戳(用于过滤旧邮件) |
| 695 | |
| 696 | Returns: |
| 697 | 验证码字符串,超时返回 None |
| 698 | """ |
| 699 | logger.info(f"正在从 TempMail 邮箱 {email} 获取验证码...") |
| 700 | |
| 701 | start_time = time.time() |
| 702 | seen_mail_ids: set = set() |
| 703 | last_used_mail_id = self._last_used_mail_ids.get(email) |
| 704 | unknown_ts_grace_seconds = 15 |
| 705 | |
| 706 | # 优先使用用户级 JWT,回退到 admin API |
| 707 | cached = self._email_cache.get(email, {}) |
| 708 | jwt = cached.get("jwt") |
| 709 | address_id = ( |
| 710 | str(cached.get("address_id") or "").strip() |
| 711 | or str(email_id or "").strip() |
| 712 | or None |
| 713 | ) |
| 714 | poll_count = 0 |
| 715 | |
| 716 | while time.time() - start_time < timeout: |
| 717 | poll_count += 1 |
| 718 | try: |
| 719 | mails = self._fetch_mails_once(email=email, jwt=jwt, email_id=address_id) |
| 720 | if not mails: |
| 721 | if poll_count == 1 or poll_count % 5 == 0: |
| 722 | logger.info( |
| 723 | f"TempMail 轮询[{email}] 第 {poll_count} 次: 暂无邮件(已等待 {int(time.time() - start_time)}s)" |
| 724 | ) |
| 725 | time.sleep(3) |
| 726 | continue |
| 727 | |
| 728 | if poll_count == 1 or poll_count % 3 == 0: |
| 729 | logger.info( |
| 730 | f"TempMail 轮询[{email}] 第 {poll_count} 次: 收到 {len(mails)} 封候选邮件" |
| 731 | ) |
| 732 | |
| 733 | candidates: List[Dict[str, Any]] = [] |
| 734 | unknown_ts_candidates: List[Dict[str, Any]] = [] |
| 735 |