public void TestAppend()
        {
            using (var session = SelectMailbox()) {
            // APPEND transaction
            server.EnqueueResponse("+ OK continue\r\n");
            server.EnqueueResponse("0004 OK APPEND completed\r\n");

            var message = new ImapAppendMessage(Encoding.ASCII.GetBytes("MIME-Version: 1.0\r\n\r\ntest message"),
                                            new ImapMessageFlagList(ImapMessageFlag.Seen));

            Assert.IsTrue((bool)session.Append(message, "INBOX"));

            Assert.AreEqual("0004 APPEND \"INBOX\" (\\Seen) {33}\r\n" +
                        "MIME-Version: 1.0\r\n" +
                        "\r\n" +
                        "test message\r\n",
                        server.DequeueAll());

            CloseMailbox(session);
              }
        }
        private void AppendMultiple(bool respondAppendUid)
        {
            using (var session = SelectMailbox("MULTIAPPEND")) {
            // APPEND transaction
            server.EnqueueResponse("+ Ready for literal data\r\n");
            server.EnqueueResponse(string.Empty);
            server.EnqueueResponse("+ Ready for literal data\r\n");
            server.EnqueueResponse(string.Empty);

            if (respondAppendUid)
              server.EnqueueResponse("0004 OK [APPENDUID 38505 3955:3956] APPEND completed\r\n");
            else
              server.EnqueueResponse("0004 OK APPEND completed\r\n");

            var messageBody1 = @"Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST)
            From: Fred Foobar <*****@*****.**>
            Subject: afternoon meeting
            To: [email protected]
            Message-Id: <*****@*****.**>
            MIME-Version: 1.0
            Content-Type: TEXT/PLAIN; CHARSET=US-ASCII

            Hello Joe, do you think we can meet at 3:30 tomorrow?
            ".Replace("\r\n", "\n").Replace("\n", "\r\n");
            var messageBody2 = @"Date: Mon, 7 Feb 1994 22:43:04 -0800 (PST)
            From: Joe Mooch <*****@*****.**>
            Subject: Re: afternoon meeting
            To: [email protected]
            Message-Id: <*****@*****.**>
            MIME-Version: 1.0
            Content-Type: TEXT/PLAIN; CHARSET=US-ASCII

            3:30 is fine with me.
            ".Replace("\r\n", "\n").Replace("\n", "\r\n");

            var message1 = new ImapAppendMessage(Encoding.ASCII.GetBytes(messageBody1),
                                             new ImapMessageFlagList(ImapMessageFlag.Seen));
            var message2 = new ImapAppendMessage(Encoding.ASCII.GetBytes(messageBody2),
                                             new DateTimeOffset(new DateTime(1994, 2, 7, 22, 43, 04), new TimeSpan(-8, 0, 0)),
                                             new ImapMessageFlagList(ImapMessageFlag.Seen));

            ImapAppendedUidSet appended;

            Assert.IsTrue((bool)session.AppendMultiple(new[] {message1, message2}, "saved-messages", out appended));

            var expected =
              string.Format("0004 APPEND \"saved-messages\" (\\Seen) {{{0}}}\r\n", Encoding.ASCII.GetByteCount(messageBody1)) +
              messageBody1 +
              string.Format(" (\\Seen) \"07-Feb-1994 22:43:04 -0800\" {{{0}}}\r\n", Encoding.ASCII.GetByteCount(messageBody2)) +
              messageBody2 +
              "\r\n";

            Assert.AreEqual(expected, server.DequeueAll());

            if (respondAppendUid) {
              Assert.IsNotNull(appended);
              Assert.AreEqual(38505L, appended.UidValidity);

              var appendedUids = appended.ToArray();

              Assert.AreEqual(2, appendedUids.Length);
              Assert.AreEqual(3955L, appendedUids[0]);
              Assert.AreEqual(3956L, appendedUids[1]);
            }

            CloseMailbox(session);
              }
        }
        public void TestAppendWithAppendUidResponseCode()
        {
            using (var session = SelectMailbox()) {
            // APPEND transaction
            server.EnqueueResponse("+ OK continue\r\n");
            server.EnqueueResponse("0004 OK [APPENDUID 38505 3955] APPEND completed\r\n");

            var message = new ImapAppendMessage(Encoding.ASCII.GetBytes("MIME-Version: 1.0\r\n\r\ntest message"),
                                            new ImapMessageFlagList(ImapMessageFlag.Seen));

            ImapAppendedUidSet appended;

            Assert.IsTrue((bool)session.Append(message, "INBOX", out appended));

            Assert.AreEqual("0004 APPEND \"INBOX\" (\\Seen) {33}\r\n" +
                        "MIME-Version: 1.0\r\n" +
                        "\r\n" +
                        "test message\r\n",
                        server.DequeueAll());

            Assert.IsNotNull(appended);
            Assert.AreEqual(38505L, appended.UidValidity);
            Assert.AreEqual(3955L, appended.ToNumber());
            Assert.AreEqual("3955", appended.ToString());
            CloseMailbox(session);
              }
        }
        public void TestAppendTryCreateNoReferralResponseCode()
        {
            using (var session = SelectMailbox()) {
            // APPEND transaction
            server.EnqueueResponse("0004 NO [REFERRAL IMAP://user;AUTH=*@SERVER2/SHARED/FOO] Remote mailbox. Try SERVER2.\r\n");

            var message = new ImapAppendMessage(Encoding.ASCII.GetBytes("MIME-Version: 1.0\r\n\r\ntest message"),
                                            new ImapMessageFlagList(new[] {"$label2"}, ImapMessageFlag.Draft));

            ImapMailbox created;

            Assert.IsFalse((bool)session.Append(message, "SHARED/FOO", out created));

            Assert.IsNull(created);

            Assert.AreEqual("0004 APPEND \"SHARED/FOO\" (\\Draft $label2) {33}\r\n",
                        server.DequeueRequest());
              }
        }
        public void TestAppendTryCreate()
        {
            using (var session = SelectMailbox()) {
            // APPEND transaction
            server.EnqueueResponse("0004 NO [TRYCREATE] Mailbox doesn't exist: INBOX.appendto\r\n");
            server.EnqueueResponse("0005 OK CREATE completed\r\n");
            server.EnqueueResponse("+ OK continue\r\n");
            server.EnqueueResponse("0006 OK APPEND completed\r\n");

            var message = new ImapAppendMessage(Encoding.ASCII.GetBytes("MIME-Version: 1.0\r\n\r\ntest message"),
                                            new ImapMessageFlagList(new[] {"$label2"}, ImapMessageFlag.Draft));

            ImapMailbox created;

            Assert.IsTrue((bool)session.Append(message, "INBOX.appendto", out created));

            Assert.AreEqual("INBOX.appendto", created.Name);
            Assert.AreEqual(new Uri(uri, "./INBOX.appendto"), created.Url);
            Assert.IsNotNull(created.Flags);
            Assert.IsNotNull(created.ApplicableFlags);
            Assert.IsNotNull(created.PermanentFlags);

            Assert.AreEqual("0004 APPEND \"INBOX.appendto\" (\\Draft $label2) {33}\r\n",
                        server.DequeueRequest());
            Assert.AreEqual("0005 CREATE \"INBOX.appendto\"\r\n",
                        server.DequeueRequest());

            Assert.AreEqual("0006 APPEND \"INBOX.appendto\" (\\Draft $label2) {33}\r\n" +
                        "MIME-Version: 1.0\r\n" +
                        "\r\n" +
                        "test message\r\n",
                        server.DequeueAll());

            CloseMailbox(session, "0007");
              }
        }
        public void TestAppendMultipleWithNonSyncedLiteral()
        {
            using (var session = SelectMailbox("MULTIAPPEND", "LITERAL+")) {
            // APPEND transaction
            server.EnqueueResponse("0004 OK APPEND completed\r\n");

            var message1 = new ImapAppendMessage(Encoding.ASCII.GetBytes("MIME-Version: 1.0\r\n\r\ntest message1"));
            var message2 = new ImapAppendMessage(Encoding.ASCII.GetBytes("MIME-Version: 1.0\r\n\r\ntest message2"));
            Assert.IsTrue((bool)session.AppendMultiple(new[] {message1, message2}, "saved-messages"));

            Assert.AreEqual("0004 APPEND \"saved-messages\" {34+}\r\n" +
                        "MIME-Version: 1.0\r\n" +
                        "\r\n" +
                        "test message1 {34+}\r\n" +
                        "MIME-Version: 1.0\r\n" +
                        "\r\n" +
                        "test message2\r\n",
                        server.DequeueAll());

            CloseMailbox(session);
              }
        }
        public void TestAppendDontTryCreate()
        {
            using (var session = SelectMailbox()) {
            // APPEND transaction
            server.EnqueueResponse("0004 NO [TRYCREATE] Mailbox doesn't exist: INBOX.appendto\r\n");

            var message = new ImapAppendMessage(Encoding.ASCII.GetBytes("MIME-Version: 1.0\r\n\r\ntest message"),
                                            new DateTimeOffset(2008, 2, 25, 15, 1, 12, new TimeSpan(+9, 0, 0)));

            var internalDate = "\"25-Feb-2008 15:01:12 +0900\"";

            Assert.IsFalse((bool)session.Append(message, "INBOX.appendto"));

            Assert.AreEqual("0004 APPEND \"INBOX.appendto\" " + internalDate + " {33}\r\n",
                        server.DequeueRequest());

            CloseMailbox(session);
              }
        }