diff --git a/core/douyu/email_verifier.py b/core/douyu/email_verifier.py index b527446..e1c1ef3 100644 --- a/core/douyu/email_verifier.py +++ b/core/douyu/email_verifier.py @@ -25,6 +25,7 @@ class EmailVerifier: mailbox: str = "INBOX", lookback_minutes: int = 10, max_messages: int = 20, + use_ssl: bool = True, ): self.imap_server = imap_server self.imap_port = imap_port @@ -34,18 +35,26 @@ class EmailVerifier: self.mailbox = mailbox self.lookback_minutes = lookback_minutes self.max_messages = max_messages + self.use_ssl = use_ssl self._connection: Optional[imaplib.IMAP4_SSL] = None def connect(self) -> None: """连接IMAP服务器""" try: - logger.info(f"连接IMAP服务器: {self.imap_server}:{self.imap_port}") + logger.info(f"连接IMAP服务器: {self.imap_server}:{self.imap_port} (SSL={self.use_ssl})") self._validate_login_text() - self._connection = imaplib.IMAP4_SSL( - self.imap_server, - self.imap_port, - timeout=self.timeout, - ) + if self.use_ssl: + self._connection = imaplib.IMAP4_SSL( + self.imap_server, + self.imap_port, + timeout=self.timeout, + ) + else: + self._connection = imaplib.IMAP4( + self.imap_server, + self.imap_port, + timeout=self.timeout, + ) self._connection.login(self.username, self.password) logger.info("IMAP连接成功") except Exception as e: @@ -336,13 +345,13 @@ class EmailVerifier: def get_email_config_for_account(email_address: str) -> dict: """根据邮箱地址自动配置IMAP服务器,默认使用统一IMAP代理""" configs = { - 'qq.com': {'server': 'imap.qq.com', 'port': 993}, - '163.com': {'server': 'imap.163.com', 'port': 993}, - '126.com': {'server': 'imap.126.com', 'port': 993}, - 'gmail.com': {'server': 'imap.gmail.com', 'port': 993}, - 'outlook.com': {'server': 'outlook.office365.com', 'port': 993}, - 'hotmail.com': {'server': 'outlook.office365.com', 'port': 993}, + 'qq.com': {'server': 'imap.qq.com', 'port': 993, 'ssl': True}, + '163.com': {'server': 'imap.163.com', 'port': 993, 'ssl': True}, + '126.com': {'server': 'imap.126.com', 'port': 993, 'ssl': True}, + 'gmail.com': {'server': 'imap.gmail.com', 'port': 993, 'ssl': True}, + 'outlook.com': {'server': 'outlook.office365.com', 'port': 993, 'ssl': True}, + 'hotmail.com': {'server': 'outlook.office365.com', 'port': 993, 'ssl': True}, } domain = email_address.split('@')[-1].lower() - return configs.get(domain, {'server': '111.229.206.54', 'port': 993}) + return configs.get(domain, {'server': '111.229.206.54', 'port': 143, 'ssl': False}) diff --git a/core/douyu/login.py b/core/douyu/login.py index ced6f5c..e026582 100644 --- a/core/douyu/login.py +++ b/core/douyu/login.py @@ -480,6 +480,7 @@ class DouyuLogin: imap_port=self.account.email_imap_port, username=self.account.email, password=self.account.email_password, + use_ssl=self.account.email_imap_ssl, ) return verifier.get_verification_code( diff --git a/core/models.py b/core/models.py index df06565..1602675 100644 --- a/core/models.py +++ b/core/models.py @@ -12,6 +12,7 @@ class Account: email_password: str email_imap_server: str email_imap_port: int = 993 + email_imap_ssl: bool = True @dataclass diff --git a/web/backend/database.py b/web/backend/database.py index 8bd0a3a..05e0c2b 100644 --- a/web/backend/database.py +++ b/web/backend/database.py @@ -51,6 +51,20 @@ def _migrate(): conn.execute(text("ALTER TABLE users ADD COLUMN custom_permissions JSON DEFAULT NULL")) conn.commit() + # 检查 accounts.email_imap_ssl 列是否存在 + result = conn.execute(text("PRAGMA table_info(accounts)")) + columns = [row[1] for row in result] + if 'email_imap_ssl' not in columns: + # 旧数据端口993的默认True(SSL),其他端口默认False + conn.execute(text("ALTER TABLE accounts ADD COLUMN email_imap_ssl BOOLEAN DEFAULT 1")) + conn.commit() + # 修正旧数据中使用 111.229.206.54 的账号:端口改为143,SSL改为False + conn.execute(text( + "UPDATE accounts SET email_imap_port = 143, email_imap_ssl = 0 " + "WHERE email_imap_server = '111.229.206.54'" + )) + conn.commit() + def _seed(): """写入默认超管账号和角色。""" diff --git a/web/backend/models.py b/web/backend/models.py index bd68551..fa30ab5 100644 --- a/web/backend/models.py +++ b/web/backend/models.py @@ -42,6 +42,7 @@ class Account(Base): email_password = Column(String(256), nullable=False) email_imap_server = Column(String(128), default="") email_imap_port = Column(Integer, default=993) + email_imap_ssl = Column(Boolean, default=True) assigned_to = Column(Integer, ForeignKey("users.id"), nullable=True, index=True) tag = Column(String(64), default="") remark = Column(String(256), default="") diff --git a/web/backend/routers/accounts.py b/web/backend/routers/accounts.py index 6e04d8e..5e03738 100644 --- a/web/backend/routers/accounts.py +++ b/web/backend/routers/accounts.py @@ -121,6 +121,7 @@ def import_accounts( email_password=email_password, email_imap_server=email_cfg['server'], email_imap_port=email_cfg.get('port', 993), + email_imap_ssl=email_cfg.get('ssl', True), tag=tag, )) diff --git a/web/backend/services/login_service.py b/web/backend/services/login_service.py index 37f6076..b36ca1d 100644 --- a/web/backend/services/login_service.py +++ b/web/backend/services/login_service.py @@ -122,6 +122,7 @@ class LoginBatchRunner: email_password=acc_info["email_password"], email_imap_server=acc_info["email_imap_server"] or "", email_imap_port=acc_info["email_imap_port"] or 993, + email_imap_ssl=acc_info["email_imap_ssl"], ) loginer = DouyuLogin( @@ -205,6 +206,7 @@ class LoginBatchRunner: "email_password": acc.email_password, "email_imap_server": acc.email_imap_server or "", "email_imap_port": acc.email_imap_port or 993, + "email_imap_ssl": acc.email_imap_ssl if acc.email_imap_ssl is not None else True, }, })