public int Send(int tenant, string username, MailSendItem originalMessage, int mailId, int mailboxId) { var mbox = manager.GetUnremovedMailBox(mailboxId); if (mbox == null) { throw new ArgumentException("no such mailbox"); } originalMessage.MailboxId = mbox.MailBoxId; if (mbox.Name != "") { originalMessage.DisplayName = mbox.Name; } if (string.IsNullOrEmpty(originalMessage.HtmlBody)) { originalMessage.HtmlBody = EMPTY_HTML_BODY; } var messageItem = SaveToDraft(originalMessage, mailId, mbox); if (messageItem.Id > 0) { var userCulture = Thread.CurrentThread.CurrentCulture; var userUiCulture = Thread.CurrentThread.CurrentUICulture; var scheme = HttpContext.Current.Request.GetUrlRewriter().Scheme; // move to_addresses temp manager.SetConversationsFolder(tenant, username, MailFolder.Ids.temp, new List <int> { (Int32)messageItem.Id }); manager.SetMessageFolderRestore(tenant, username, MailFolder.Ids.drafts, (int)messageItem.Id); ThreadPool.QueueUserWorkItem(delegate { Message mimeMessage; try { Thread.CurrentThread.CurrentCulture = userCulture; Thread.CurrentThread.CurrentUICulture = userUiCulture; CoreContext.TenantManager.SetCurrentTenant(tenant); SecurityContext.AuthenticateMe(new Guid(username)); ApiHelper.SetupScheme(scheme); originalMessage.ChangeEmbededAttachmentLinks(tenant, username); originalMessage.ChangeSmileLinks(); originalMessage.ChangeAttachedFileLinksAddresses(tenant); originalMessage.ChangeAttachedFileLinksImages(); mimeMessage = originalMessage.ToMimeMessage(tenant, username, true); var smptClient = MailClientBuilder.Smtp(); if (mbox.RefreshToken != null) { smptClient.SendSsl(mimeMessage, mbox.SmtpServer, mbox.SmtpPort, mbox.SmtpAccount, GetAccessToken(mbox), SaslMechanism.OAuth2); } else if (mbox.OutcomingEncryptionType == EncryptionType.None) { if (mbox.AuthenticationTypeSmtp == SaslMechanism.None) { smptClient.Send(mimeMessage, mbox.SmtpServer, mbox.SmtpPort); } else { smptClient.Send(mimeMessage, mbox.SmtpServer, mbox.SmtpPort, mbox.SmtpAccount, mbox.SmtpPassword, mbox.AuthenticationTypeSmtp); } } else { if (mbox.AuthenticationTypeSmtp == SaslMechanism.None) { smptClient.SendSsl(mimeMessage, mbox.SmtpServer, mbox.SmtpPort, mbox.OutcomingEncryptionType); } else { smptClient.SendSsl(mimeMessage, mbox.SmtpServer, mbox.SmtpPort, mbox.SmtpAccount, mbox.SmtpPassword, mbox.AuthenticationTypeSmtp, mbox.OutcomingEncryptionType); } } } catch (Exception ex) { AddNotificationAlertToMailbox(originalMessage, (Int32)messageItem.Id, ex, mbox); // move to_addresses drafts manager.SetConversationsFolder(tenant, username, MailFolder.Ids.drafts, new List <int> { (Int32)messageItem.Id }); manager.SetMessageFolderRestore(tenant, username, MailFolder.Ids.drafts, (int)messageItem.Id); // send unsuccess notification SendMailNotification(tenant, username, 1); return; } SendMailNotification(tenant, username, 0); try { // message was correctly send - lets update its chains id var draftChainId = messageItem.ChainId; // before moving message from draft to sent folder - lets recalculate its correct chain id messageItem.ChainId = manager.DetectChainId(mbox, messageItem); // push new message correct chain id to db manager.UpdateMessageChainId(mbox, messageItem.Id, MailFolder.Ids.temp, draftChainId, messageItem.ChainId); manager.UpdateCrmLinkedChainId(mbox.MailBoxId, tenant, draftChainId, messageItem.ChainId); // move to_addresses sent manager.SetConversationsFolder(tenant, username, MailFolder.Ids.sent, new List <int> { (Int32)messageItem.Id }); manager.SetMessageFolderRestore(tenant, username, MailFolder.Ids.sent, (int)messageItem.Id); manager.AddRelationshipEventForLinkedAccounts(mbox, messageItem, log); manager.SaveEmailInData(mbox, messageItem, log); manager.SaveMailContacts(mbox.TenantId, mbox.UserId, mimeMessage); StoreMessageToImapSentFolder(mbox, mimeMessage); } catch (Exception ex) { log.Error("Unexpected Error in Send(), message_item.Id = {0}, {1}, {2}", messageItem.Id, ex.ToString(), ex.StackTrace); } }); } else { throw new ArgumentException("Failed to_addresses save draft"); } return(messageItem.Id > 0 ? (Int32)messageItem.Id : 1); // Callback in api will be raised if value > 0 }
public int Send(MailDraft draft) { if (string.IsNullOrEmpty(draft.HtmlBody)) { draft.HtmlBody = EMPTY_HTML_BODY; } var message = Save(draft); if (message.Id > 0) { 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); ThreadPool.QueueUserWorkItem(_ => { try { CoreContext.TenantManager.SetCurrentTenant(draft.Mailbox.TenantId); SecurityContext.AuthenticateMe(new Guid(draft.Mailbox.UserId)); ApiHelper.SetupScheme(scheme); draft.ChangeEmbededAttachmentLinks(log); draft.ChangeSmileLinks(log); draft.ChangeAttachedFileLinksAddresses(log); draft.ChangeAttachedFileLinksImages(log); var mimeMessage = draft.ToMimeMessage(true); var smtp = MailClientBuilder.Smtp(); smtp.Send(draft.Mailbox, mimeMessage, log); try { SendMailNotification(draft.Mailbox.TenantId, draft.Mailbox.UserId, 0); manager.ReleaseSendingDraftOnSuccess(draft, message); manager.AddRelationshipEventForLinkedAccounts(draft.Mailbox, message, log); manager.SaveEmailInData(draft.Mailbox, message, log); manager.SaveMailContacts(draft.Mailbox.TenantId, draft.Mailbox.UserId, mimeMessage); StoreMessageToImapSentFolder(draft.Mailbox, mimeMessage); } catch (Exception ex) { log.Error("Unexpected Error in Send() Id = {0}\r\nException: {1}", message.Id, ex.ToString()); } } catch (Exception ex) { AddNotificationAlertToMailbox(draft, ex); manager.ReleaseSendingDraftOnFailure(draft); SendMailNotification(draft.Mailbox.TenantId, draft.Mailbox.UserId, 1); } }); } else { throw new ArgumentException("Failed to_addresses save draft"); } return(message.Id > 0 ? (Int32)message.Id : 1); // Callback in api will be raised if value > 0 }