private static bool HasGroupsInTo(MailBoxData account, MailMessage messageItem) { if (!account.IsTeamlab) { return(false); } if (account.Groups == null) { var engine = new EngineFactory(account.TenantId, account.UserId); account.Groups = engine.ServerEngine.GetGroups(account.MailBoxId); } foreach (var group in account.Groups) { if (messageItem.ToList.Any( address => string.Equals(address.Address, group.Email, StringComparison.InvariantCultureIgnoreCase))) { return(true); } if (messageItem.CcList.Any( address => string.Equals(address.Address, group.Email, StringComparison.InvariantCultureIgnoreCase))) { return(true); } } return(false); }
private static string GetAutoreplyEmailInTo(MailBoxData account, MailMessage messageItem) { var autoreplyAddress = GetAddressInList(account, messageItem.ToList) ?? GetAddressInList(account, messageItem.CcList); return(autoreplyAddress); }
public void SaveAutoreplyHistory(MailBoxData account, MailMessage messageItem) { using (var daoFactory = new DaoFactory()) { var autoReplyHistory = new MailboxAutoreplyHistory { MailboxId = account.MailBoxId, SendingDate = DateTime.UtcNow, SendingEmail = new MailAddress(messageItem.To).Address, Tenant = account.TenantId }; daoFactory.CreateMailboxAutoreplyHistoryDao(account.TenantId, account.UserId) .SaveAutoreplyHistory(autoReplyHistory); } }
private static MailMessage CreateAutoreply(MailBoxData account, MailMessage messageItem, string autoreplyEmail) { var mailMessage = new MailMessage(); var stringBuilder = new StringBuilder(account.MailAutoreply.Subject); if (!string.IsNullOrEmpty(account.MailAutoreply.Subject)) { stringBuilder.Append(" "); } mailMessage.Subject = stringBuilder.AppendFormat("Re: {0}", messageItem.Subject).ToString(); mailMessage.HtmlBody = account.MailAutoreply.Html; mailMessage.MimeReplyToId = messageItem.MimeMessageId; mailMessage.To = messageItem.From; mailMessage.From = autoreplyEmail ?? account.EMail.ToString(); if (account.MailSignature == null) { using (var daoFactory = new DaoFactory()) { var signature = daoFactory.CreateMailboxSignatureDao(account.TenantId, account.UserId).GetSignature(account.MailBoxId); if (signature != null) { account.MailSignature = new MailSignatureData(signature.MailboxId, signature.Tenant, signature.Html, signature.IsActive); } else { account.MailSignature = new MailSignatureData(account.MailBoxId, account.TenantId, "", false); } } } if (account.MailSignature != null && account.MailSignature.IsActive) { mailMessage.HtmlBody = new StringBuilder(mailMessage.HtmlBody).AppendFormat( @"<div class='tlmail_signature' mailbox_id='{0}' style='font-family:open sans,sans-serif; font-size:12px; margin:0px;'> <div>{1}</div> </div>", account.MailBoxId, account.MailSignature.Html).ToString(); } return(mailMessage); }
public MailMessage GetTemplate() { var template = new MailMessage { Attachments = new List <MailAttachmentData>(), Bcc = "", Cc = "", Subject = "", From = "", HtmlBody = "", Important = false, ReplyTo = "", MimeMessageId = "", MimeReplyToId = "", To = "", StreamId = MailUtil.CreateStreamId() }; return(template); }
private static bool IsCurrentMailboxInFrom(MailBoxData account, MailMessage messageItem) { if (string.Equals(messageItem.FromEmail, account.EMail.Address, StringComparison.InvariantCultureIgnoreCase)) { return(true); } if (!account.IsTeamlab) { return(false); } if (account.Aliases == null) { var engine = new EngineFactory(account.TenantId, account.UserId); account.Aliases = engine.ServerEngine.GetAliases(account.MailBoxId); } return (account.Aliases.Any( alias => string.Equals(messageItem.FromEmail, alias.Email, StringComparison.InvariantCultureIgnoreCase))); }
private void ReleaseSendingDraftOnSuccess(MailDraftData draft, MailMessage message) { var engine = new EngineFactory(draft.Mailbox.TenantId, draft.Mailbox.UserId); using (var daoFactory = new DaoFactory()) { var db = daoFactory.DbManager; using (var tx = db.BeginTransaction(IsolationLevel.ReadUncommitted)) { // message was correctly send - lets update its chains id var draftChainId = message.ChainId; // before moving message from draft to sent folder - lets recalculate its correct chain id var chainInfo = engine.MessageEngine.DetectChain(daoFactory, draft.Mailbox, message.MimeMessageId, message.MimeReplyToId, message.Subject); message.ChainId = chainInfo.Id; if (message.ChainId.Equals(message.MimeMessageId)) { message.MimeReplyToId = null; } var daoMailInfo = daoFactory.CreateMailInfoDao(draft.Mailbox.TenantId, draft.Mailbox.UserId); if (!draftChainId.Equals(message.ChainId)) { daoMailInfo.SetFieldValue( SimpleMessagesExp.CreateBuilder(Tenant, User) .SetMessageId(message.Id) .Build(), MailTable.Columns.ChainId, message.ChainId); engine.ChainEngine.UpdateChain(daoFactory, draftChainId, FolderType.Sending, null, draft.Mailbox.MailBoxId, draft.Mailbox.TenantId, draft.Mailbox.UserId); var daoCrmLink = daoFactory.CreateCrmLinkDao(draft.Mailbox.TenantId, draft.Mailbox.UserId); daoCrmLink.UpdateCrmLinkedChainId(draftChainId, draft.Mailbox.MailBoxId, message.ChainId); } engine.ChainEngine.UpdateChain(daoFactory, message.ChainId, FolderType.Sending, null, draft.Mailbox.MailBoxId, draft.Mailbox.TenantId, draft.Mailbox.UserId); var listObjects = engine.ChainEngine.GetChainedMessagesInfo(daoFactory, new List <int> { draft.Id }); if (!listObjects.Any()) { return; } engine.MessageEngine.SetFolder(daoFactory, listObjects, FolderType.Sent); daoMailInfo.SetFieldValue( SimpleMessagesExp.CreateBuilder(Tenant, User) .SetMessageId(draft.Id) .Build(), MailTable.Columns.FolderRestore, FolderType.Sent); tx.Commit(); } } }
public void SendAutoreply(MailBoxData account, MailMessage message, string httpContextScheme, ILog log) { try { if (message.Folder != FolderType.Inbox || account.MailAutoreply == null || !account.MailAutoreply.TurnOn) { return; } var utcNow = DateTime.UtcNow.Date; if (account.MailAutoreply.TurnOnToDate && account.MailAutoreply.ToDate != DateTime.MinValue && account.MailAutoreply.ToDate < utcNow) { log.InfoFormat("DisableAutoreply(MailboxId = {0}) -> time is over", account.MailBoxId); EnableAutoreply(account, false); return; } if (account.MailAutoreply.FromDate > utcNow) { log.Info("Skip MailAutoreply: FromDate > utcNow"); return; } if (account.MailAutoreply.FromDate > message.Date) { log.Info("Skip MailAutoreply: FromDate > message.Date"); return; } if (MailUtil.IsMessageAutoGenerated(message)) { log.Info("Skip MailAutoreply: found some auto-generated header"); return; } if (IsCurrentMailboxInFrom(account, message)) { log.Info("Skip MailAutoreply: message from current account"); return; } var apiHelper = new ApiHelper(httpContextScheme); var autoreplyEmail = GetAutoreplyEmailInTo(account, message); if (string.IsNullOrEmpty(autoreplyEmail)) { log.Info("Skip MailAutoreply: autoreplyEmail not found"); return; } if (HasGroupsInTo(account, message)) { log.Info("Skip MailAutoreply: has group address in TO, CC"); return; } if (HasMailboxAutoreplyHistory(account, message.FromEmail)) { log.Info("Skip MailAutoreply: already sent to this address (history)"); return; } if (account.MailAutoreply.OnlyContacts && !apiHelper.SearchEmails(message.FromEmail).Any()) { log.Info("Skip MailAutoreply: message From address is not a part of user's contacts"); return; } apiHelper.SendMessage(CreateAutoreply(account, message, autoreplyEmail), true); account.MailAutoreplyHistory.Add(message.FromEmail); log.InfoFormat("AutoreplyEngine->SendAutoreply: auto-reply message has been sent to '{0}' email", autoreplyEmail); } catch (Exception ex) { log.ErrorFormat( "AutoreplyEngine->SendAutoreply Error: {0}, innerException: {1}, account.MailBoxId = {2}, " + "account.UserId = {3}, account.TenantId = {4}", ex, ex.InnerException != null ? ex.InnerException.ToString() : string.Empty, account.MailBoxId, account.UserId, account.TenantId); } }
public int CreateSampleMessage( int?folderId, int?mailboxId, List <string> to, List <string> cc, List <string> bcc, bool importance, bool unread, string subject, string body, string calendarUid = null, DateTime?date = null, List <int> tagIds = null, string fromAddress = null, bool add2Index = false, string mimeMessageId = null, uint?userFolderId = null) { var folder = folderId.HasValue ? (FolderType)folderId.Value : FolderType.Inbox; if (!MailFolder.IsIdOk(folder)) { throw new ArgumentException(@"Invalid folder id", "folderId"); } if (!mailboxId.HasValue) { throw new ArgumentException(@"Invalid mailbox id", "mailboxId"); } var accounts = _engineFactory.AccountEngine.GetAccountInfoList().ToAccountData().ToList(); var account = mailboxId.HasValue ? accounts.FirstOrDefault(a => a.MailboxId == mailboxId) : accounts.FirstOrDefault(a => a.IsDefault) ?? accounts.FirstOrDefault(); if (account == null) { throw new ArgumentException("Mailbox not found"); } var mbox = _engineFactory.MailboxEngine.GetMailboxData( new СoncreteUserMailboxExp(account.MailboxId, TenantId, Username)); if (mbox == null) { throw new ArgumentException("no such mailbox"); } var internalId = string.IsNullOrEmpty(mimeMessageId) ? MailUtil.CreateMessageId() : mimeMessageId; var restoreFolder = folder == FolderType.Spam || folder == FolderType.Trash ? FolderType.Inbox : folder; string sampleBody; string sampleIntro; if (!to.Any()) { to = new List <string> { mbox.EMail.Address }; } if (!string.IsNullOrEmpty(body)) { sampleBody = body; sampleIntro = MailUtil.GetIntroduction(body); } else { sampleBody = LOREM_IPSUM_BODY; sampleIntro = LOREM_IPSUM_INTRO; } var sampleMessage = new MailMessage { Date = date ?? DateTime.UtcNow, MimeMessageId = internalId, MimeReplyToId = null, ChainId = internalId, ReplyTo = "", To = string.Join(", ", to.ToArray()), Cc = cc.Any() ? string.Join(", ", cc.ToArray()) : "", Bcc = bcc.Any() ? string.Join(", ", bcc.ToArray()) : "", Subject = string.IsNullOrEmpty(subject) ? LOREM_IPSUM_SUBJECT : subject, Important = importance, TextBodyOnly = false, Attachments = new List <MailAttachmentData>(), Size = sampleBody.Length, MailboxId = mbox.MailBoxId, HtmlBody = sampleBody, Introduction = sampleIntro, Folder = folder, RestoreFolderId = restoreFolder, IsNew = unread, StreamId = MailUtil.CreateStreamId(), CalendarUid = calendarUid }; if (!string.IsNullOrEmpty(fromAddress)) { var from = Parser.ParseAddress(fromAddress); sampleMessage.From = from.ToString(); sampleMessage.FromEmail = from.Email; } else { sampleMessage.From = MailUtil.CreateFullEmail(mbox.Name, mbox.EMail.Address); sampleMessage.FromEmail = mbox.EMail.Address; } if (tagIds != null && tagIds.Any()) { sampleMessage.TagIds = tagIds; } MessageEngine.StoreMailBody(mbox, sampleMessage, Log); var id = _engineFactory.MessageEngine.MailSave(mbox, sampleMessage, 0, folder, restoreFolder, userFolderId, SAMPLE_UIDL, "", false); if (!add2Index) { return(id); } var message = _engineFactory.MessageEngine.GetMessage(id, new MailMessageData.Options()); message.IsNew = unread; var wrapper = message.ToMailWrapper(mbox.TenantId, new Guid(mbox.UserId)); _engineFactory.IndexEngine.Add(wrapper); return(id); }
public int CreateReplyToSampleMessage(int id, string body, bool add2Index = false) { var message = _engineFactory.MessageEngine.GetMessage(id, new MailMessage.Options()); if (message == null) { throw new ArgumentException("Message with id not found"); } var mbox = _engineFactory.MailboxEngine.GetMailboxData( new СoncreteUserMailboxExp(message.MailboxId, TenantId, Username)); if (mbox == null) { throw new ArgumentException("Mailbox not found"); } var mimeMessageId = MailUtil.CreateMessageId(); var sampleMessage = new MailMessage { Date = DateTime.UtcNow, MimeMessageId = mimeMessageId, MimeReplyToId = message.MimeMessageId, ChainId = message.MimeMessageId, ReplyTo = message.FromEmail, To = message.FromEmail, Cc = "", Bcc = "", Subject = "Re: " + message.Subject, Important = message.Important, TextBodyOnly = false, Attachments = new List <MailAttachmentData>(), Size = body.Length, MailboxId = mbox.MailBoxId, HtmlBody = body, Introduction = body, Folder = FolderType.Sent, RestoreFolderId = FolderType.Sent, IsNew = false, StreamId = MailUtil.CreateStreamId(), From = MailUtil.CreateFullEmail(mbox.Name, mbox.EMail.Address), FromEmail = mbox.EMail.Address }; MessageEngine.StoreMailBody(mbox, sampleMessage, Log); var replyId = _engineFactory.MessageEngine.MailSave(mbox, sampleMessage, 0, FolderType.Sent, FolderType.Sent, null, SAMPLE_REPLY_UIDL, "", false); if (!add2Index) { return(replyId); } var replyMessage = _engineFactory.MessageEngine.GetMessage(replyId, new MailMessageData.Options()); var wrapper = replyMessage.ToMailWrapper(mbox.TenantId, new Guid(mbox.UserId)); _engineFactory.IndexEngine.Add(wrapper); return(replyId); }