示例#1
0
        public long SendMessage(int id,
                                string from,
                                List <string> to,
                                List <string> cc,
                                List <string> bcc,
                                string mimeReplyToId,
                                bool importance,
                                string subject,
                                List <int> tags,
                                string body,
                                List <MailAttachment> attachments,
                                FileShare fileLinksShareMode,
                                string calendarIcs,
                                bool isAutoreply)
        {
            if (id < 1)
            {
                id = 0;
            }

            if (string.IsNullOrEmpty(from))
            {
                throw new ArgumentNullException("from");
            }

            if (!to.Any())
            {
                throw new ArgumentNullException("to");
            }

            var mailAddress = new MailAddress(from);
            var accounts    = MailBoxManager.GetAccountInfo(TenantId, Username).ToAddressData();
            var account     = accounts.FirstOrDefault(a => a.Email.ToLower().Equals(mailAddress.Address));

            if (account == null)
            {
                throw new ArgumentException("Mailbox not found");
            }

            if (account.IsGroup)
            {
                throw new InvalidOperationException("Sending emails from a group address is forbidden");
            }

            var mbox = MailBoxManager.GetUnremovedMailBox(account.MailboxId);

            if (mbox == null)
            {
                throw new ArgumentException("no such mailbox");
            }

            if (!mbox.Enabled)
            {
                throw new InvalidOperationException("Sending emails from a disabled account is forbidden");
            }

            string mimeMessageId, streamId;

            var previousMailboxId = mbox.MailBoxId;

            if (id > 0)
            {
                var message = GetMessage(id, false, false, false);

                if (message.Folder != MailFolder.Ids.drafts)
                {
                    throw new InvalidOperationException("Sending emails is permitted only in the Drafts folder");
                }

                mimeMessageId = message.MimeMessageId;

                streamId = message.StreamId;

                foreach (var attachment in attachments)
                {
                    attachment.streamId = streamId;
                }

                previousMailboxId = message.MailboxId;
            }
            else
            {
                mimeMessageId = MailUtil.CreateMessageId();
                streamId      = MailUtil.CreateStreamId();
            }

            var fromAddress = MailUtil.CreateFullEmail(mbox.Name, mailAddress.Address);

            var draft = new MailDraft(id, mbox, fromAddress, to, cc, bcc, subject, mimeMessageId, mimeReplyToId, importance,
                                      tags, body, streamId, attachments, calendarIcs)
            {
                FileLinksShareMode = fileLinksShareMode,
                PreviousMailboxId  = previousMailboxId
            };

            try
            {
                Thread.CurrentThread.CurrentCulture   = CurrentCulture;
                Thread.CurrentThread.CurrentUICulture = CurrentCulture;

                var daemonLabels =
                    new DraftManager.DeliveryFailureMessageTranslates(
                        MailDaemonEmail,
                        MailApiResource.DeliveryFailureSubject,
                        MailApiResource.DeliveryFailureAutomaticMessage,
                        MailApiResource.DeliveryFailureMessageIdentificator,
                        MailApiResource.DeliveryFailureRecipients,
                        MailApiResource.DeliveryFailureRecommendations,
                        MailApiResource.DeliveryFailureBtn,
                        MailApiResource.DeliveryFailureFAQInformation,
                        MailApiResource.DeliveryFailureReason);

                var draftsManager = new DraftManager(MailBoxManager, Logger, daemonLabels, isAutoreply);

                return(draftsManager.Send(draft));
            }
            catch (DraftException ex)
            {
                string fieldName;

                switch (ex.FieldType)
                {
                case DraftFieldTypes.From:
                    fieldName = MailApiResource.FieldNameFrom;
                    break;

                case DraftFieldTypes.To:
                    fieldName = MailApiResource.FieldNameTo;
                    break;

                case DraftFieldTypes.Cc:
                    fieldName = MailApiResource.FieldNameCc;
                    break;

                case DraftFieldTypes.Bcc:
                    fieldName = MailApiResource.FieldNameBcc;
                    break;

                default:
                    fieldName = "";
                    break;
                }
                switch (ex.ErrorType)
                {
                case DraftException.ErrorTypes.IncorrectField:
                    throw new ArgumentException(MailApiResource.ErrorIncorrectEmailAddress.Replace("%1", fieldName));

                case DraftException.ErrorTypes.EmptyField:
                    throw new ArgumentException(MailApiResource.ErrorEmptyField.Replace("%1", fieldName));

                default:
                    throw;
                }
            }
        }