Добрый день, подскажите, пожалуйста, можно ли как-нибудь завязать все сообщения ответы и вообще всю цепочку сообщений-ответов чтобы запросом считать письмо и все связанные с ним сообщения?
Пробовал прокидывать в поле ActivityConnection на Activity при клике на кнопку "ответить" связь, но непонятно как в таком случае привязывать входящие письма к ответу ("re: re:" письма)

Нравится

0 комментариев
Показать все комментарии

Коллеги, подскажите какие программные интерфейсы стоит использовать чтобы реализовать интеграцию с нештатным рассыльщиком? Чтобы сохранялся штатный функционал рассылок Маркетинга, но использовался другой сервис рассылок.
Возможно где-то есть документация, которую я не нашёл по этому вопросу.

Нравится

1 комментарий

Добрый день, Павел.

К сожалению, сейчас мы не имеем sdk для подключения других сервисов рассылок. Мы зарегистрировали Ваше пожелание, что бы реализовать этот функционал в будущих версиях приложения. 

Показать все комментарии

Привет, не работает маппинг полей если в качестве источника макросов указать объект созданный на основе представления, но работает с обычными объектами. Сталкивался ли кто, с использованием представления в качестве источника макросов.

Нравится

3 комментария

Добрый день!
Как проявляет себя проблема?
Возможно Вы пытались получить значения, которых нет в самой таблице представления. Найти какие поля есть и доступны в таблице представления можно через СУБД.

Криволапова Александра,

Добрый, не отображаются значения полей в итоговом письме, при использовании блока отправить email и передачи в него Id записи из представления.

 

Глеб Макаров,

Проверьте, пожалуйста, есть ли в БД в таблице представления те колонки, которые Вы с помощью макросов помещаете в шаблон.

Показать все комментарии

Добрый день, коллеги! Столкнулся с такой проблемой. Создал шаблон email-сообщения. Когда я отправляю письмо в бизнес-процессе по этому шаблону, оно приходит без фона блока (в качестве фона используется картинка, а не заливка). Нашёл такую закономерность, что если картинку фона сжать до 15 КБ, то она приходит в качестве фона. Но при таком сильном сжатии (с 80 КБ до 15 КБ) сильно ухудшается качество. Картинка в base64 тега table в background. Как мне заставить Creatio отправить фон, не теряя при этом в качестве изображения?  

Нравится

1 комментарий
Лучший ответ

Заикин Дмитрий, добрый день!
Фоновое изображение должно отправляться независимо от размера.
Возможно проблема в блокировках изображений\вложений\файлов со стороны почтового провайдера. 
Убедитесь, что email с которого уходят письма доверенный. Также, попробуйте проверить отправку на разные почтовые провайдеры.

Заикин Дмитрий, добрый день!
Фоновое изображение должно отправляться независимо от размера.
Возможно проблема в блокировках изображений\вложений\файлов со стороны почтового провайдера. 
Убедитесь, что email с которого уходят письма доверенный. Также, попробуйте проверить отправку на разные почтовые провайдеры.

Показать все комментарии

Возникла проблемы с передачей параметра из бизнес процесса в шаблон email. Параметр сохраняется в процессе как текст https://prnt.sc/13ikimi. Во время выполнения процесса параметр заполняется текстом и далее используется в письме https://prnt.sc/13ikpvd. Но при отправке письма параметр не подтянулся https://prnt.sc/13ikxuq. Что я делаю не так?)

Нравится

2 комментария

А у вас Service? Из опыта и обсуждения так может работать только там

Добрый день.

 

Если Вы формируете письмо программно, тогда макросы не будут срабатывать. В этом случае Вам нужно программно считать сохраненное значение параметра бизнес-процесса и подставить его в Ваш шаблон.

 

Макросы срабатывают только в случае использования уже преднастроенных шаблонов в элементе [Отправить email].

Показать все комментарии

По инструкции https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/ra…
настроили ExchangeListenerService.
На странице диагностики работы все пунктики зеленые. Т.е. все настройки выполнены.
 

В системе добавляем новый почтовый ящик для синхронизации. Сам я щик также полностью настроен. Все разрешения выставлены.
 

При добавлении возникает ошибка "Ошибка при добавлении настроек. Обратитесь к администратору системы".
 

В консоли при этом появляется ошибка

ListenerServiceFailJob error System.Security.Cryptography.CryptographicException: Заполнение неверно и не может быть удалено.\r\n   в System.Security.Cryptography.CapiSymmetricAlgorithm.DepadBlock(Byte[] block, Int32 offset, Int32 count)\r\n   в System.Security.Cryptography.CapiSymmetricAlgorithm.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)\r\n   в System.Security.Cryptography.CryptoStream.FlushFinalBlock()\r\n   в System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing)\r\n   в System.IO.Stream.Close()\r\n   в Terrasoft.Common.PasswordCryptoProvider.DecryptValue(Object value, ICryptoTransform decryptor)\r\n   в Terrasoft.Core.SecureTextDataValueType.GetValueForLoad(UserConnection userConnection, Object value)\r\n   в Terrasoft.Core.Entities.EntityColumnValue.LoadValue(Object value)\r\n   в Terrasoft.Core.Entities.EntityColumnValueCollection.ForceLoadColumnValue(String name, Object value)\r\n   в Terrasoft.Core.Entities.Entity.LoadShallow(IDataReader dataReader, Dictionary`2 columnMap)\r\n   в Terrasoft.Core.Entities.EntityCollection.LoadShallow(IDataReader dataReader, Dictionary`2 columnMap, Boolean needClear)\r\n   в Terrasoft.Core.Entities.EntitySchemaQuery.GetEntitySchemaEntityCollection(UserConnection userConnection, IDataReader dataReader)\r\n   в Terrasoft.Core.Entities.EntitySchemaQuery.<GetEntityCollectionAsync>d__343.MoveNext()\r\n--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---\r\n   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   в Terrasoft.Core.Entities.EntitySchemaQuery.GetEntityCollection(UserConnection userConnection)\r\n   в IntegrationV2.MailboxDomain.Repository.MailboxRepository.GetAll(Boolean userMailboxesOnly, Boolean useForSynchronization)\r\n   в IntegrationV2.MailboxDomain.MailboxService.GetAllSynchronizableMailboxes()\r\n   в Terrasoft.Configuration.ListenerServiceFailJob.GetSynchronizableMailboxes()\r\n   в Terrasoft.Configuration.ListenerServiceFailJob.GetMailboxesWithoutSubscriptions()\r\n   в Terrasoft.Configuration.ListenerServiceFailJob.Execute(UserConnection userConnection, IDictionary`2 parameters)\r\nSystem.Security.Cryptography.CryptographicException: Заполнение неверно и не может быть удалено.\r\n   в System.Security.Cryptography.CapiSymmetricAlgorithm.DepadBlock(Byte[] block, Int32 offset, Int32 count)\r\n   в System.Security.Cryptography.CapiSymmetricAlgorithm.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)\r\n   в System.Security.Cryptography.CryptoStream.FlushFinalBlock()\r\n   в System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing)\r\n   в System.IO.Stream.Close()\r\n   в Terrasoft.Common.PasswordCryptoProvider.DecryptValue(Object value, ICryptoTransform decryptor)\r\n   в Terrasoft.Core.SecureTextDataValueType.GetValueForLoad(UserConnection userConnection, Object value)\r\n   в Terrasoft.Core.Entities.EntityColumnValue.LoadValue(Object value)\r\n   в Terrasoft.Core.Entities.EntityColumnValueCollection.ForceLoadColumnValue(String name, Object value)\r\n   в Terrasoft.Core.Entities.Entity.LoadShallow(IDataReader dataReader, Dictionary`2 columnMap)\r\n   в Terrasoft.Core.Entities.EntityCollection.LoadShallow(IDataReader dataReader, Dictionary`2 columnMap, Boolean needClear)\r\n   в Terrasoft.Core.Entities.EntitySchemaQuery.GetEntitySchemaEntityCollection(UserConnection userConnection, IDataReader dataReader)\r\n   в Terrasoft.Core.Entities.EntitySchemaQuery.<GetEntityCollectionAsync>d__343.MoveNext()\r\n--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---\r\n   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   в Terrasoft.Core.Entities.EntitySchemaQuery.GetEntityCollection(UserConnection userConnection)\r\n   в IntegrationV2.MailboxDomain.Repository.MailboxRepository.GetAll(Boolean userMailboxesOnly, Boolean useForSynchronization)\r\n   в IntegrationV2.MailboxDomain.MailboxService.GetAllSynchronizableMailboxes()\r\n   в Terrasoft.Configuration.ListenerServiceFailJob.GetSynchronizableMailboxes()\r\n   в Terrasoft.Configuration.ListenerServiceFailJob.GetMailboxesWithoutSubscriptions()\r\n   в Terrasoft.Configuration.ListenerServiceFailJob.Execute(UserConnection userConnection, IDictionary`2 parameters)

 

Что не так с почтой? Что именно нужно еще настроить для корректной работы синхронизации почты?

Нравится

2 комментария

Оксана, здравствуйте!

 

Согласно ошибке, то у вас проблема с дешифрованием хэшей.

Посмотрите, пожалуйста, на уровне БД есть ли в таблице MailboxSyncSettings некорректные данные (это актуально если запись почтового ящика была добавлена уровне БД и, например, UserPassword пустой).

 

Уточните, пожалуйста:

- это ваше первое добавление почтового ящика (на уровне БД есть записи в MailboxSyncSettings). Если они не нужны, то можете попробовать удалить и заново добавить почтовый ящик.

- вы недавно обновлялись с версии на версию? Если да,  то с какой версии и на какую (нужна точная версия)?

- какой тип почтового провайдера вы добавляете (Exchange, Gsuite и т.д.)?

Вильшанский Дмитрий,

Да, действительно. В MailboxSyncSettings оказался ящик без действующего пароля. Спасибо!

Показать все комментарии

Добрый день . 

Есть стандартный БП Запуск процесса Отправка email сообщения группе о назначении обращения. Работает отлично. Но начиная с версии 7.17 можно отправлять вложения в  ходе БП.

Кто подскажет как модернизировать стандартный БП, что бы вложения отправлялись ? 

 

UserConnection userConnection = UserConnection;
if (userConnection.CurrentUser.ConnectionType == UserType.SSP) {
    userConnection = userConnection.AppConnection.SystemUserConnection;
}
var senderEmail = Terrasoft.Core.Configuration.SysSettings.GetValue<string>(userConnection, 
    "SupportServiceEmail", string.Empty);
if (userConnection.GetIsFeatureEnabled("EmailMessageMultiLanguage") || userConnection.GetIsFeatureEnabled("EmailMessageMultiLanguageV2")) {
    var caseRecordId = (StartSignal1.RecordId != Guid.Empty)
        ? StartSignal1.RecordId 
        : StartSignal2.RecordId;
    var esq = new EntitySchemaQuery(userConnection.EntitySchemaManager, "Case");
    esq.AddColumn("Group");
    var caseEntity = esq.GetEntity(userConnection, caseRecordId);
    if (caseEntity != null) {
        var adminUnitEsq = new EntitySchemaQuery(userConnection.EntitySchemaManager, "SysAdminUnit");
        adminUnitEsq.UseAdminRights = false;
        var emailColumnName = adminUnitEsq.AddColumn("Contact.Email").Name;
        var groupId = caseEntity.GetTypedColumnValue<Guid>("GroupId");
        adminUnitEsq.Filters.Add(adminUnitEsq.CreateFilterWithParameters(FilterComparisonType.Equal, "[SysUserInRole:SysUser].SysRole", groupId));
        var collection = adminUnitEsq.GetEntityCollection(userConnection);
        var result = string.Join(";", collection.Select(e => e.GetTypedColumnValue<string>(emailColumnName)));
        if (!string.IsNullOrWhiteSpace(result)) {
            var emailTemplateSender = new Terrasoft.Configuration.EmailWithMacrosManager(userConnection);
            var emailTemplateId = Terrasoft.Configuration.CaseConsts.GroupTemplateId;
            if (userConnection.GetIsFeatureEnabled("EmailMessageMultiLanguageV2")) {
                emailTemplateSender.SendEmailFromTo(caseRecordId, emailTemplateId, senderEmail, result);
                return true;
            } else {
                var emailTemplateStore = new Terrasoft.Configuration.EmailTemplateStore(userConnection);
                var emailTemplateLanguageHelper = new Terrasoft.Configuration.EmailTemplateLanguageHelper(caseRecordId, userConnection);
                var languageId = emailTemplateLanguageHelper.GetLanguageId(emailTemplateId);
                var templateEntity = emailTemplateStore.GetTemplate(emailTemplateId, languageId);
                emailTemplateSender.SendEmailFromTo(caseRecordId, templateEntity.PrimaryColumnValue, senderEmail, result);
            }
        }
    }
} else {
    Guid sendEmailToCaseGroup = new Guid("C68F5A4E-AD06-4C83-88C4-040D2480FACB");
    var manager = userConnection.ProcessSchemaManager;
    var processSchema = manager.GetInstanceByUId(sendEmailToCaseGroup);
    if (ProcessSchemaManager.GetCanUseFlowEngine(userConnection, processSchema)) {
        var flowEngine = new FlowEngine(userConnection);
        Dictionary<string, string> parameter = new Dictionary<string, string>();
        parameter.Add("CaseRecordId", CaseRecordId.ToString());
        flowEngine.RunProcess(processSchema, parameter);
    } else {
        var moduleProcess = processSchema.CreateProcess(userConnection);
        if (processSchema.Parameters.ExistsByName("CaseRecordId")) {
            moduleProcess.SetPropertyValue("CaseRecordId", CaseRecordId);
        }
        moduleProcess.Execute(userConnection);
    }
}
return true;

Прикрепленные файлы

Нравится

1 комментарий

Добрый день.

Рекомендую вам воспользоваться данной статьей или уже готовое бесплатное расширение, которое можно будет немного отредактировать.

Показать все комментарии

nlog пишит свои логи в файл.

Пытаюсь настроить получение этих сообщений на почту. 

для этого в файл

nlog.targets.config

добавляю такой код 

       <target name="applicationAppenderNew" 
            xsi:type="Mail"
            smtpServer="smtp.office365.com"
            smtpAuthentication="Basic" 
            smtpPort="587"
            encoding="UTF-8"
            smtpusername="xxx@xxx"
            smtpPassword="xxxxx"
            from="hhhh"
            to="xxx@xxx"
            html="true"
            enableSsl="true"
            secureSocketOption="StartTls"
            replaceNewlineWithBrTagInHtml="true"  
            subject="Error"
            body="ff"
            timeout="10000"
        </target>

но почта не отправляется,

при этом файл логирования  internalLogFile="D:\log\NLog.log">   даже не создается. Как разобраться в чем проблема?

nlog.config 

добавил цели

        <logger name="Terrasoft.WebApp.Loader.*" writeTo="applicationAppender, applicationAppenderNEW" minlevel="Info" final="true" />
        <logger name="Terrasoft.WebApp.Global" writeTo="applicationAppender, applicationAppenderNEW" minlevel="Info" final="true" />
        <logger name="Terrasoft.Core.LicManager" writeTo="applicationAppender, applicationAppenderNEW" minlevel="Info" final="true" />

Нравится

1 комментарий

Добрый день,  попробуйте дополнительно настроить  уровень логирования  

 

internalLogLevel="Trace",

 

так как в библиотеке NLog почти вся полезная, диагностическая информация логируется на этом уровне. Путь к файлу должен быть абсолютным и у пользователя пула должны быть права на эту папку. 

Также посмотрите документацию по Nlog  Nlog-project.org и на Академии

 


 
Показать все комментарии

Есть следующая задача: при изменении активности нужно отправить ответственному email в котором есть прямая ссылка на эту активность.

Данную задачу можно реализовать используя элементы [Формула] и [Читать данные] в дизайнере бизнес-процессов. Необходимо добавить в сам процесс дополнительный текстовый параметр, который преобразовывает идентификатор активности используя формулу в текстовое значение через метод ToString(). 
Ссылка на активность состоит из статической части и динамической, например:

https://XXXX-crm-bundle.terrasoft.ru/0/Nui/ViewModule.aspx#CardModuleV2…e59e41be-f36b-1410-d691-00155d04c01d, все что сразу после ../edit/ - динамическая часть, guid (глобальный идентификатор активности), его и будем подставлять в тело email после статической ссылки.

1. Создаем элемент бизнес-процесса [Сигнал] который будет реагировать на изменение в активности. 

2. Следующим шагом, элементом [Читать данные] вычитываем данные из активности по Id.

3. Добавляем в процесс текстовый параметр, который преобразовывается в идентификатор активности используя формулу.

4. Используя элемент [Формула] передаем значение формулы в параметр guid активности.

В значении формулы используем метод ToString(), который преобразует идентификатор в текстовое значение:

5. Добавляем элемент для отправки email c заданными параметрами.

В теле письма, вставляем статическую ссылку на ваш сайт и через кнопку "молния"  выбираем параметры процесса, Параметр для guid активности.

В результате в теле письма получаем:

Ссылка на активность
https://XXX-crm-bundle.terrasoft.ru/0/Nui/ViewModule.aspx#CardModuleV2/… для guid активности#]

6. И как результат, при изменении активности получаем на почту письмо:

 

 

 

Нравится

Поделиться

1 комментарий

Ссылку на сам сайт (если у вас есть тестовая и рабочая среды, например) можно хранить в системной настройке SiteUrl (он же используется для настройки Telegram - https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/na…)

Показать все комментарии
Terrasoft.Core.Factories
Terrasoft.Mail.Sender
 
List&lt;string&gt; messageRecipients = new List&lt;string&gt;() { email };
var message = new EmailMessage
{
	From = sender,
	To = messageRecipients,
	Subject = emailSubject,
	Body = $"Добрый день, {name}. {messageBody}"
};
 
var emailClientFactory = ClassFactory.Get&lt;EmailClientFactory&gt;(new ConstructorArgument("userConnection",
	UserConnection));
var emailSender = new EmailSender(emailClientFactory, UserConnection);
emailSender.Send(message, true);

 

Нравится

Поделиться

1 комментарий

Kulakov,

Добрый день!

Скорее всего необходимо настроить атрибут Body из класса EmailMessage. Если вы посмотрите на запрос PublishMessage в  Network, то там видно, что шаблоны применяються с помощью параметра Body. Также вы можете посмотреть на объект CaseMessageHistory и его параметр Message, чтобы увидеть, как выглядит сообщение с шаблоном.

Показать все комментарии