修复IMAP连接:支持非SSL端口143
- IMAP服务器 111.229.206.54 只开放143端口(非SSL),993不通 - 默认配置改为端口143、ssl=False - EmailVerifier 增加 use_ssl 参数,支持 IMAP4 和 IMAP4_SSL - Account 模型增加 email_imap_ssl 字段 - 数据库迁移:新增列 + 修正旧数据端口和SSL设置 - 导入账号时自动填充 ssl 配置 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
2b8716cf72
commit
52102655ac
@@ -25,6 +25,7 @@ class EmailVerifier:
|
|||||||
mailbox: str = "INBOX",
|
mailbox: str = "INBOX",
|
||||||
lookback_minutes: int = 10,
|
lookback_minutes: int = 10,
|
||||||
max_messages: int = 20,
|
max_messages: int = 20,
|
||||||
|
use_ssl: bool = True,
|
||||||
):
|
):
|
||||||
self.imap_server = imap_server
|
self.imap_server = imap_server
|
||||||
self.imap_port = imap_port
|
self.imap_port = imap_port
|
||||||
@@ -34,18 +35,26 @@ class EmailVerifier:
|
|||||||
self.mailbox = mailbox
|
self.mailbox = mailbox
|
||||||
self.lookback_minutes = lookback_minutes
|
self.lookback_minutes = lookback_minutes
|
||||||
self.max_messages = max_messages
|
self.max_messages = max_messages
|
||||||
|
self.use_ssl = use_ssl
|
||||||
self._connection: Optional[imaplib.IMAP4_SSL] = None
|
self._connection: Optional[imaplib.IMAP4_SSL] = None
|
||||||
|
|
||||||
def connect(self) -> None:
|
def connect(self) -> None:
|
||||||
"""连接IMAP服务器"""
|
"""连接IMAP服务器"""
|
||||||
try:
|
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._validate_login_text()
|
||||||
self._connection = imaplib.IMAP4_SSL(
|
if self.use_ssl:
|
||||||
self.imap_server,
|
self._connection = imaplib.IMAP4_SSL(
|
||||||
self.imap_port,
|
self.imap_server,
|
||||||
timeout=self.timeout,
|
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)
|
self._connection.login(self.username, self.password)
|
||||||
logger.info("IMAP连接成功")
|
logger.info("IMAP连接成功")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -336,13 +345,13 @@ class EmailVerifier:
|
|||||||
def get_email_config_for_account(email_address: str) -> dict:
|
def get_email_config_for_account(email_address: str) -> dict:
|
||||||
"""根据邮箱地址自动配置IMAP服务器,默认使用统一IMAP代理"""
|
"""根据邮箱地址自动配置IMAP服务器,默认使用统一IMAP代理"""
|
||||||
configs = {
|
configs = {
|
||||||
'qq.com': {'server': 'imap.qq.com', 'port': 993},
|
'qq.com': {'server': 'imap.qq.com', 'port': 993, 'ssl': True},
|
||||||
'163.com': {'server': 'imap.163.com', 'port': 993},
|
'163.com': {'server': 'imap.163.com', 'port': 993, 'ssl': True},
|
||||||
'126.com': {'server': 'imap.126.com', 'port': 993},
|
'126.com': {'server': 'imap.126.com', 'port': 993, 'ssl': True},
|
||||||
'gmail.com': {'server': 'imap.gmail.com', 'port': 993},
|
'gmail.com': {'server': 'imap.gmail.com', 'port': 993, 'ssl': True},
|
||||||
'outlook.com': {'server': 'outlook.office365.com', 'port': 993},
|
'outlook.com': {'server': 'outlook.office365.com', 'port': 993, 'ssl': True},
|
||||||
'hotmail.com': {'server': 'outlook.office365.com', 'port': 993},
|
'hotmail.com': {'server': 'outlook.office365.com', 'port': 993, 'ssl': True},
|
||||||
}
|
}
|
||||||
|
|
||||||
domain = email_address.split('@')[-1].lower()
|
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})
|
||||||
|
|||||||
@@ -480,6 +480,7 @@ class DouyuLogin:
|
|||||||
imap_port=self.account.email_imap_port,
|
imap_port=self.account.email_imap_port,
|
||||||
username=self.account.email,
|
username=self.account.email,
|
||||||
password=self.account.email_password,
|
password=self.account.email_password,
|
||||||
|
use_ssl=self.account.email_imap_ssl,
|
||||||
)
|
)
|
||||||
|
|
||||||
return verifier.get_verification_code(
|
return verifier.get_verification_code(
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ class Account:
|
|||||||
email_password: str
|
email_password: str
|
||||||
email_imap_server: str
|
email_imap_server: str
|
||||||
email_imap_port: int = 993
|
email_imap_port: int = 993
|
||||||
|
email_imap_ssl: bool = True
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
|||||||
@@ -51,6 +51,20 @@ def _migrate():
|
|||||||
conn.execute(text("ALTER TABLE users ADD COLUMN custom_permissions JSON DEFAULT NULL"))
|
conn.execute(text("ALTER TABLE users ADD COLUMN custom_permissions JSON DEFAULT NULL"))
|
||||||
conn.commit()
|
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():
|
def _seed():
|
||||||
"""写入默认超管账号和角色。"""
|
"""写入默认超管账号和角色。"""
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ class Account(Base):
|
|||||||
email_password = Column(String(256), nullable=False)
|
email_password = Column(String(256), nullable=False)
|
||||||
email_imap_server = Column(String(128), default="")
|
email_imap_server = Column(String(128), default="")
|
||||||
email_imap_port = Column(Integer, default=993)
|
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)
|
assigned_to = Column(Integer, ForeignKey("users.id"), nullable=True, index=True)
|
||||||
tag = Column(String(64), default="")
|
tag = Column(String(64), default="")
|
||||||
remark = Column(String(256), default="")
|
remark = Column(String(256), default="")
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ def import_accounts(
|
|||||||
email_password=email_password,
|
email_password=email_password,
|
||||||
email_imap_server=email_cfg['server'],
|
email_imap_server=email_cfg['server'],
|
||||||
email_imap_port=email_cfg.get('port', 993),
|
email_imap_port=email_cfg.get('port', 993),
|
||||||
|
email_imap_ssl=email_cfg.get('ssl', True),
|
||||||
tag=tag,
|
tag=tag,
|
||||||
))
|
))
|
||||||
|
|
||||||
|
|||||||
@@ -122,6 +122,7 @@ class LoginBatchRunner:
|
|||||||
email_password=acc_info["email_password"],
|
email_password=acc_info["email_password"],
|
||||||
email_imap_server=acc_info["email_imap_server"] or "",
|
email_imap_server=acc_info["email_imap_server"] or "",
|
||||||
email_imap_port=acc_info["email_imap_port"] or 993,
|
email_imap_port=acc_info["email_imap_port"] or 993,
|
||||||
|
email_imap_ssl=acc_info["email_imap_ssl"],
|
||||||
)
|
)
|
||||||
|
|
||||||
loginer = DouyuLogin(
|
loginer = DouyuLogin(
|
||||||
@@ -205,6 +206,7 @@ class LoginBatchRunner:
|
|||||||
"email_password": acc.email_password,
|
"email_password": acc.email_password,
|
||||||
"email_imap_server": acc.email_imap_server or "",
|
"email_imap_server": acc.email_imap_server or "",
|
||||||
"email_imap_port": acc.email_imap_port or 993,
|
"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,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user