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; }
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); }
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); }