Добрый день, коллеги! Столкнулся с такой проблемой. Создал шаблон 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.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.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(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("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(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 parameter = new Dictionary();

        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

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

       

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

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

nlog.config 

добавил цели

        

        

        

Нравится

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<string> messageRecipients = new List<string>() { email };
var message = new EmailMessage
{
	From = sender,
	To = messageRecipients,
	Subject = emailSubject,
	Body = $"Добрый день, {name}. {messageBody}"
};
 
var emailClientFactory = ClassFactory.Get<EmailClientFactory>(new ConstructorArgument("userConnection",
	UserConnection));
var emailSender = new EmailSender(emailClientFactory, UserConnection);
emailSender.Send(message, true);

 

Нравится

Поделиться

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

Kulakov,

Добрый день!

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

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

Здравствуйте, коллеги! 

 

Возможно, такие идеи уже были озвучены, но я все таки предложу.

 

1. Добавить в редактор email-шаблонов вофможность вставлять данные из системной настройки

2. Добавить в редактор возможность вставлять ссылки на записи из произвольных справочников

 

Открыть возможность написания пользовательских макросов для email не только для Customer Portal :) 

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

Лидия, спасибо за предложения. По системным настройкам в шаблоне идея уже была. По записи справочников — идею добавил. Хотя, если первую реализуют, можно будет создать системную настройку справочного типа.

По пользовательским, если речь о IMacrosInvokable, то тоже заведена идея использовать этот механизм в других продуктах, не только Service.

Зверев Александр,

Спасибо за ответ!

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

Добрый день.

Есть предложение добавить новый стандартный макрос "Адрес стенда", который содержит доменное имя экземпляра creatio.

Это необходимо для формирования динамических ссылок на записи разделов.

Существующая функциональность "Ссылка на объект" записывает в тело шаблона статическую ссылку с доменным именем тестового стенда, и при переносе на Продакшн не перегенерирует её.



Так же есть просьба расширить возможность создания пользовательских макросов на все линейки creatio, а не ограничиваться только Service

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

Игорь, зарегистрировал пожелание.

Также идея иметь возможность использовать макросы в продуктах, отличных от service уже заведена.

Ещё принята идея по добавлению  возможности добавить в шаблон письма системную настройку (в том числе и настройку SiteUrl, где хранится адрес сайта). 

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

Добрый день, как при выборе флага загружать почту из выбранных папок, отобразить папку

Изображение удалено.

У меня не отображается ничего, я следовал статье в академии, где было все нормально

может быть на стороне почтового клиента нужны какие-то доп настройки?

Нравится

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

Дмитрий, у меня тоже ничего не отображается:

 

Изображение удалено.

Можете прикрепить картинку и описать подробнее, что не работает?

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