public void TestGMailPop3Client () { var commands = new List<Pop3ReplayCommand> (); commands.Add (new Pop3ReplayCommand ("", "gmail.greeting.txt")); commands.Add (new Pop3ReplayCommand ("CAPA\r\n", "gmail.capa1.txt")); commands.Add (new Pop3ReplayCommand ("AUTH PLAIN\r\n", "gmail.plus.txt")); commands.Add (new Pop3ReplayCommand ("AHVzZXJuYW1lAHBhc3N3b3Jk\r\n", "gmail.auth.txt")); commands.Add (new Pop3ReplayCommand ("CAPA\r\n", "gmail.capa2.txt")); commands.Add (new Pop3ReplayCommand ("STAT\r\n", "gmail.stat.txt")); commands.Add (new Pop3ReplayCommand ("RETR 1\r\n", "gmail.retr1.txt")); commands.Add (new Pop3ReplayCommand ("RETR 1\r\nRETR 2\r\nRETR 3\r\n", "gmail.retr123.txt")); commands.Add (new Pop3ReplayCommand ("QUIT\r\n", "gmail.quit.txt")); using (var client = new Pop3Client ()) { try { client.ReplayConnect ("localhost", new Pop3ReplayStream (commands, false), CancellationToken.None); } catch (Exception ex) { Assert.Fail ("Did not expect an exception in Connect: {0}", ex); } Assert.IsTrue (client.IsConnected, "Client failed to connect."); Assert.AreEqual (GMailCapa1, client.Capabilities); Assert.AreEqual (2, client.AuthenticationMechanisms.Count); Assert.IsTrue (client.AuthenticationMechanisms.Contains ("XOAUTH2"), "Expected SASL XOAUTH2 auth mechanism"); Assert.IsTrue (client.AuthenticationMechanisms.Contains ("PLAIN"), "Expected SASL PLAIN auth mechanism"); // Note: remove the XOAUTH2 auth mechanism to force PLAIN auth client.AuthenticationMechanisms.Remove ("XOAUTH2"); try { var credentials = new NetworkCredential ("username", "password"); client.Authenticate (credentials, CancellationToken.None); } catch (Exception ex) { Assert.Fail ("Did not expect an exception in Authenticate: {0}", ex); } Assert.AreEqual (GMailCapa2, client.Capabilities); Assert.AreEqual (0, client.AuthenticationMechanisms.Count); Assert.AreEqual (3, client.Count, "Expected 3 messages"); try { var message = client.GetMessage (0, CancellationToken.None); using (var jpeg = new MemoryStream ()) { var attachment = message.Attachments.OfType<MimePart> ().FirstOrDefault (); attachment.ContentObject.DecodeTo (jpeg); jpeg.Position = 0; using (var md5 = new MD5CryptoServiceProvider ()) { var md5sum = HexEncode (md5.ComputeHash (jpeg)); Assert.AreEqual ("5b1b8b2c9300c9cd01099f44e1155e2b", md5sum, "MD5 checksums do not match."); } } } catch (Exception ex) { Assert.Fail ("Did not expect an exception in GetMessage: {0}", ex); } try { var messages = client.GetMessages (new [] { 0, 1, 2 }, CancellationToken.None); foreach (var message in messages) { using (var jpeg = new MemoryStream ()) { var attachment = message.Attachments.OfType<MimePart> ().FirstOrDefault (); attachment.ContentObject.DecodeTo (jpeg); jpeg.Position = 0; using (var md5 = new MD5CryptoServiceProvider ()) { var md5sum = HexEncode (md5.ComputeHash (jpeg)); Assert.AreEqual ("5b1b8b2c9300c9cd01099f44e1155e2b", md5sum, "MD5 checksums do not match."); } } } } catch (Exception ex) { Assert.Fail ("Did not expect an exception in GetMessages: {0}", ex); } try { client.Disconnect (true, CancellationToken.None); } catch (Exception ex) { Assert.Fail ("Did not expect an exception in Disconnect: {0}", ex); } Assert.IsFalse (client.IsConnected, "Failed to disconnect"); } }