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;
            }
        }
Exemplo n.º 3
0
        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;
            }
        }
Exemplo n.º 4
0
        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());
            }
        }
Exemplo n.º 6
0
        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());
            }
        }
Exemplo n.º 10
0
        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;
        }
Exemplo n.º 11
0
        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());
            }
        }
Exemplo n.º 12
0
        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;
            }
        }
Exemplo n.º 14
0
        //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;
            }
        }
Exemplo n.º 16
0
        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
                { }
            }
        }
Exemplo n.º 17
0
        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);
            }
        }
Exemplo n.º 19
0
        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
                { }
            }
        }
Exemplo n.º 20
0
        // 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());
            }
        }
Exemplo n.º 21
0
 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;
 }