Example #1
0
        public long Send(MailDraftData draft)
        {
            if (string.IsNullOrEmpty(draft.HtmlBody))
            {
                draft.HtmlBody = EMPTY_HTML_BODY;
            }

            var message = Save(draft);

            if (message.Id <= 0)
            {
                throw new ArgumentException(string.Format("DraftManager-Send: Invalid message.Id = {0}", message.Id));
            }

            ValidateAddresses(DraftFieldTypes.From, new List <string> {
                draft.From
            }, true);

            message.ToList  = ValidateAddresses(DraftFieldTypes.To, draft.To, true);
            message.CcList  = ValidateAddresses(DraftFieldTypes.Cc, draft.Cc, false);
            message.BccList = ValidateAddresses(DraftFieldTypes.Bcc, draft.Bcc, false);

            var scheme = HttpContext.Current == null
                ? Uri.UriSchemeHttp
                : HttpContext.Current.Request.GetUrlRewriter().Scheme;

            SetDraftSending(draft);

            Task.Run(() =>
            {
                try
                {
                    CoreContext.TenantManager.SetCurrentTenant(draft.Mailbox.TenantId);

                    SecurityContext.AuthenticateMe(new Guid(draft.Mailbox.UserId));

                    draft.ChangeEmbeddedAttachmentLinks(Log);

                    draft.ChangeSmileLinks(Log);

                    draft.ChangeAttachedFileLinksAddresses(Log);

                    draft.ChangeAttachedFileLinksImages(Log);

                    if (!string.IsNullOrEmpty(draft.CalendarIcs))
                    {
                        draft.ChangeAllImagesLinksToEmbedded(Log);
                    }

                    draft.ChangeUrlProxyLinks(Log);

                    var mimeMessage = draft.ToMimeMessage();

                    using (var mc = new MailClient(draft.Mailbox, CancellationToken.None,
                                                   certificatePermit: draft.Mailbox.IsTeamlab || _sslCertificatePermit, log: Log,
                                                   enableDsn: draft.RequestReceipt))
                    {
                        mc.Send(mimeMessage,
                                draft.Mailbox.Imap && !DisableImapSendSyncServers.Contains(draft.Mailbox.Server));
                    }

                    try
                    {
                        SaveIcsAttachment(draft, mimeMessage);

                        SendMailNotification(draft);

                        ReleaseSendingDraftOnSuccess(draft, message);

                        var factory = new EngineFactory(draft.Mailbox.TenantId, draft.Mailbox.UserId, Log);

                        factory.CrmLinkEngine.AddRelationshipEventForLinkedAccounts(draft.Mailbox, message, scheme);

                        factory.EmailInEngine.SaveEmailInData(draft.Mailbox, message, scheme);

                        SaveFrequentlyContactedAddress(draft.Mailbox.TenantId, draft.Mailbox.UserId, mimeMessage,
                                                       scheme);

                        var filters = factory.FilterEngine.GetList();

                        if (filters.Any())
                        {
                            factory.FilterEngine.ApplyFilters(message, draft.Mailbox, new MailFolder(FolderType.Sent, ""), filters);
                        }

                        factory.IndexEngine.Update(new List <MailWrapper>
                        {
                            message.ToMailWrapper(draft.Mailbox.TenantId,
                                                  new Guid(draft.Mailbox.UserId))
                        });
                    }
                    catch (Exception ex)
                    {
                        Log.ErrorFormat("Unexpected Error in Send() Id = {0}\r\nException: {1}",
                                        message.Id, ex.ToString());
                    }
                }
                catch (Exception ex)
                {
                    Log.ErrorFormat("Mail->Send failed: Exception: {0}", ex.ToString());

                    AddNotificationAlertToMailbox(draft, ex);

                    ReleaseSendingDraftOnFailure(draft);

                    SendMailErrorNotification(draft);
                }
                finally
                {
                    if (draft.IsAutoreplied)
                    {
                        var engineFactory = new EngineFactory(draft.Mailbox.TenantId, draft.Mailbox.UserId, Log);

                        engineFactory
                        .AutoreplyEngine
                        .SaveAutoreplyHistory(draft.Mailbox, message);
                    }
                }
            });

            return(message.Id);
        }
Example #2
0
        public long Send(MailDraft draft)
        {
            if (string.IsNullOrEmpty(draft.HtmlBody))
            {
                draft.HtmlBody = EMPTY_HTML_BODY;
            }

            var message = Save(draft);

            if (message.Id <= 0)
            {
                throw new ArgumentException(string.Format("DraftManager-Send: Invalid message.Id = {0}", message.Id));
            }

            ValidateAddresses(DraftFieldTypes.From, new[] { draft.From }, true);
            ValidateAddresses(DraftFieldTypes.To, draft.To, true);
            ValidateAddresses(DraftFieldTypes.Cc, draft.Cc, false);
            ValidateAddresses(DraftFieldTypes.Bcc, draft.Bcc, false);

            var scheme = HttpContext.Current == null
                ? Uri.UriSchemeHttp
                : HttpContext.Current.Request.GetUrlRewriter().Scheme;

            manager.SetDraftSending(draft);

            var taskFactory = new TaskFactory();

            taskFactory.StartNew(() =>
            {
                try
                {
                    CoreContext.TenantManager.SetCurrentTenant(draft.Mailbox.TenantId);

                    SecurityContext.AuthenticateMe(new Guid(draft.Mailbox.UserId));

                    draft.ChangeEmbeddedAttachmentLinks(log);

                    draft.ChangeSmileLinks(log);

                    draft.ChangeAttachedFileLinksAddresses(log);

                    draft.ChangeAttachedFileLinksImages(log);

                    if (!string.IsNullOrEmpty(draft.CalendarIcs))
                    {
                        draft.ChangeAllImagesLinksToEmbedded(log);
                    }

                    draft.ChangeUrlProxyLinks(log);

                    var mimeMessage = draft.ToMimeMessage(!string.IsNullOrEmpty(draft.CalendarIcs), _isAutoreply);

                    using (
                        var mc = new MailClient(draft.Mailbox, CancellationToken.None,
                                                certificatePermit: _sslCertificatePermit, log: log))
                    {
                        mc.Send(mimeMessage,
                                draft.Mailbox.Imap && !DisableImapSendSyncServers.Contains(draft.Mailbox.Server));
                    }

                    try
                    {
                        SaveIcsAttachment(draft, mimeMessage);

                        SendMailNotification(draft);

                        manager.ReleaseSendingDraftOnSuccess(draft, message);

                        manager.AddRelationshipEventForLinkedAccounts(draft.Mailbox, message, scheme, log);

                        manager.SaveEmailInData(draft.Mailbox, message, scheme, log);

                        SaveFrequentlyContactedAddress(draft.Mailbox.TenantId, draft.Mailbox.UserId, mimeMessage,
                                                       scheme);
                    }
                    catch (Exception ex)
                    {
                        log.Error("Unexpected Error in Send() Id = {0}\r\nException: {1}",
                                  message.Id, ex.ToString());
                    }
                }
                catch (Exception ex)
                {
                    log.Error("Mail->Send failed: Exception: {0}", ex.ToString());

                    AddNotificationAlertToMailbox(draft, ex);

                    manager.ReleaseSendingDraftOnFailure(draft);

                    SendMailErrorNotification(draft);
                }
                finally
                {
                    if (_isAutoreply)
                    {
                        manager.SaveAutoreplyHistory(draft.Mailbox, message);
                    }
                }
            }, CancellationToken.None);

            return(message.Id);
        }