You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Cypress连接Gmail并提取邮件确认链接?

Cypress 从Gmail提取确认链接并完成验证的完整步骤

以下是两种可行的实现方案,覆盖从配置到测试用例编写的全流程:


方案1:通过IMAP协议直接读取Gmail邮件

这种方案无需依赖第三方服务,直接通过IMAP协议访问Gmail收件箱提取邮件内容。

前置配置

  • 开启Gmail IMAP访问:
    1. 登录目标测试Gmail账号,进入「设置」→「转发和POP/IMAP」
    2. 勾选「启用IMAP」,点击「保存更改」
  • 生成App密码(若开启2FA):
    1. 进入Google账号「安全」页面,找到「应用密码」入口
    2. 选择应用为「邮件」、设备为「其他(自定义名称)」,生成16位App密码并保存

代码实现

  1. 安装IMAP相关依赖:

    npm install imap simple-parser --save-dev
    
  2. 在cypress/support/commands.js中添加自定义命令:

    const Imap = require('imap');
    const simpleParser = require('simple-parser');
    
    Cypress.Commands.add('getGmailConfirmationLink', (email, password, subject) => {
      return new Cypress.Promise((resolve, reject) => {
        const imap = new Imap({
          user: email,
          password: password, // 2FA用户填生成的App密码,否则填邮箱密码
          host: 'imap.gmail.com',
          port: 993,
          tls: true,
          tlsOptions: { rejectUnauthorized: false }
        });
    
        const openInbox = (cb) => imap.openBox('INBOX', true, cb);
    
        imap.once('ready', () => {
          openInbox((err, box) => {
            if (err) return reject(err);
            // 搜索未读、指定主题的邮件
            const searchCriteria = ['UNSEEN', ['SUBJECT', subject]];
            const fetchOptions = { bodies: ['TEXT'], markSeen: true };
    
            // 从最新邮件开始搜索
            const fetch = imap.seq.fetch(box.messages.total + ':*', fetchOptions);
            fetch.on('message', (msg) => {
              msg.on('body', (stream) => {
                simpleParser(stream, (err, parsed) => {
                  if (err) return reject(err);
                  // 匹配确认链接(根据实际链接格式调整正则)
                  const linkRegex = /https?:\/\/[^\s]+\/verify[^\s]+/;
                  const match = parsed.text.match(linkRegex);
                  if (match) {
                    resolve(match[0]);
                    imap.end();
                  }
                });
              });
            });
    
            fetch.once('error', (err) => reject(err));
            fetch.once('end', () => {
              imap.end();
              reject(new Error('未找到符合条件的确认邮件'));
            });
          });
        });
    
        imap.once('error', (err) => reject(err));
        imap.connect();
      });
    });
    
  3. 编写测试用例:

    describe('用户注册与邮箱验证', () => {
      it('提交表单后完成邮箱验证', () => {
        // 1. 填写并提交注册表单
        cy.visit('/register');
        cy.get('#user-email').type('test-account@gmail.com');
        cy.get('#user-password').type('TestPass123!');
        cy.get('button[type="submit"]').click();
        cy.contains('请查收邮箱完成验证').should('be.visible');
    
        // 2. 提取确认链接并访问
        cy.getGmailConfirmationLink(
          'test-account@gmail.com',
          'your-app-password-or-email-password',
          '请确认你的账户' // 替换为实际邮件主题
        ).then((verifyLink) => {
          cy.visit(verifyLink);
          cy.contains('账户验证成功').should('be.visible');
        });
      });
    });
    

方案2:使用Cypress邮箱插件简化流程

借助Cypress专用邮箱插件可以减少自定义代码量,提升开发效率。

前置配置

  1. 安装插件:
    npm install cypress-email-commands --save-dev
    
  2. 在cypress/support/e2e.js中导入插件:
    import 'cypress-email-commands';
    
  3. 在cypress.config.js中配置IMAP信息:
    const { defineConfig } = require('cypress');
    
    module.exports = defineConfig({
      e2e: {
        setupNodeEvents(on, config) {
          config.email = {
            imap: {
              user: 'test-account@gmail.com',
              password: 'your-app-password',
              host: 'imap.gmail.com',
              port: 993,
              tls: true
            }
          };
          return config;
        },
      },
    });
    

测试用例编写

it('完成注册验证流程', () => {
  // 提交注册表单
  cy.visit('/register');
  cy.get('#user-email').type('test-account@gmail.com');
  cy.get('#user-password').type('TestPass123!');
  cy.get('button[type="submit"]').click();

  // 提取并访问确认链接
  cy.email('fetch', { subject: '账户确认' }).then((email) => {
    const verifyLink = email.html.match(/https?:\/\/[^\s]+\/confirm[^\s]+/)[0];
    cy.visit(verifyLink);
    cy.contains('验证成功').should('be.visible');
  });
});

注意事项

  • 请根据实际邮件中的确认链接格式调整正则表达式,确保能精准匹配
  • 测试建议使用专用的测试邮箱,避免干扰个人邮箱正常使用
  • 若遇到IMAP连接失败,检查Gmail账号的安全设置:是否允许IMAP访问、是否启用了App密码(2FA用户)
  • 可添加重试逻辑或适当等待时间,应对邮件延迟问题

内容的提问来源于stack exchange,提问作者Blerion Muco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:06:25