public void SendMessage(object message)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            if (!(message is SMEmail))
            {
                var error = string.Format("Can't process message '{0}'. Expected type is '{1}'",
                                          message.GetType().Name, typeof(SMEmail).Name);
                throw new ArgumentException(error, "message");
            }

            SMEmail email = message as SMEmail;

            if (email.MailAccountID != null && PX.Objects.CS.Email.PXEmailSyncHelper.IsExchange(email.MailAccountID.Value))
            {
                CRSMEmail emailProjection =
                    PXSelect <CRSMEmail, Where <CRSMEmail.noteID, Equal <Required <SMEmail.refNoteID> > > > .Select(new PXGraph(), email.RefNoteID);

                CS.Email.PXEmailSyncHelper.SendMessage(emailProjection);
            }
            else
            {
                new MessageProcessor(email.MailAccountID).Process(email);
            }
        }
コード例 #2
0
        public void SendMessage(object message)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message), PXMessages.LocalizeNoPrefix(Messages.Message));
            }

            if (!(message is SMEmail))
            {
                string errorText = PXMessages.LocalizeFormatNoPrefixNLA(Messages.CanNotProcessMessage, message.GetType().Name,
                                                                        typeof(SMEmail).Name);
                throw new ArgumentException(errorText, PXMessages.LocalizeNoPrefix(Messages.Message));
            }

            SMEmail email = message as SMEmail;

            if (email.MailAccountID != null && PX.Objects.CS.Email.PXEmailSyncHelper.IsExchange(email.MailAccountID.Value))
            {
                CRSMEmail emailProjection =
                    PXSelect <CRSMEmail, Where <CRSMEmail.noteID, Equal <Required <SMEmail.refNoteID> > > > .Select(new PXGraph(), email.RefNoteID);

                CS.Email.PXEmailSyncHelper.SendMessage(emailProjection);
            }
            else
            {
                using (var processor = new MessageProcessor(email.MailAccountID))
                {
                    processor.Process(email);
                }
            }
        }
コード例 #3
0
            private string GenerateSubject(SMEmail message)
            {
                var subject = message.Subject;

                if (message.Ticket == null)
                {
                    message.Ticket = message.ID;
                }
                if (message.Ticket != null)
                {
                    EMailAccount account =
                        PXSelect <EMailAccount, Where <EMailAccount.emailAccountID, Equal <Required <EMailAccount.emailAccountID> > > > .Select(_graph,
                                                                                                                                                message.MailAccountID);

                    if (account != null && account.IncomingProcessing == true)
                    {
                        var ticket = EncodeTicket(message.ID.GetValueOrDefault());
                        subject = message.Subject.StartsWith("FW: ") || message.Subject.StartsWith("RE: ")
                                        ? message.Subject.Substring(0, 4) + message.Subject.Substring(4)
                                        : message.Subject;
                        subject += " " + ticket;
                    }
                }
                return(subject);
            }
 private void Proccess()
 {
     using (new PXScreenIDScope("CR306015"))
     {
         try
         {
             if (CreateMessage())
             {
                 ProcessMessage();
             }
         }
         finally
         {
             _graph.Clear();
             _activity = null;
             if (_activityMessage != null)
             {
                 _message.Exception = _activityMessage.Exception;
                 _message.MPStatus  = _activityMessage.MPStatus;
             }
             _message         = null;
             _activityMessage = null;
         }
     }
 }
            private MailProcessor(PXGraph graph, EMailAccount account, SMEmail message)
                : this(graph, account)
            {
                if (message == null)
                {
                    throw new ArgumentNullException("message");
                }

                _message = message;
            }
コード例 #6
0
            private string ReadTemplateAttachments(SMEmail message)
            {
                if (message.Body != null && message.Body.IndexOf("embedded=\"true\"") > -1)
                {
                    Regex         _tempimagesRegex  = new Regex("(<(img data-convert=\"view\")[^<>]*(src=\"([^\"]*)\" ([^<>]*)>))");
                    Regex         _tempimagesRegex2 = new Regex("(<img[^<>]*src=(\"[^<>]*GetFile.*;file=([^\"]*)\") ([^<>]*)>)");
                    List <string> changeimage       = new List <string>();
                    List <int>    start             = new List <int>();
                    List <int>    length            = new List <int>();
                    foreach (Match match in _tempimagesRegex.Matches(message.Body))
                    {
                        if (match.Groups[4].Value != null && match.Groups[1].Value.IndexOf("embedded=\"true\"") > -1)
                        {
                            foreach (var result in
                                     PXSelectJoin <UploadFile,
                                                   InnerJoin <UploadFileRevision,
                                                              On <UploadFile.fileID, Equal <UploadFileRevision.fileID>,
                                                                  And <UploadFile.lastRevisionID, Equal <UploadFileRevision.fileRevisionID> > > >,
                                                   Where <UploadFile.name, Equal <Required <UploadFile.name> > > > .
                                     SelectWindowed(new PXGraph(), 0, 1, HttpUtility.UrlDecode(match.Groups[4].Value)))
                            {
                                UploadFileRevision filedata = result[typeof(UploadFileRevision)] as UploadFileRevision;
                                if (filedata != null)
                                {
                                    string tempchangeimage = "<img title=\"\" src=\"data:image/jpeg;base64," + Convert.ToBase64String(filedata.Data) + "\">";
                                    message.Body = message.Body.Replace(match.Groups[1].Value, tempchangeimage);
                                }
                            }
                        }
                    }

                    foreach (Match match in _tempimagesRegex2.Matches(message.Body))
                    {
                        if (match.Groups[3].Value != null && match.Groups[1].Value.IndexOf("embedded=\"true\"") > -1)
                        {
                            foreach (var result in
                                     PXSelectJoin <UploadFile,
                                                   InnerJoin <UploadFileRevision,
                                                              On <UploadFile.fileID, Equal <UploadFileRevision.fileID>,
                                                                  And <UploadFile.lastRevisionID, Equal <UploadFileRevision.fileRevisionID> > > >,
                                                   Where <UploadFile.name, Equal <Required <UploadFile.name> > > > .
                                     SelectWindowed(new PXGraph(), 0, 1, HttpUtility.UrlDecode(match.Groups[3].Value)))
                            {
                                UploadFileRevision filedata = result[typeof(UploadFileRevision)] as UploadFileRevision;
                                if (filedata != null)
                                {
                                    string tempchangeimage = "<img title=\"\" src=\"data:image/jpeg;base64," + Convert.ToBase64String(filedata.Data) + "\">";
                                    message.Body = message.Body.Replace(match.Groups[1].Value, tempchangeimage);
                                }
                            }
                        }
                    }
                }
                return(null);
            }
コード例 #7
0
            private void UpdateMessage(SMEmail message)
            {
                var emailType = message.GetType();
                var cache     = _graph.Caches[emailType];

                message = (SMEmail)cache.Update(message);
                _graph.EnsureCachePersistence(emailType);
                var cached = _graph.Caches[message.GetType()].Locate(message);

                _graph.Persist();
                _graph.SelectTimeStamp();
                message = (SMEmail)cache.CreateCopy(cached);
            }
コード例 #8
0
 private void ProcessMessage(SMEmail message)
 {
     try
     {
         SendMail(CreateMail(message));
         message.Exception = null;
     }
     catch (OutOfMemoryException) { throw; }
     catch (StackOverflowException) { throw; }
     catch (Exception e)
     {
         message.Exception = e.Message;
     }
 }
コード例 #9
0
            private void PreProcessMessage(SMEmail message)
            {
                var messageCopy = (SMEmail)_graph.Caches[message.GetType()].CreateCopy(message);

                messageCopy.MPStatus  = MailStatusListAttribute.InProcess;
                messageCopy.Exception = null;
                if (messageCopy.MessageId == null)
                {
                    messageCopy.MessageId = "<" + Guid.NewGuid() + "_acumatica@" + _account.OutcomingHostName + ">";
                }
                UpdateMessage(messageCopy);

                _graph.Caches[message.GetType()].RestoreCopy(message, messageCopy);
            }
コード例 #10
0
            private AttachmentCollection ReadAttachments(SMEmail message)
            {
                var fs = new AttachmentCollection(_graph);

                foreach (NoteDoc notes in
                         PXSelect <NoteDoc,
                                   Where <NoteDoc.fileID, IsNotNull,
                                          And <NoteDoc.noteID, Equal <Required <NoteDoc.noteID> > > > > .
                         Select(_graph, message.RefNoteID))
                {
                    fs.Add((Guid)notes.FileID);
                }

                return(fs);
            }
コード例 #11
0
            private string ExtractInlineImages(SMEmail message, AttachmentCollection fs)
            {
                string res;
                ICollection <PX.Data.ImageExtractor.ImageInfo> files;

                if (message.Body != null && new ImageExtractor().Extract(message.Body, out res, out files))
                {
                    foreach (PX.Data.ImageExtractor.ImageInfo imageInfo in files)
                    {
                        fs.Add(imageInfo.ID, imageInfo.ID.ToString(), imageInfo.Bytes);
                    }
                    return(res);
                }
                return(message.Body);
            }
コード例 #12
0
            private void PostProcessMessage(SMEmail message)
            {
                PXDatabase.Update <CRActivity>(
                    new PXDataFieldAssign <CRActivity.startDate>(PXTimeZoneInfo.UtcNow),
                    new PXDataFieldAssign <CRActivity.uistatus>(message.Exception == null
                                                ? ActivityStatusAttribute.Completed
                                                : ActivityStatusAttribute.Open),
                    new PXDataFieldRestrict <CRActivity.noteID>(PXDbType.UniqueIdentifier, 16, message.RefNoteID, PXComp.EQ));

                if (message.Exception == null)
                {
                    PXUpdate <Set <PMTimeActivity.approvalStatus,
                                   Switch <Case <Where <PMTimeActivity.approverID, IsNull>,
                                                 ActivityStatusAttribute.completed>,
                                           ActivityStatusAttribute.pendingApproval> >,
                              PMTimeActivity,
                              Where <PMTimeActivity.refNoteID, Equal <Required <PMTimeActivity.refNoteID> >,
                                     And <PMTimeActivity.isCorrected, Equal <Zero> > > >
                    .Update(_graph, message.RefNoteID);
                }

                if (message.Exception == null)
                {
                    message.RetryCount = 0;
                    message.MPStatus   = MailStatusListAttribute.Processed;
                }
                else
                {
                    message.RetryCount += 1;
                    if (message.Exception.StartsWith("5") ||
                        message.RetryCount >= MailAccountManager.GetEmailPreferences().RepeatOnErrorSending)
                    {
                        message.RetryCount = 0;
                        message.MPStatus   = MailStatusListAttribute.Failed;
                    }
                    else
                    {
                        message.MPStatus = MailStatusListAttribute.PreProcess;
                    }
                }

                UpdateMessage(message);
            }
コード例 #13
0
            public void Process(SMEmail message)
            {
                using (PXTransactionScope sc = new PXTransactionScope())
                {
                    try
                    {
                        PreProcessMessage(message);
                    }
                    catch (Exception)
                    {
                        //Unable to change status - leave message alone.
                        return;
                    }
                    try
                    {
                        ProcessMessage(message);
                        PostProcessMessage(message);
                    }
                    catch (Exception ex)
                    {
                        this._graph.Clear();
                        if (message == null || _graph.Caches[message.GetType()].GetStatus(message) == PXEntryStatus.Inserted)
                        {
                            return;
                        }

                        message = PXSelect <SMEmail, Where <SMEmail.noteID, Equal <Required <SMEmail.noteID> > > > .SelectWindowed(_graph, 0, 1, message.NoteID);

                        if (message != null)
                        {
                            var messageCopy = (SMEmail)_graph.Caches[message.GetType()].CreateCopy(message);

                            messageCopy.Exception = ex.Message;
                            messageCopy.MPStatus  = MailStatusListAttribute.Failed;
                            UpdateMessage(messageCopy);

                            _graph.Caches[message.GetType()].RestoreCopy(message, messageCopy);
                        }
                    }
                    sc.Complete();
                }
            }
コード例 #14
0
        protected IEnumerable viewDetails(PXAdapter adapter)
        {
            SMEmail item = FilteredItems.Current;

            if (item != null)
            {
                if (item.RefNoteID != null)
                {
                    CREmailActivityMaint graph = CreateInstance <CREmailActivityMaint>();
                    graph.Message.Current = graph.Message.Search <CRSMEmail.noteID>(item.RefNoteID);
                    PXRedirectHelper.TryRedirect(graph, PXRedirectHelper.WindowMode.NewWindow);
                }
                else
                {
                    CRSMEmailMaint graph = CreateInstance <CRSMEmailMaint>();
                    graph.Email.Current = graph.Email.Search <SMEmail.noteID>(item.NoteID);
                    PXRedirectHelper.TryRedirect(graph, PXRedirectHelper.WindowMode.NewWindow);
                }
            }
            return(adapter.Get());
        }
コード例 #15
0
            private Message CreateMail(SMEmail message)
            {
                var subject = GenerateSubject(message);
                var fs      = ReadAttachments(message);

                ReadTemplateAttachments(message);
                var content = ExtractInlineImages(message, fs);

                Message mail = new Message(message.MailFrom, message.MailTo, subject)
                {
                    Reply = message.MailReply,
                    Cc    = message.MailCc,
                    Bcc   = message.MailBcc,
                    Body  = GenerateBody(content, fs),
                    Html  = message.Format == null || message.Format == EmailFormatListAttribute.Html,
                    UID   = message.MessageId,
                    Files = fs
                };

                return(mail);
            }
コード例 #16
0
ファイル: EmailEnq.cs プロジェクト: Vialythen/AcumaticaTest
        public virtual void editRecord()
        {
            SMEmail item = Emails.Current;

            if (item == null)
            {
                return;
            }

            if (item.RefNoteID != item.NoteID)
            {
                CREmailActivityMaint graph = CreateInstance <CREmailActivityMaint>();
                graph.Message.Current = graph.Message.Search <CRSMEmail.noteID>(item.RefNoteID);
                PXRedirectHelper.TryRedirect(graph, PXRedirectHelper.WindowMode.InlineWindow);
            }
            else
            {
                CRSMEmailMaint graph = CreateInstance <CRSMEmailMaint>();
                graph.Email.Current = graph.Email.Search <SMEmail.noteID>(item.NoteID);
                PXRedirectHelper.TryRedirect(graph, PXRedirectHelper.WindowMode.InlineWindow);
            }
        }
            private AttachmentCollection ReadAttachments(SMEmail message)
            {
                var fs = new AttachmentCollection(_graph);

                foreach (NoteDoc notes in
                         PXSelect <NoteDoc,
                                   Where <NoteDoc.fileID, IsNotNull,
                                          And <NoteDoc.noteID, Equal <Required <NoteDoc.noteID> > > > > .
                         Select(_graph, message.RefNoteID))
                {
                    fs.Add((Guid)notes.FileID);
                }

                var addFiles = PXSelect <DynamicAttachment,
                                         Where <DynamicAttachment.refNoteID, Equal <Required <DynamicAttachment.refNoteID> > > > .
                               Select(_graph, message.RefNoteID);

                foreach (Guid fileId in DynamicAttachmentManager.Process(_graph, addFiles.Extract()))
                {
                    fs.Add(fileId);
                }

                return(fs);
            }
            public static void Proccess(PXGraph graph, EMailAccount account, SMEmail email)
            {
                var obj = new MailProcessor(graph, account, email);

                obj.Proccess();
            }
            private void CreateEmail()
            {
                PXCache cache = _graph.Caches[typeof(SMEmail)];

                _message               = (SMEmail)cache.CreateCopy(cache.Insert());
                _message.RefNoteID     = _activity.NoteID;
                _message.MailAccountID = _account.EmailAccountID;

                var mimeMessage = _email.Message;

                _message.MailFrom  = mimeMessage.From.With(_ => _.ToString()) ?? string.Empty;
                _message.MailReply = mimeMessage.ReplyTo.With(_ => _.ToString()) ?? string.Empty;

                _message.MailTo  = mimeMessage.To.With(_ => _.ToString()) ?? string.Empty;
                _message.MailCc  = mimeMessage.Cc.With(_ => _.ToString()) ?? string.Empty;
                _message.MailBcc = mimeMessage.Bcc.With(_ => _.ToString()) ?? string.Empty;
                _message.Subject = mimeMessage.Subject.With(_ => _.ToString()) ?? " ";

                if (!string.IsNullOrEmpty(_email.UID))
                {
                    if (_account.IncomingHostProtocol == IncomingMailProtocolsAttribute._IMAP)
                    {
                        _message.ImapUID = int.Parse(_email.UID);
                    }
                    else
                    {
                        _message.Pop3UID = _email.UID;
                    }
                }

                _message.IsIncome  = true;
                _message.MessageId = mimeMessage.MessageID;
                _message.MPStatus  = MailStatusListAttribute.PreProcess;               //TODO: need move into Automation steps

                var body = mimeMessage.BodyHtmlText;

                if (body == null)
                {
                    if (mimeMessage.BodyText != null)
                    {
                        body = PX.Common.Tools.ConvertSimpleTextToHtml(mimeMessage.BodyText);
                    }
                }
                else
                {
                    body = mimeMessage.BodyHtmlText.
                           Replace(Environment.NewLine, " ").
                           Replace("<spanstyle", "<span style");                      //NOTE: ms outlook style conflicts with our system style

                    Regex baseTag = new Regex(@"<base(.|\n)*?>");
                    body = baseTag.Replace(body, String.Empty);
                }
                _message.Body = body ?? string.Empty;

                string clearedSubject;

                var ticket = DecodeTicket(_message.Subject, out clearedSubject);

                if (ticket != null)
                {
                    _message.Ticket = CorrectTicket(ticket);
                }

                _message.Subject = clearedSubject;

                _message = (SMEmail)cache.CreateCopy(cache.Update(_message));

                _graph.EnsureCachePersistence(_message.GetType());

                var cached = _graph.Caches[_message.GetType()].Locate(_message);

                _graph.Persist();
                _graph.SelectTimeStamp();
                _message = (SMEmail)cache.CreateCopy(cached);
            }