netease-mail-batch-settings

Polar Sponsor
爱发电 赞助
.NET 9.0

针对网易企业邮箱,自动配置客户端授权全部邮件。

网易企业邮箱批量修改设置

功能概述

网易企业邮箱批量修改设置是一项面向实际任务的技能,主要用于使用 Selenium 4 自动化批量登录网易企业邮箱,修改客户端设置中的 SMTP 收件范围(改为"收取全部邮件")和客户端授权密码开关;本技能记录了从环境配置到脚本执行的全流程,以及开发过程中遇到的关键坑点和解决方案;

核心要点

  • 前置要求(必须先完成);
  • 使用本技能前,必须先让用户提供账号 txt 文件;
  • 没有账号文件脚本无法运行;

使用与执行

向用户索要账号文件,告知格式。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。

结果检查与注意事项

实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。

网易企业邮箱批量修改设置

概述

使用 Selenium 4 自动化批量登录网易企业邮箱,修改客户端设置中的 SMTP 收件范围(改为"收取全部邮件")和客户端授权密码开关。本技能记录了从环境配置到脚本执行的全流程,以及开发过程中遇到的关键坑点和解决方案。

前置要求(必须先完成)

使用本技能前,必须先让用户提供账号 txt 文件。 没有账号文件脚本无法运行。

操作步骤

  1. 向用户索要账号文件,告知格式要求:

    • 每行一个账号,格式为 用户名,密码
    • 支持英文逗号 , 和中文逗号 ,
    • 空行和以 # 开头的行会被跳过
    • 示例格式:
      t@qiyevip163.com,Qazwsx@12
      user2@qiyevip163.com,Password123
      
  2. 用户可以通过以下方式提供:

    • 直接在对话中发送 txt 文件
    • 把文件内容粘贴到对话中(帮其保存为 txt)
    • 告知文件已在本地某个路径
  3. 收到账号文件后,将其保存到工作目录下,默认文件名为 1.txt

  4. 确认环境就绪后再执行脚本(见下方"环境配置"和"运行命令"部分)

注意事项

  • 账号文件包含敏感信息(密码),不要将其内容输出到对话中
  • 如果用户只提供了文件内容而没有文件,主动帮其保存为 1.txt
  • 如果用户提供的格式有误(如缺少密码),提醒用户修正后再运行

适用场景

  • 批量修改多个网易企业邮箱账号的客户端设置
  • 需要将 IMAP/SMTP 和 POP/SMTP 的收取范围改为"收取全部邮件"
  • 需要关闭客户端授权密码
  • 需要记录失败账号及失败原因

环境配置

Python venv 隔离环境

# 使用 managed Python 创建 venv
"C:Usershuang.workbuddybinariespythonversions3.13.12python.exe" -m venv "C:Usershuang.workbuddybinariespythonenvsdefault"
# 安装 selenium
"C:Usershuang.workbuddybinariespythonenvsdefaultScriptspip.exe" install selenium

ChromeDriver 本地配置

Selenium 4 内置的在线下载 ChromeDriver 在国内网络环境下经常失败。解决方案:

  1. 从 npmmirror CDN 手动下载对应版本的 ChromeDriver
  2. 放到脚本同目录的 chromedriver/chromedriver-win64/ 下
  3. 脚本中通过 Service(executable_path=...) 指定本地路径
chromedriver_path = os.path.join(
    os.path.dirname(os.path.abspath(__file__)),
    "chromedriver", "chromedriver-win64", "chromedriver.exe",
)
if os.path.exists(chromedriver_path):
    service = Service(executable_path=chromedriver_path)
    driver = webdriver.Chrome(service=service, options=options)
else:
    driver = webdriver.Chrome(options=options)  # 回退到自动查找

账号文件格式

1.txt,每行一个账号,格式 用户名,密码(支持中文逗号):

t@qiyevip163.com,Qazwsx@12
user2@qiyevip163.com,Password123

核心技术要点

1. Selenium 4 API 迁移

旧版 find_element_by_xpath 已废弃,必须使用新 API:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 等待元素可点击并点击
el = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='设置']")))
el.click()

# 安全查找(找不到返回 None)
try:
    return WebDriverWait(driver, timeout).until(EC.presence_of_element_located(locator))
except (TimeoutException, NoSuchElementException):
    return None

2. 网易邮箱页面结构适配

网易企业邮箱页面有以下关键特征:

  • 登录:需先点"密码登录"tab,勾选许可协议,再输入 #accname 和 #accpwd
  • 设置入口:点击工具栏"设置" → 找到"客户端设置"旁边的"进入设置"链接
  • 新窗口:点击"进入设置"后会打开新窗口,必须 switch_to.window(handles[-1])
  • iframe:设置页面通常在主文档中,不需要切换 iframe(但需 switch_to.default_content() 确保在主文档)
  • 下拉框:页面使用原生 元素并派发 change 事件:

    select_script = """
        var section = arguments[0];
        var select = section.querySelector('select');
        if (!select) {
            var parent = section.parentElement;
            for (var i=0; i<5 && parent; i++) {
                select = parent.querySelector('select');
                if (select) break;
                parent = parent.parentElement;
            }
        }
        if (select) {
            for (var i=0; i
    

    4. 原生 alert 自动确认(关键)

    修改 select 值并触发 change 事件后,网易页面会弹出原生 JavaScript alert("邮件客户端收取时间设置成功")。必须等待 alert 出现再 accept:

    def _accept_modal(driver, timeout=10):
        # 1. 等待原生 alert 出现(不能用 try/except 立即检测,alert 可能还没弹出)
        try:
            WebDriverWait(driver, timeout).until(EC.alert_is_present())
            alert = driver.switch_to.alert
            text = alert.text
            alert.accept()
            WebDriverWait(driver, timeout).until_not(EC.alert_is_present())
            return text
        except Exception:
            pass
        # 2. 兜底:尝试自定义 HTML 弹窗的"确定"按钮
        try:
            ok_btn = WebDriverWait(driver, timeout).until(
                EC.element_to_be_clickable((By.XPATH, "//button[contains(text(),'确定')]"))
            )
            driver.execute_script("arguments[0].click();", ok_btn)
            return "自定义弹窗-确定"
        except Exception:
            pass
        return None
    

    常见坑:之前用 try/except 立即检测 alert,因为 alert 还没弹出来就跳过了,导致修改实际没生效。必须用 WebDriverWait(driver, timeout).until(EC.alert_is_present()) 阻塞等待。

    5. 失败原因追踪与日志记录

    核心函数返回 tuple[bool, str],第二个元素为失败原因:

    def login(driver, account) -> tuple[bool, str]:
        ...
        return False, "登录超时,可能密码错误或遇到验证码"
    
    def process_account(driver, account) -> tuple[bool, str]:
        try:
            ok, reason = login(driver, account)
            if not ok:
                return False, reason
            ...
        except WebDriverException as e:
            return False, f"浏览器异常: {type(e).__name__}: {str(e)[:100]}"
    

    运行结束后,失败账号及原因写入 failed_accounts.log:

    @dataclass
    class RunStats:
        failed_details: list = field(default_factory=list)  # [(账号, 原因), ...]
    
        def write_failure_log(self, file_path):
            if not self.failed_details:
                return
            lines = [f"# 失败日志 — 生成时间 {timestamp}", f"# 共 {self.failed} 个账号失败", ""]
            for i, (username, reason) in enumerate(self.failed_details, 1):
                lines.append(f"{i}. 账号: {username}")
                lines.append(f"   原因: {reason}")
                lines.append("")
            Path(file_path).write_text("n".join(lines), encoding="utf-8")
    

    完整流程

    0. 【前置】向用户索要账号 txt 文件,保存到工作目录为 1.txt
    1. load_accounts()  — 从 1.txt 读取账号列表
    2. create_driver()  — 创建 Chrome 实例,指定本地 chromedriver
    3. 对每个账号:
       a. login()           — 登录网易企业邮箱
       b. enter_mailbox()   — 进入邮箱主界面
       c. open_settings()   — 打开设置 → 客户端设置(新窗口)
       d. modify_settings():
          - _select_dropdown_option("IMAP / SMTP") → 改为"收取全部邮件" + 确认弹窗
          - _select_dropdown_option("POP / SMTP")  → 改为"收取全部邮件" + 确认弹窗
          - 检查并关闭客户端授权密码
       e. driver.delete_all_cookies()  — 清理状态
    4. driver.quit()
    5. 输出统计摘要 + 写入 failed_accounts.log
    

    运行命令

    # 基本运行(使用默认 1.txt)
    "C:Usershuang.workbuddybinariespythonenvsdefaultScriptspython.exe" "py-网易邮箱批量修改设置脚本.py"
    
    # 指定账号文件
    "C:Usershuang.workbuddybinariespythonenvsdefaultScriptspython.exe" "py-网易邮箱批量修改设置脚本.py" --file accounts.txt
    
    # 无头模式
    "C:Usershuang.workbuddybinariespythonenvsdefaultScriptspython.exe" "py-网易邮箱批量修改设置脚本.py" --headless
    

    踩坑记录

    问题 原因 解决方案
    Selenium 内置 chromedriver 下载失败 国内网络无法访问 googlechromelabs 从 npmmirror CDN 手动下载,指定本地路径
    find_element_by_xpath 报错 Selenium 4 废弃旧 API 改用 find_element(By.XPATH, ...)
    登录后找不到设置按钮 页面结构变化 改用文本匹配定位 + JavaScript 点击
    点击"进入设置"后找不到元素 新窗口未切换 switch_to.window(handles[-1])
    下拉框点击展开后选项找不到 chromedriver 对复杂 XPath 崩溃 改用 document.querySelectorAll
    JavaScript 点击文本节点不触发选择 未操作底层 select 直接修改 select.selectedIndex + 派发 change 事件
    修改后弹窗未确认 try/except 检测 alert 太快 WebDriverWait().until(EC.alert_is_present()) 阻塞等待

    资源文件

    scripts/

    • netease_mail_batch.py — 完整的可运行脚本,可直接复制使用或作为基础进行修改

    references/

    • page_structure.md — 网易企业邮箱页面结构参考文档,记录各关键元素的定位方式

相关专题

更多
Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

2026.11.12

0

15

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

2026.11.12

0

15

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

2026.11.12

0

15

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

0

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

0

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

0

10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

0

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

0

12

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

2026.11.04

0

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.3万人学习