邮件侦听器偶尔无法通过身份验证

Mail listener ocassionally fails to authenticate

问题:

我们有多个测试,我们需要实际检查测试用户的电子邮件作为测试用例步骤。这用于双因素身份验证和电子邮件通知测试。

目前,我们使用提供的解决方案 which is based on the mail-listener2 node package。这是我们使用的配置:

email: {
    username: "user email here",
    password: "user password here",
    host: "smtp server address here",
    port: 993,
    tls: true,
    mailbox: "Inbox",
    markSeen: true
},

我们在 onPrepare() 函数内的量角器配置中初始化邮件监听器:

var MailListener = require("mail-listener2");
var mailListener = new MailListener(config.email);

mailListener.start();

mailListener.on("server:connected", function(){
    console.log("Mail listener initialized");
});

global.mailListener = mailListener;

问题是 - 在大约 10% 的情况下,邮件侦听器会失败并显示以下错误消息:

Timed out while authenticating with server

问题:

是什么导致了这个问题?我们可以做些什么来使邮件监听器正常工作?另外,是否可以在失败时重试身份验证?

这是一个异步问题。您的邮件侦听器正在尝试检查事件 "server:connected"。由于这是异步的,因此这可能会或可能不会及时发生。您应该尝试做的是将其包装在承诺中并在事件发生后解决 "server:connected".

onPrepare: {
  return new Promise((resolve, reject) => {
    var MailListener = require("mail-listener2");
    var mailListener = new MailListener(config.email);

    mailListener.start();

    mailListener.on("server:connected", function(){
      console.log("Mail listener initialized");
      resolve();
    });

    // if you run into an error on connecting to the server,
    // maybe reject the promise here.
    mailListener.on("error", (err) => {
      reject(err);
    });

    global.mailListener = mailListener;
  });
}

@cnishina 的回答帮了大忙。我们更进一步并添加了 "retry" 部分以在失败时重试邮件侦听器 N 次:

this.configureMailListener = function (mailListener, maxRetries, deferred) {
    var self = this;

    if (!deferred) {
        deferred = protractor.promise.defer();
    }

    mailListener.start();

    mailListener.on("server:connected", function() {
        console.log("Mail listener initialized.");
        deferred.fulfill();
    });

    mailListener.on("error", function (err) {
        if (maxRetries > 0) {
            console.log("Mail listener failed to initialize. Retrying...");

            setTimeout(function () {
                mailListener.removeAllListeners();
                mailListener.stop();

                self.configureMailListener(mailListener, maxRetries - 1, deferred);
            }, 1000);
        } else {
            console.log("Mail listener failed to initialize.");
            deferred.reject(err);
        }
    });
    return deferred.promise;
};

用法,将此添加到onPrepare()

onPrepare: function () {
    // configure email listener
    var MailListener = require("mail-listener2");
    var config = require("../config/config");
    var mailListener = new MailListener(config.email);

    global.mailListener = mailListener;

    return helpers.configureMailListener(mailListener, 5);  // attempt to initialize mail-listener 5 times
},