public static string Authorize(this BaseProtocolClient ingoingMailClient, MailServerSettings settings, int waitTimeout = 5000, ILogger log = null)
        {
            if (log == null)
                log = new NullLogger();

            string lastResponse;
            switch (settings.EncryptionType)
            {
                case EncryptionType.SSL:
                    var timeout = TimeSpan.FromMinutes(3); // 3 minutes
                    log.Debug("SSL connecting to {0} (timeout = {1} minutes)", settings.Url, timeout.TotalMinutes);
                    lastResponse = ingoingMailClient.ConnectSsl(settings.Url, settings.Port, (int)timeout.TotalMilliseconds);

                    break;
                default:
                    log.Debug("PLAIN connecting to {0}", settings.Url);
                    lastResponse = ingoingMailClient.ConnectPlain(settings.Url, settings.Port);

                    if (ingoingMailClient is SmtpClient &&
                        (settings.AuthenticationType != SaslMechanism.None ||
                         settings.EncryptionType == EncryptionType.StartTLS))
                    {
                        lastResponse = ingoingMailClient.SendEhloHelo();
                    }

                    if (settings.EncryptionType == EncryptionType.StartTLS)
                    {
                        log.Debug("StartTLS {0}", settings.Url);
                        lastResponse = ingoingMailClient.StartTLS(settings.Url);
                    }

                    break;
            }

            if (settings.AuthenticationType == SaslMechanism.Login)
            {
                log.Debug("Login as {0} with secret password", settings.AccountName);
                lastResponse = ingoingMailClient.Login(settings.AccountName, settings.AccountPass);
            }
            else
            {
                if (ingoingMailClient is SmtpClient && settings.AuthenticationType == SaslMechanism.None)
                {
                    log.Debug("Authentication not required");
                    return lastResponse;
                }

                log.Debug("Authenticate as {0} with secret password", settings.AccountName);
                lastResponse = ingoingMailClient.Authenticate(settings.AccountName, settings.AccountPass, settings.AuthenticationType);

            }

            return lastResponse;
        }
예제 #2
0
        public static void AuthenticateImap(this Imap4Client imap, MailBox account, ILogger log = null)
        {
            if (log == null)
                log = new NullLogger();

            if (account.RefreshToken != null)
            {
                var serviceType = (AuthorizationServiceType)account.ServiceType;

                switch (serviceType)
                {
                    case AuthorizationServiceType.Google:
                        imap.AuthenticateImapGoogleOAuth2(account, log);
                        return;
                }
            }

            imap.Authorize(new MailServerSettings
            {
                AccountName = account.Account,
                AccountPass = account.Password,
                AuthenticationType = account.AuthenticationTypeIn,
                EncryptionType = account.IncomingEncryptionType,
                Port = account.Port,
                Url = account.Server
            }, account.AuthorizeTimeoutInMilliseconds, log);

            log.Info("IMAP logged in to {0}", account.EMail);
        }
예제 #3
0
        public static void AuthenticateImapGoogleOAuth2(this Imap4Client imap, MailBox account, ILogger log = null)
        {
            if (log == null)
                log = new NullLogger();

            var auth = new GoogleOAuth2Authorization(log);
            var grantedAccess = auth.RequestAccessToken(account.RefreshToken);
            if (grantedAccess == null)
                throw new DotNetOpenAuth.Messaging.ProtocolException("Access denied");
            log.Info("IMAP SSL connecting to {0}", account.EMail);
            imap.ConnectSsl(account.Server, account.Port);

            log.Info("IMAP connecting OK {0}", account.EMail);

            log.Info("IMAP logging to {0} via OAuth 2.0", account.EMail);
            imap.LoginOAuth2(account.Account, grantedAccess.AccessToken);
            log.Info("IMAP logged to {0} via OAuth 2.0", account.EMail);
        }