private bool Connect(ImapParams client) { try { if (_connected) { return(true); } _connection = new TcpClient(client.Host, client.Port); _stream = _connection.GetStream(); if (client.Ssl) { _stream = new SslStream( _stream, false, client.Validate ? null : new RemoteCertificateValidationCallback((sender, cert, chain, err) => true)); ((SslStream)_stream).AuthenticateAsClient(client.Host); } var response = _stream.ReadLine(); _connected = response.StartsWith("* OK"); return(_connected); } catch (Exception ex) { Log.Error("There was an error connecting to the mail server.", ex); _connected = false; return(_connected); } }
public override void Execute(object context, ActivityQueue queue, Trigger trigger) { // get the login information out of the credential store int count; IntPtr pCredentials; var ret = AdvApi32.CredEnumerate(null, 0, out count, out pCredentials); if (!ret) { throw new Win32Exception(); } var credentials = new IntPtr[count]; // convert pointer to array to array of pointers for (var n = 0; n < count; n++) { credentials[n] = Marshal.ReadIntPtr(pCredentials, n * Marshal.SizeOf(typeof(IntPtr))); } var login = credentials // convert each pointer to a structure .Select(ptr => (WinCred.Credential)Marshal.PtrToStructure(ptr, typeof(WinCred.Credential))) // select the structure with the matching credential name .FirstOrDefault(cred => cred.targetName.StartsWith(_credential)); // get the password var currentPass = Marshal.PtrToStringUni(login.credentialBlob, (int)login.credentialBlobSize / 2); var lastError = Marshal.GetLastWin32Error(); if (lastError != 0) { throw new Win32Exception(lastError); } // finally try to log in var hostArr = login.targetName.Substring(_credential.Length + 1).Split(':'); var host = hostArr[0]; var port = hostArr.Length > 1 ? int.Parse(hostArr[1]) : 143; var @params = new ImapParams { Host = host, Username = login.userName, Password = currentPass, Port = port, Validate = false, Ssl = port == 993 || port == 995, Queue = queue }; // start a thread to check for e-mail ThreadPool.QueueUserWorkItem(MailPoller, @params); }
private void InsertMessage(Message message, ImapParams client) { using (var data = new DatalayerDataContext()) { // check if the message is already added if (data.Emails.Any(x => x.Uid == message.Uid && x.Folder == message.Folder)) { return; } try { // store important information in the database for later searching var newMail = new Email { Body = message.Body, Folder = message.Folder, Uid = message.Uid, Headers = message.RawHeaders, Host = client.Username + "@" + client.Host, Raw = message.Raw, Subject = message.Subject, To = string.Join(";", message.To), From = string.Join(";", message.From), Received = message.Received }; data.Emails.InsertOnSubmit(newMail); data.SubmitChanges(); } catch (Exception ex) { Log.Error( string.Format("Error caching e-mail {0} {1}", message.Uid, message.Folder), ex); } } }
private bool Login(ImapParams client) { try { if (_authenticated) { return(true); } var tag = GetTag(); string result; switch (_method) { case AuthMethods.CRAMMD5: result = _stream.SendCommand(tag + "AUTHENTICATE CRAM-MD5") .ReadLine(); // retrieve server key var key = result.Replace("+ ", ""); key = Encoding.Default.GetString(Convert.FromBase64String(key)); // calcul hash using (var kMd5 = new HMACMD5(Encoding.ASCII.GetBytes(client.Password))) { var hash1 = kMd5.ComputeHash(Encoding.ASCII.GetBytes(key)); key = BitConverter.ToString(hash1).ToLower().Replace("-", ""); result = _stream.SendCommand( Convert.ToBase64String(Encoding.ASCII.GetBytes(client.Username + " " + key))) .ReadLine(); } break; case AuthMethods.Login: result = _stream.SendCommand(tag + "LOGIN " + client.Username.QuoteString() + " " + client.Password.QuoteString()) .ReadLine(); break; case AuthMethods.SaslOAuth: result = _stream.SendCommand(tag + "AUTHENTICATE XOAUTH " + client.Password) .ReadLine(); break; default: throw new NotSupportedException(); } if (result.StartsWith("* CAPABILITY ")) { _capabilities = result.Substring(13).Trim().Split(' '); result = _stream.ReadLine(); } if (!result.StartsWith(tag + "OK")) { throw new Exception(result); } _authenticated = true; return(_authenticated); } catch (Exception ex) { if (ex is IOException) { _connected = false; } Log.Error("There was an error logging in.", ex); _authenticated = false; return(_authenticated); } }