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); }
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); }