public void SaveEmailInData(MailBox mailbox, MailMessageItem message, ILogger log) { if (string.IsNullOrEmpty(mailbox.EMailInFolder)) { return; } try { foreach (var attachment in message.Attachments) { using (var file = AttachmentManager.GetAttachmentStream(attachment)) { log.Debug("SaveEmailInData->ApiHelper.UploadToDocuments(fileName: '{0}', folderId: {1})", file.FileName, mailbox.EMailInFolder); UploadToDocuments(file, attachment.contentType, mailbox, log); } } } catch (Exception e) { _log.Error("SaveEmailInData(tenant={0}, userId='{1}', messageId={2}) Exception:\r\n{3}\r\n", mailbox.TenantId, mailbox.UserId, message.Id, e.ToString()); } }
public string StoreMailBody(int id_tenant, string id_user, MailMessageItem mail) { if (string.IsNullOrEmpty(mail.HtmlBody)) { return(string.Empty); } // Using id_user as domain in S3 Storage - allows not to add quota to tenant. var save_path = MailStoragePathCombiner.GetBodyKey(id_user, mail.StreamId); var storage = MailDataStore.GetDataStore(id_tenant); try { var safe_body = ReplaceEmbeddedImages(mail); using (var reader = new MemoryStream(Encoding.UTF8.GetBytes(safe_body))) { var res = storage .UploadWithoutQuota(string.Empty, save_path, reader, "text/html", string.Empty) .ToString(); _log.Debug("StoreMailBody() tenant='{0}', user_id='{1}', save_body_path='{2}' Result: {3}", id_tenant, id_user, save_path, res); return(res); } } catch (Exception) { storage.Delete(string.Empty, save_path); _log.Debug(String.Format("StoreMailBody() Problems with message saving in messageId={0}. Body was deleted.", mail.MimeMessageId)); throw; } }
public string StoreMailBody(int id_tenant, string id_user, MailMessageItem mail) { try { if (!string.IsNullOrEmpty(mail.HtmlBody)) { var safe_body = ReplaceEmbeddedImages(mail); using (var reader = new MemoryStream(Encoding.UTF8.GetBytes(safe_body))) { // Using id_user as domain in S3 Storage - allows not to add quota to tenant. var save_body_path = MailStoragePathCombiner.GetBodyKey(id_user, mail.StreamId); return(GetDataStore(id_tenant) .UploadWithoutQuota(string.Empty, save_body_path, reader, "text/html", string.Empty) .ToString()); } } return(string.Empty); } catch (Exception) { GetDataStore(id_tenant).Delete(string.Empty, MailStoragePathCombiner.GetBodyKey(id_user, mail.StreamId)); _log.Debug(String.Format("Problems with message saving in messageId={0}. Body was deleted.", mail.MessageId)); throw; } }
private static string ReplaceEmbeddedImages(MailMessageItem m) { try { var doc = new HtmlDocument(); doc.LoadHtml(m.HtmlBody); if (m.Attachments != null && m.Attachments.Count > 0) { foreach (var attach in m.Attachments) { if (string.IsNullOrEmpty(attach.contentId)) { continue; } var old_nodes = doc.DocumentNode.SelectNodes("//img[@src and (contains(@src,'cid:" + attach.contentId.Trim('<').Trim('>') + "'))]"); if (old_nodes == null || attach.storedFileUrl == null) { continue; } foreach (var node in old_nodes) { node.SetAttributeValue("cid", attach.contentId); node.SetAttributeValue("src", attach.storedFileUrl); } } } return(doc.DocumentNode.OuterHtml); } catch (RecursionDepthException ex) { throw new Exception(ex.Message); } catch (Exception) { return(m.HtmlBody); } }
// Add tags from Teamlab CRM to mail if needed. private void SetCrmTags(MailMessageItem mail, int tenant, string user) { try { if (mail.ParticipantsCrmContactsId == null) { mail.ParticipantsCrmContactsId = GetCrmContactsId(tenant, user, mail.FromEmail); } var allowedContactIds = mail.ParticipantsCrmContactsId; //Todo: Rewrite this to Api call using (var db = new DbManager("crm")) { #region Extract CRM tags if (allowedContactIds.Count == 0) { return; } var tagIds = db.ExecuteList(new SqlQuery(CrmEntityTagTable.name) .Distinct() .Select(CrmEntityTagTable.Columns.tag_id) .Where(CrmEntityTagTable.Columns.entity_type, (int)EntityType.Contact) .Where(Exp.In(CrmEntityTagTable.Columns.entity_id, allowedContactIds))) .ConvertAll(r => - Convert.ToInt32(r[0])); mail.TagIds = new ItemList <int>(tagIds); #endregion } } catch (Exception e) { _log.Error("SetCrmTags() Exception:\r\n{0}\r\n", e.ToString()); } }
public static MailMessageItem TestParseMessage(string eml_path) { var w = new Stopwatch(); w.Start(); var m = Parser.ParseMessageFromFile(eml_path); w.Stop(); Console.WriteLine("1 Parser takes {0} seconds", w.Elapsed.TotalSeconds); w.Reset(); w.Start(); var mail_info = new MailMessageItem(m); w.Stop(); Console.WriteLine("2 Parser takes {0} seconds", w.Elapsed.TotalSeconds); return(mail_info); }
public static MailMessageItem TestParseMessage(string eml_path) { var w = new Stopwatch(); w.Start(); var m = Parser.ParseMessageFromFile(eml_path); w.Stop(); Console.WriteLine("1 Parser takes {0} seconds", w.Elapsed.TotalSeconds); w.Reset(); w.Start(); var mail_info = new MailMessageItem(m); w.Stop(); Console.WriteLine("2 Parser takes {0} seconds", w.Elapsed.TotalSeconds); return mail_info; }
public static void TestPOPReceiveMessage(string pop3_server, string pop3_account, string pop3_password, int pop3_port, bool use_ssl, string uidl) { var pop = MailClientBuilder.Pop(); try { _log.Debug("Connecting to {0}", pop3_account); var result = use_ssl ? pop.ConnectSsl(pop3_server, pop3_port, pop3_account, pop3_password) : pop.Connect(pop3_server, pop3_port, pop3_account, pop3_password); if (!result.StartsWith("+")) return; if (pop.UniqueIdExists(uidl)) { _log.Info("Message with this uidl exists!"); var index = pop.GetMessageIndex(uidl); _log.Info("StoreMessage(index: {0})", index); var destination_path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"strange.eml"); pop.UpdateStats(); //pop.StoreMessage(index, false, destination_path); var message = pop.RetrieveMessageObject(index); var mail_info = new MailMessageItem(message); _log.Info(mail_info.HtmlBody); if (File.Exists(destination_path)) _log.Info("Message stored successfully!\r\n"); else _log.Error("Message is missing in destination path!\r\n"); } else _log.Info("Message with this uidl not exists!\r\n"); } catch (Pop3Exception ex) { Console.WriteLine(ex.ToString()); } finally { try { if (pop.IsConnected) { pop.Disconnect(); } } catch { } } }
public void MailContactsSave(IDbManager db, int tenant, string user, MailMessageItem mail) { try { var contacts = new List<string> {mail.From}; var spliter = new[] {","}; if (!string.IsNullOrEmpty(mail.To)) contacts = contacts .Concat(mail.To.Split(spliter, StringSplitOptions.RemoveEmptyEntries)) .Distinct() .ToList(); if (!string.IsNullOrEmpty(mail.ReplyTo)) contacts = contacts .Concat(mail.ReplyTo.Split(spliter, StringSplitOptions.RemoveEmptyEntries)) .Distinct() .ToList(); if (!string.IsNullOrEmpty(mail.Cc)) contacts = contacts .Concat(mail.Cc.Split(spliter, StringSplitOptions.RemoveEmptyEntries)) .Distinct() .ToList(); if (!string.IsNullOrEmpty(mail.Bcc)) contacts = contacts .Concat(mail.Bcc.Split(spliter, StringSplitOptions.RemoveEmptyEntries)) .Distinct() .ToList(); if (!contacts.Any()) return; var valid_contacts = (from contact in contacts let address = Parser.ParseAddress(contact.Trim()) where Validator.ValidateSyntax(address.Email) && (!contact.Contains(' ') || !string.IsNullOrEmpty(address.Name)) && MailContactExists(db, tenant, user, address.Name, address.Email) < 1 select address).ToList(); if (!valid_contacts.Any()) return; var last_modified = DateTime.Now; var insert_query = new SqlInsert(MAIL_CONTACTS) .InColumns(MailContactsFields.id_user, MailContactsFields.id_tenant, MailContactsFields.name, MailContactsFields.address, MailContactsFields.last_modified); valid_contacts .ForEach(contact => insert_query .Values(user, tenant, contact.Name, contact.Email, last_modified)); db.ExecuteNonQuery(insert_query); } catch (Exception e) { _log.Warn("MailContactsSave(tenant={0}, userId='{1}', mail_id={2}) Exception:\r\n{3}\r\n", tenant, user, mail.Id, e.ToString()); } }
public MailMessageItem ToMailMessageItem(int tenant, string user) { Address from_verified; if (Validator.ValidateSyntax(From)) from_verified = new Address(From, DisplayName); else throw new ArgumentException(MailApiResource.ErrorIncorrectEmailAddress .Replace("%1", MailApiResource.FieldNameFrom)); var message_item = new MailMessageItem { From = from_verified.ToString(), FromEmail = from_verified.Email, To = string.Join(", ", To.ToArray()), Cc = Cc != null ? string.Join(", ", Cc.ToArray()) : "", Bcc = Bcc != null ? string.Join(", ", Bcc.ToArray()) : "", Subject = Subject, Date = DateTime.Now, Important = Important, HtmlBody = HtmlBody, Introduction = MailMessageItem.GetIntroduction(HtmlBody), StreamId = StreamId, TagIds = Labels != null && Labels.Count != 0 ? new ItemList<int>(Labels) : null, Size = HtmlBody.Length }; if (message_item.Attachments == null) message_item.Attachments = new List<MailAttachment>(); Attachments.ForEach(attachment => { attachment.tenant = tenant; attachment.user = user; }); message_item.Attachments.AddRange(Attachments); return message_item; }
public void MailContactsSave(IDbManager db, int tenant, string user, MailMessageItem mail) { try { var contacts = new List <string> { mail.From }; var spliter = new[] { "," }; if (!string.IsNullOrEmpty(mail.To)) { contacts = contacts .Concat(mail.To.Split(spliter, StringSplitOptions.RemoveEmptyEntries)) .Distinct() .ToList(); } if (!string.IsNullOrEmpty(mail.ReplyTo)) { contacts = contacts .Concat(mail.ReplyTo.Split(spliter, StringSplitOptions.RemoveEmptyEntries)) .Distinct() .ToList(); } if (!string.IsNullOrEmpty(mail.Cc)) { contacts = contacts .Concat(mail.Cc.Split(spliter, StringSplitOptions.RemoveEmptyEntries)) .Distinct() .ToList(); } if (!string.IsNullOrEmpty(mail.Bcc)) { contacts = contacts .Concat(mail.Bcc.Split(spliter, StringSplitOptions.RemoveEmptyEntries)) .Distinct() .ToList(); } if (!contacts.Any()) { return; } var valid_contacts = (from contact in contacts let address = Parser.ParseAddress(contact.Trim()) where Validator.ValidateSyntax(address.Email) && (!contact.Contains(' ') || !string.IsNullOrEmpty(address.Name)) && MailContactExists(db, tenant, user, address.Name, address.Email) < 1 select address).ToList(); if (!valid_contacts.Any()) { return; } var last_modified = DateTime.Now; var insert_query = new SqlInsert(MAIL_CONTACTS) .InColumns(MailContactsFields.id_user, MailContactsFields.id_tenant, MailContactsFields.name, MailContactsFields.address, MailContactsFields.last_modified); valid_contacts .ForEach(contact => insert_query .Values(user, tenant, contact.Name, contact.Email, last_modified)); db.ExecuteNonQuery(insert_query); } catch (Exception e) { _log.Warn("MailContactsSave(tenant={0}, userId='{1}', mail_id={2}) Exception:\r\n{3}\r\n", tenant, user, mail.Id, e.ToString()); } }
public MailMessageItem ToMailMessageItem(int tennantid, string userid, bool loadAttachments) { Address From_verified; if (Validator.ValidateSyntax(From)) From_verified = new Address(From, DisplayName); else throw new ArgumentException(MailServiceResource.ResourceManager.GetString("ErrorIncorrectEmailAddress").Replace("%1", MailServiceResource.ResourceManager.GetString("FieldNameFrom"))); List<MailAttachment> internalAttachments = new List<MailAttachment>(); PreprocessHtml(tennantid, internalAttachments); MailMessageItem message_item = new MailMessageItem() { From = From_verified.ToString(), From_Email = From_verified.Email, To = string.Join(", ", To.ToArray()), Cc = Cc != null ? string.Join(", ", Cc.ToArray()) : "", Bcc = Bcc != null ? string.Join(", ", Bcc.ToArray()) : "", Subject = Subject, Date = DateTime.Now, Important = Important, HtmlBody = HtmlBody, StreamId = StreamId, TagIds = Labels != null && Labels.Count != 0 ? new ItemList<int>(Labels) : null }; message_item.loadAttachments(Attachments.Select(att => CreateAttachment(tennantid, att, loadAttachments)), false); message_item.loadAttachments(internalAttachments.ConvertAll(att => CreateAttachment(tennantid, att, true)), true); return message_item; }
public string StoreMailBody(int id_tenant, string id_user, MailMessageItem mail) { try { if (!string.IsNullOrEmpty(mail.HtmlBody)) { var safe_body = ReplaceEmbeddedImages(mail); using (var reader = new MemoryStream(Encoding.UTF8.GetBytes(safe_body))) { // Using id_user as domain in S3 Storage - allows not to add quota to tenant. var save_body_path = MailStoragePathCombiner.GetBodyKey(id_user, mail.StreamId); return GetDataStore(id_tenant) .UploadWithoutQuota(string.Empty, save_body_path, reader, "text/html", string.Empty) .ToString(); } } return string.Empty; } catch (Exception) { GetDataStore(id_tenant).Delete(string.Empty, MailStoragePathCombiner.GetBodyKey(id_user, mail.StreamId)); _log.Debug(String.Format("Problems with message saving in messageId={0}. Body was deleted.", mail.MessageId)); throw; } }
//Todo: Remove useless parameters from this method private void AddNotificationAlertToMailbox(int tenant_id, string username, MailSendItem item, MailMessageItem result_message, Exception ex, MailBox mbox, Message message) { try { var sb_message = new StringBuilder(1024); var message_delivery = new MailSendItem {Subject = MailApiResource.DeliveryFailureSubject}; message_delivery.To.Add(item.From); message_delivery.From = MailBoxManager.MAIL_DAEMON_EMAIL; message_delivery.Important = true; message_delivery.StreamId = _manager.CreateNewStreamId(); sb_message.Append(@"<style> .button.blue:hover { color: white; background: #57A7D3; background: linear-gradient(top, #78BFE8, #57A7D3 50%, #57A7D3 51%, #3F96C3); background: -o-linear-gradient(top, #78BFE8, #57A7D3 50%, #57A7D3 51%, #3F96C3); background: -moz-linear-gradient(top, #78BFE8, #57A7D3 50%, #57A7D3 51%, #3F96C3); background: -webkit-linear-gradient(top, #78BFE8, #57A7D3 50%, #57A7D3 51%, #3F96C3); border: 1px solid #5EAAD5; } .button.blue { color: white; background: #3D96C6; background: linear-gradient(top, #59B1E2, #3D96C6 50%, #3D96C6 51%, #1A76A6); background: -o-linear-gradient(top, #59B1E2, #3D96C6 50%, #3D96C6 51%, #1A76A6); background: -moz-linear-gradient(top, #59B1E2, #3D96C6 50%, #3D96C6 51%, #1A76A6); background: -webkit-linear-gradient(top, #59B1E2, #3D96C6 50%, #3D96C6 51%, #1A76A6); border-width: 1px; border-style: solid; border-color: #4DA9DC #4098C9 #2D7399 #4098C9; } .button, .button:visited, .button:hover, .button:active { display: inline-block; font-weight: normal; text-align: center; text-decoration: none; vertical-align: middle; cursor: pointer; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; touch-callout: none; -o-touch-callout: none; -moz-touch-callout: none; -webkit-touch-callout: none; user-select: none; -o-user-select: none; -moz-user-select: none; -webkit-user-select: none; font-size: 12px; line-height: 14px; padding: 2px 12px 3px; color: white; background: #3D96C6; background: linear-gradient(top, #59B1E2, #3D96C6 50%, #3D96C6 51%, #1A76A6); background: -o-linear-gradient(top, #59B1E2, #3D96C6 50%, #3D96C6 51%, #1A76A6); background: -moz-linear-gradient(top, #59B1E2, #3D96C6 50%, #3D96C6 51%, #1A76A6); background: -webkit-linear-gradient(top, #59B1E2, #3D96C6 50%, #3D96C6 51%, #1A76A6); border-width: 1px; border-style: solid; border-color: #4DA9DC #4098C9 #2D7399 #4098C9; } body { color: #333; font: normal 12px Arial, Tahoma,sans-serif; } </style>"); sb_message.AppendFormat("<div style=\"max-width:500px;\"><p style=\"color:gray;\">{0}</p>", MailApiResource.DeliveryFailureAutomaticMessage); sb_message.AppendFormat("<p>{0}</p>", MailApiResource.DeliveryFailureMessageIdentificator .Replace("{subject}", item.Subject) .Replace("{date}", DateTime.Now.ToString(CultureInfo.InvariantCulture))); sb_message.AppendFormat("<div><p>{0}:</p><ul style=\"color:#333;\">", MailApiResource.DeliveryFailureRecipients); item.To.ForEach(rcpt => sb_message.AppendFormat("<li>{0}</li>", HttpUtility.HtmlEncode(rcpt))); item.Cc.ForEach(rcpt => sb_message.AppendFormat("<li>{0}</li>", HttpUtility.HtmlEncode(rcpt))); item.Bcc.ForEach(rcpt => sb_message.AppendFormat("<li>{0}</li>", HttpUtility.HtmlEncode(rcpt))); sb_message.AppendFormat("</ul>"); sb_message.AppendFormat("<p>{0}</p>", MailApiResource.DeliveryFailureRecommendations .Replace("{account_name}", "<b>" + item.From + "</b>")); sb_message.AppendFormat( "<a id=\"delivery_failure_button\" mailid={0} class=\"button blue\" style=\"margin-right:8px;\">", result_message.Id); sb_message.Append(MailApiResource.DeliveryFailureBtn + "</a></div>"); sb_message.AppendFormat("<p>{0}</p>", MailApiResource.DeliveryFailureFAQInformation .Replace("{url_begin}", "<a id=\"delivery_failure_faq_link\" target=\"blank\" href=\"#gmail\">") .Replace("{url_end}", "</a>")); var last_dot_index = ex.Message.LastIndexOf('.'); var smtp_response = ex.Message; if (last_dot_index != -1 && last_dot_index != smtp_response.Length) { try { smtp_response = smtp_response.Remove(last_dot_index + 1, smtp_response.Length - last_dot_index - 1); } catch { } } sb_message.AppendFormat( "<p style=\"color:gray;\">" + MailApiResource.DeliveryFailureReason + ": \"{0}\"</p></div>", smtp_response); message_delivery.HtmlBody = sb_message.ToString(); // SaveToDraft To Inbox var notify_message_item = message_delivery.ToMailMessageItem(tenant_id, username); notify_message_item.MessageId = _manager.CreateMessageId(); notify_message_item.ChainId = notify_message_item.MessageId; notify_message_item.IsNew = true; notify_message_item.IsFromCRM = false; notify_message_item.IsFromTL = false; _manager.StoreMailBody(mbox.TenantId, mbox.UserId, notify_message_item); // ReSharper disable UnusedVariable var id_mail = _manager.MailSave(mbox, notify_message_item, 0, MailFolder.Ids.inbox, MailFolder.Ids.inbox, string.Empty, string.Empty, false); // ReSharper restore UnusedVariable //_manager.UpdateChain(notify_message_item.ChainId, folder, mbox.MailBoxId, mbox.TenantId, mbox.UserId); if (message != null) _manager.CreateDeliveryFailureAlert(mbox.TenantId, mbox.UserId, item.Subject, item.From, (Int32) result_message.Id); } catch { /* TODO: add log here */ } }
private static string ReplaceEmbeddedImages(MailMessageItem m) { try { var doc = new HtmlDocument(); doc.LoadHtml(m.HtmlBody); if (m.Attachments != null && m.Attachments.Count > 0) { foreach (var attach in m.Attachments) { if (string.IsNullOrEmpty(attach.contentId)) continue; var old_nodes = doc.DocumentNode.SelectNodes("//img[@src and (contains(@src,'cid:" + attach.contentId.Trim('<').Trim('>') + "'))]"); if (old_nodes == null || attach.storedFileUrl == null) continue; foreach (var node in old_nodes) { node.SetAttributeValue("cid", attach.contentId); node.SetAttributeValue("src", attach.storedFileUrl); } } } return doc.DocumentNode.OuterHtml; } catch (RecursionDepthException ex) { throw new Exception(ex.Message); } catch (Exception) { return m.HtmlBody; } }
public static void TestIMAPReceiveMessage(string imap_server, string imap_account, string imap_password, int imap_port, bool use_ssl, string uidl) { var imap = MailClientBuilder.Imap(); try { _log.Debug("Connecting to {0}", imap_account); var match = _imapUidlRegx.Match(uidl); if (!match.Success) { _log.Error("Bad UIDL"); return; } var uid = Convert.ToInt32(match.Groups[1].Value); var folder = Convert.ToInt32(match.Groups[2].Value); var uid_validity = Convert.ToInt32(match.Groups[3].Value); if (use_ssl) { imap.ConnectSsl(imap_server, imap_port); } else { imap.Connect(imap_server, imap_port); } imap.Login(imap_account, imap_password, ""); var folders = MailQueueItem.GetImapMailboxes(imap, imap_server); var founded = (from n in folders where n.folder_id == folder select n) .FirstOrDefault(); if (string.IsNullOrEmpty(founded.name)) { _log.Error("Bad UIDL folder"); return; } var mb = imap.SelectMailbox(founded.name); if (mb.UidValidity != uid_validity) { _log.Error("Bad UID_VALIDITY"); return; } var message = mb.Fetch.UidMessageObject(uid); var mail_info = new MailMessageItem(message); // ReSharper disable UnusedVariable var sanitazed = HtmlSanitizer.Sanitize(mail_info.HtmlBody, true); // ReSharper restore UnusedVariable } catch (Pop3Exception ex) { Console.WriteLine(ex.ToString()); } finally { try { if (imap.IsConnected) { imap.Disconnect(); } } catch { } } }
public static void TestPOPReceiveMessage(string pop3_server, string pop3_account, string pop3_password, int pop3_port, bool use_ssl, string uidl) { var pop = MailClientBuilder.Pop(); try { _log.Debug("Connecting to {0}", pop3_account); var result = use_ssl ? pop.ConnectSsl(pop3_server, pop3_port, pop3_account, pop3_password) : pop.Connect(pop3_server, pop3_port, pop3_account, pop3_password); if (!result.StartsWith("+")) { return; } if (pop.UniqueIdExists(uidl)) { _log.Info("Message with this uidl exists!"); var index = pop.GetMessageIndex(uidl); _log.Info("StoreMessage(index: {0})", index); var destination_path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"strange.eml"); pop.UpdateStats(); //pop.StoreMessage(index, false, destination_path); var message = pop.RetrieveMessageObject(index); var mail_info = new MailMessageItem(message); _log.Info(mail_info.HtmlBody); if (File.Exists(destination_path)) { _log.Info("Message stored successfully!\r\n"); } else { _log.Error("Message is missing in destination path!\r\n"); } } else { _log.Info("Message with this uidl not exists!\r\n"); } } catch (Pop3Exception ex) { Console.WriteLine(ex.ToString()); } finally { try { if (pop.IsConnected) { pop.Disconnect(); } } catch { } } }
public static string ReplaceEmbeddedImages(MailMessageItem m, ILogger log = null) { try { log = log ?? new NullLogger(); var doc = new HtmlDocument(); doc.LoadHtml(m.HtmlBody); if (m.Attachments != null && m.Attachments.Count > 0) { foreach (var attach in m.Attachments) { if (string.IsNullOrEmpty(attach.storedFileUrl)) { continue; } if (string.IsNullOrEmpty(attach.contentId) && string.IsNullOrEmpty(attach.contentLocation)) { continue; } HtmlNodeCollection oldNodes = null; if (!string.IsNullOrEmpty(attach.contentId)) { oldNodes = doc.DocumentNode.SelectNodes("//img[@src and (contains(@src,'cid:" + attach.contentId.Trim('<').Trim('>') + "'))]"); } if (!string.IsNullOrEmpty(attach.contentLocation) && oldNodes == null) { oldNodes = doc.DocumentNode.SelectNodes("//img[@src and (contains(@src,'" + attach.contentLocation + "'))]"); } if (oldNodes == null) { //This attachment is not embedded; attach.contentId = null; attach.contentLocation = null; continue; } foreach (var node in oldNodes) { node.SetAttributeValue("src", attach.storedFileUrl); } } } return(doc.DocumentNode.OuterHtml); } catch (RecursionDepthException ex) { var data = Encoding.UTF8.GetBytes(m.HtmlBody); m.Attachments.Add(new MailAttachment { size = data.Length, fileName = "original_message.html", contentType = "text/html; charset=utf-8", data = data }); m.HtmlBody = "<div>The received email size is too big. The complete text was saved into a separate file and attached to this email.</div>"; log.Error("ReplaceEmbeddedImages() \r\n Exception: \r\n{0}\r\n", ex.ToString()); return(m.HtmlBody); } catch (Exception) { return(m.HtmlBody); } }
public static void TestIMAPReceiveMessage(string imap_server, string imap_account, string imap_password, int imap_port, bool use_ssl, string uidl) { var imap = MailClientBuilder.Imap(); try { _log.Debug("Connecting to {0}", imap_account); var match = _imapUidlRegx.Match(uidl); if (!match.Success) { _log.Error("Bad UIDL"); return; } var uid = Convert.ToInt32(match.Groups[1].Value); var folder = Convert.ToInt32(match.Groups[2].Value); var uid_validity = Convert.ToInt32(match.Groups[3].Value); if (use_ssl) imap.ConnectSsl(imap_server, imap_port); else imap.Connect(imap_server, imap_port); imap.Login(imap_account, imap_password, ""); var folders = MailQueueItem.GetImapMailboxes(imap, imap_server); var founded = (from n in folders where n.folder_id == folder select n) .FirstOrDefault(); if (string.IsNullOrEmpty(founded.name)) { _log.Error("Bad UIDL folder"); return; } var mb = imap.SelectMailbox(founded.name); if (mb.UidValidity != uid_validity) { _log.Error("Bad UID_VALIDITY"); return; } var message = mb.Fetch.UidMessageObject(uid); var mail_info = new MailMessageItem(message); // ReSharper disable UnusedVariable var sanitazed = HtmlSanitizer.Sanitize(mail_info.HtmlBody, true); // ReSharper restore UnusedVariable } catch (Pop3Exception ex) { Console.WriteLine(ex.ToString()); } finally { try { if (imap.IsConnected) { imap.Disconnect(); } } catch { } } }
// Add tags from Teamlab CRM to mail if needed. private void SetCrmTags(MailMessageItem mail, int tenant_id, string user_id) { try { if (mail.ParticipantsCrmContactsId == null) mail.ParticipantsCrmContactsId = GetCrmContactsId(tenant_id, user_id, mail.FromEmail); var allowed_contact_ids = mail.ParticipantsCrmContactsId; using (var db = new DbManager("crm")) { #region Extract CRM tags if (allowed_contact_ids.Count == 0) return; //Todo: Rewrite this to Api call var tag_ids = db.ExecuteList(new SqlQuery("crm_entity_tag") .Distinct() .Select("tag_id") .Where("entity_type", (int)EntityType.Contact) .Where(Exp.In("entity_id", allowed_contact_ids))) .ConvertAll(r => -Convert.ToInt32(r[0])); mail.TagIds = new ItemList<int>(tag_ids); #endregion } } catch (Exception e) { _log.Error("SetCrmTags() Exception:\r\n{0}\r\n", e.ToString()); } }
public MailMessageItem GetMessageTemplate() { var send_template = new MailMessageItem { Attachments = new List<MailAttachment>(), Bcc = "", Cc = "", Subject = "", From = "", HtmlBody = "", Important = false, ReplyTo = "", To = "", StreamId = mailBoxManager.CreateNewStreamId() }; return send_template; }