コード例 #1
0
        public override void RunCommand(object sender)
        {
            var         engine                 = (AutomationEngineInstance)sender;
            MimeMessage vMimeMessage           = (MimeMessage)v_IMAPMimeMessage.ConvertUserVariableToObject(engine);
            string      vIMAPHost              = v_IMAPHost.ConvertUserVariableToString(engine);
            string      vIMAPPort              = v_IMAPPort.ConvertUserVariableToString(engine);
            string      vIMAPUserName          = v_IMAPUserName.ConvertUserVariableToString(engine);
            string      vIMAPPassword          = v_IMAPPassword.ConvertUserVariableToString(engine);
            var         vIMAPDestinationFolder = v_IMAPDestinationFolder.ConvertUserVariableToString(engine);

            using (var client = new ImapClient())
            {
                client.ServerCertificateValidationCallback = (sndr, certificate, chain, sslPolicyErrors) => true;
                client.SslProtocols = SslProtocols.None;

                using (var cancel = new CancellationTokenSource())
                {
                    try
                    {
                        client.Connect(v_IMAPHost, int.Parse(v_IMAPPort), true, cancel.Token); //SSL
                    }
                    catch (Exception)
                    {
                        client.Connect(v_IMAPHost, int.Parse(v_IMAPPort)); //TLS
                    }

                    client.AuthenticationMechanisms.Remove("XOAUTH2");
                    client.Authenticate(vIMAPUserName, vIMAPPassword, cancel.Token);

                    var      splitId   = vMimeMessage.MessageId.Split('#').ToList();
                    UniqueId messageId = UniqueId.Parse(splitId.Last());
                    splitId.RemoveAt(splitId.Count - 1);
                    string messageFolder = string.Join("", splitId);

                    IMailFolder toplevel               = client.GetFolder(client.PersonalNamespaces[0]);
                    IMailFolder foundSourceFolder      = GetIMAPEmailsCommand.FindFolder(toplevel, messageFolder);
                    IMailFolder foundDestinationFolder = GetIMAPEmailsCommand.FindFolder(toplevel, vIMAPDestinationFolder);

                    if (foundSourceFolder != null)
                    {
                        foundSourceFolder.Open(FolderAccess.ReadWrite, cancel.Token);
                    }
                    else
                    {
                        throw new Exception("Source Folder not found");
                    }

                    if (foundDestinationFolder == null)
                    {
                        throw new Exception("Destination Folder not found");
                    }

                    var messageSummary = foundSourceFolder.Fetch(new[] { messageId }, MessageSummaryItems.Flags);

                    if (v_IMAPOperationType == "Move MimeMessage")
                    {
                        if (v_IMAPMoveCopyUnreadOnly == "Yes")
                        {
                            if (!messageSummary[0].Flags.Value.HasFlag(MessageFlags.Seen))
                            {
                                foundSourceFolder.MoveTo(messageId, foundDestinationFolder, cancel.Token);
                            }
                        }
                        else
                        {
                            foundSourceFolder.MoveTo(messageId, foundDestinationFolder, cancel.Token);
                        }
                    }
                    else if (v_IMAPOperationType == "Copy MimeMessage")
                    {
                        if (v_IMAPMoveCopyUnreadOnly == "Yes")
                        {
                            if (!messageSummary[0].Flags.Value.HasFlag(MessageFlags.Seen))
                            {
                                foundSourceFolder.CopyTo(messageId, foundDestinationFolder, cancel.Token);
                            }
                        }
                        else
                        {
                            foundSourceFolder.CopyTo(messageId, foundDestinationFolder, cancel.Token);
                        }
                    }

                    client.Disconnect(true, cancel.Token);
                    client.ServerCertificateValidationCallback = null;
                }
            }
        }