Коллеги, подскажите какой приоритет определяется при отправке мультиязычных e-mail сообщений?

1. Заполнен ли на странице контакта язык общения

2.Указан ли язык почтового ящика, с которого отправляется email-сообщение (проверка выполняется только продуктах линейки Service).

3.Заполнена ли системная настройка “Язык сообщений по умолчанию”.

Нравится

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

И еще вопрос: через элемент [отправитьe e-mail] при выборе нескольких контактов с разными языками общения можно настроить отправку одного письма с разными языками? Либо же придется использоваться для каждой группы лиц свой элемент?

По приоритету, см. в статье. Очевидно, как раз по порядку.

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

Александр, спасибо!

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

И получится ли сделать так, что одним письмом уйдет группе лиц кому-то на русском, а кому-то на английском?

В элементе «Отправить e-mail» (SendEmailUserTask) я вообще не вижу указания шаблона, там более низкоуровнево: тема и текст. С шаблонами работает блок «Отправить email» (EmailTemplateUserTask). Там логика намного сложнее. Насколько понял, действительно первого в списке получателей. См. в EmailTemplateUserTaskMessageProvider:

protected override (string Body, string Subject) GetEmailContent() {
		Entity entity = null;
		if (UserConnection.GetIsFeatureEnabled("EmailTemplateUserTaskMultiLanguageV2")) { 
			entity = GetMultiLanguageTemplate(EmailUserTask.EmailTemplateId, GetTemplateRecipientId(),
				_emailTemplateUserTaskLanguageIteratorTag);
			if (UserConnection.GetIsFeatureEnabled("UseMacrosAdditionalParameters")) {
				EmailUserTask.MacrosExtendedProperties.LanguageId = entity.GetTypedColumnValue<Guid>("LanguageId");
			}
		} else {
			var templateEsq = GetEmailTemplateContentEsq(EmailUserTask.EmailTemplateId);
			entity = templateEsq.GetEntityCollection(UserConnection).SingleOrDefault();
		}
		var tempalteSubject = string.Empty;
		var body = string.Empty;
		if (entity != null) {
			body = entity.GetTypedColumnValue<string>("Body");
			tempalteSubject = entity.GetTypedColumnValue<string>("Subject");
		}
		string userTaskSubject = GetEmailSubject();
		var subject = string.IsNullOrEmpty(userTaskSubject) ? tempalteSubject : userTaskSubject;
		return (body, subject);
}
 
/// <summary>
/// Returns recipient identifier from email template user task.
/// </summary>
/// <returns>Recipient identifier from email template user task.</returns>
protected virtual Guid GetTemplateRecipientId() {
		var regex = new Regex(@"^Recipient\d+$");
		BaseProcessSchemaElement userTaskSchema = EmailUserTask.GetSchemaElement();
		var processParametersMetaInfo = userTaskSchema as IProcessParametersMetaInfo;
		if (processParametersMetaInfo == null) {
			return Guid.Empty;
		}
		ProcessSchemaParameterCollection parameters = processParametersMetaInfo.ForceGetParameters();
		if (parameters == null || parameters.Count == 0) {
			return Guid.Empty;
		}
		foreach (ProcessSchemaParameter parameter in parameters) {
			if (regex.IsMatch(parameter.Name) && parameter.DataValueType.IsLookup &&
				parameter.ReferenceSchema != null && parameter.ReferenceSchema.Name == _contactSchemaName) {
				object propertyValue = EmailUserTask.GetParameterValue(parameter);
				return (Guid)propertyValue;
			}
		}
		return Guid.Empty;
}

 

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

Добрый день! 

Может кто-нибудь поэтапно объяснить логику работы с шаблонами E-mail в БП?

Или ткните носом, где это подробно описано для версии 7.7?

Создаю тестовый БП

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

Завел параметр EmailTemplateId, в который прописал GuID нужного мне шаблона из таблицы "EmailTemplate".

 

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

Читаю данные из БД по нужному GuID 

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



Также добавил параметр EmailBodyTemplate, который устанавливает свойство Body элемента "Отправить e-mail 3".



Что нужно прописать в элементе "Установить тело письма", для того чтобы связать GuID шаблона с параметром EmailBodyTemplate?



Гугл выдает много похожих запросов с форума, но практически все решения, которые там приводятся ссылаются на удаленные страницы.

Заранее благодарен.

Нравится

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

Нигрескул Алексей,

Для 7.7 данные инструкции не совсем подходят.

Чтобы найти гарантированно рабочий пример, проще всего будет найти в Вашей системе другое использование этого действия в БП.

Например, в 7.15 элемент SendEmailUserTask имеет Id «b749e6e7-cde4-4a2e-ade0-0b8cf36b0926» (смотреть в URL дизайнера).

Если запустить поиск по метаданным, можно будет найти прроцессы, где он использован:

SELECT *
  FROM [SysSchema]
  WHERE [MetaData] LIKE '%b749e6e7-cde4-4a2e-ade0-0b8cf36b0926%'

По сравнению с 7.15 набор процессов может отличаться, результаты не привожу.

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

Настроил свой БП на обращения. В нем есть отправка письма.

Для отправки письма используется мультиязычный шаблон. Для формирования письча делаю читать данные схемы Case, потом Действие процесса Обработать шаблон письма с макросами (где указан мой шаблон), затем добавляю данные в раздел Активности и далее отправляю письмо скриптом:

var activityId = Get<Guid>("AddDataID");
if (UserConnection.GetIsFeatureEnabled("UseAsyncEmailSender")) {
	AsyncEmailSender emailSender = new AsyncEmailSender(UserConnection);
	emailSender.SendAsync(activityId);
} else {
	var emailClientFactory = ClassFactory.Get<EmailClientFactory>(new ConstructorArgument("userConnection", UserConnection));
	var activityEmailSender = new ActivityEmailSender(emailClientFactory, UserConnection);
	activityEmailSender.Send(activityId);
}
return true;

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

Пример такой настройки взят и стандартного БП Отправка письма при смене статуса обращения.

Вопрос как мне заставить отправлять письмо по настройкам языка получателя?

Нравится

5 комментариев

EmailSender скорее всего берет тело сообщения из активности, а там уже лежит текст сообщения на каком то языке.

Почему бы не воспользоваться стандартным блоком "Отправить Email"?

Письмо должно быть привязано в хронологию обращения. К тому делал через отправку стандартным блоком Отправить Email и постоянно какие то ошибки. Не дружу я с ним )

К тому же все стандартные процессы по отправке писем не используют блок Отправить Email, а отправляют скриптами

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

Как то так

cultureId = UserConnection.CurrentUser.SysCultureId;

//cultureId бери из настроек пользователя те тот язык на котором хочешь чтобы было письмо пользователя

esq.SetLocalizationCultureId(cultureId);

Ну или более глобально как то так

userConnection.CurrentUser.SysCultureName = "en-US";

 

В итоге выяснилось путем тестов. Элемент БП Выполнить действие -  - Обработать шаблон письма с макросами не учитывает мультиязычные шаблоны.  Делал подмену шаблона из таблицы EmailTemplate на EmailTemplateLang. 

var mailTemplateID = Get&lt;Guid&gt;("MailTemplateID");
var usrLangId = Get&lt;Guid&gt;("UserLanguageID")==Guid.Empty
    ? new Guid("6EBC31FA-EE6C-48E9-81BF-8003AC03B019")
    : Get&lt;Guid&gt;("UserLanguageID");
var newMailTemplate = new EmailTemplateStore(UserConnection);
Set&lt;Guid&gt;("MailTemplateID", newMailTemplate.GetTemplate(mailTemplateID, usrLangId).PrimaryColumnValue);
return true;

И подавал на вход Элементу Обработать шаблон письма с макросами - результате пустое письмо. Поэтому перешел на другую отправку писем:

var contactEmail = Get&lt;string&gt;("ContactEmail");
var senderEmail = Get&lt;string&gt;("SenderEmail");
var caseId = Get&lt;Guid&gt;("RecordId");
var templateId = Get&lt;Guid&gt;("MailTemplateID");
var emailTemplateMacrosManager = new EmailWithMacrosManager(UserConnection);
emailTemplateMacrosManager.SendEmailFromTo(caseId, templateId, senderEmail, contactEmail);
return true;

Хорошо что раздел обращения. Полагаю в другом разделе такая отправка не заработает (

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

Добрый день!



Подскажите пожалуйста, каким образом можно настроить автоматический ответ на письмо, как в Outlook? Например: на любое входящее сообщение CRM должна отсылать шаблонный ответ "Письмо получено. Спасибо за обращение."

Нравится

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

Письмо єто активность с типом Emailте как вариант создать БП со стартовым сигналом слушающим добавление входящего Email и использовать элемент БП Отправить письмо для формирования ответа

Письмо єто активность с типом Emailте как вариант создать БП со стартовым сигналом слушающим добавление входящего Email и использовать элемент БП Отправить письмо для формирования ответа

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

Здравствуйте!

Возникла задача отправлять пользователям е-мейлы, содержащие html  с картинками, которые не хранятся на внешних ресурсах (то есть url нельзя указать как источник). Пробовал сделать через base64, но outlook не отображает такие картинки. Вопрос: как отправляются, например, письма с оценками (как на скриншоте)?

Судя по исходникам письма, для картинок создаются cid. Нашел файл EstimateLinksGenerator, но он, во-первых, генерирует именно base64, во-вторых, не могу найти, где он вызывается. Буду очень благодарен за пример кода, создающего html со встроеннными картинками для отображения в outlook.

 

PS используем версию 7.6, но есть возможность смотреть в код 7.11

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

Нравится

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

Здравствуйте!

Для отображения оценок исполузуется макрос EstimateLinksGenerator.

Каким образом это реализовано можно посмотреть в статье

Но такие макросы работают толькло в разделе Обращения при отправке письма по шаблону. Это связано с тем что в обращениях для обработки тела письма используется InvokableMacrosHelperService, который знает как работать с такими макросами (которые реализуют IMacrosInvokable).

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

Здравствуйте.
Появилась проблема при отправке e-mail по шаблону.
При создании шаблона указываем раздел "Контакты" и запрос для макросов "Контакты".
Нажимаем правой кнопкой мыши на физ.лицо. В контекстном меню выбираем: Действия -> Отправить e-mail по шаблону -> "Шаблон". В outlook 2010 открывается два (иногда четыре) одинаковых шаблона для отправки.
Если убрать запрос для макросов открывается один шаблон. Но макросы, по понятным причинам, не работают.
Никто не сталкивался?

Нравится

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

У Вас некорректный запрос для макросов - возвращает не одну, а две (иногда четыре) записи.

Дмитрий, спасибо. Удалил лишние колонки в запросе - все ок.

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

Добрый день.
Странная история.
Есть шаблон основанный на запросе. При позиционировании на контакте - формируется письмо с автоматической подстановкой адреса контакта и отработкой макросов в теле письма (подстановка ФИО и т.д.). Создаю новый шаблон. Тот же самый запрос. в том же самом разделе. на том же самом контакте - макросы в теле письма отрабатывают, но адрес контакта не подставляется.
В чем мой косяк? может кто сталкивался.

Нравится

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

Скорее всего не заполнили деталь [Получатели] для нового шаблона сообщения.

Точно, протупил:) Почему-то посчитал, что деталь скопируется вместе с шаблоном. Огромное спасибо.

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

Доброго времени суток, уважаемые пользователи интернет сообщества Terrasoft!

Допустим, у Вас в разделе «Контакты» существует некая статическая группа, которая включает в себя определенное количество контактов. Если Вам необходимо отправлять уведомления по шаблону всем контактам, которые входят в эту группу, то этот топик для Вас! ;)
Главной задачей при реализации, есть получить список контактов входящих в выбранную группу, далее получить список их email адресов, и отправить сообщение по нужному шаблону.
Пример функции, реализующей отправку писем по шаблону всем контактам определенной группы:

function SendMailToGroup()
{
var AddressList = [];
var Dataset = Services.GetNewItemByUSI('ds_ContactInGroup');
var GroupID = '{83696FAF-128C-4A45-B41D-56A03B50BB7C}';
ApplyDatasetFilter(Dataset, 'GroupID', GroupID, true);
Dataset.Open();
while(!Dataset.IsEOF)
{
         var ContactID = Dataset.Values('ContactID');
         GetMailAddressesByContactID(ContactID, AddressList, true);
         Dataset.GotoNext();
}
var TemplateID = '{ ABCFB655-A0AD-4BAB-BF83-417DE9357C34}';
var ID = Dataset.Values('ID');
Dataset.Close();
SendEmailByTemplate(TemplateID, {RecordID: ID, Address: AddressList,
                   AutoSend: true, Silent: true});
}

Вместо GroupID = '{83696FAF-128C-4A45-B41D-56A03B50BB7C}'; подставьте ID нужной Вам группы. Для того чтобы узнать ID, выполните запрос к БД:
1
Вместо var TemplateID = '{ABCFB655-A0AD-4BAB-BF83-417DE9357C34}' подставьте ID нужного Вам шаблона рассылки. Для того чтобы узнать ID нужного Вам шаблона рассылки выполните запрос к БД и скопируйте поле ID:
2

Далее, Вам просто необходимо вызвать созданную функцию в нужном Вам месте кода:

SendMailToGroup();

К примеру, её можно вызвать при нажатии на кнопку «Ок» карточки редактирования задачи. Также удостоверьтесь, что созданная функция находится в том же скрипте, с которого Вы её вызываете, а также что в этом скрипте подключен скрипт scr_MailUtils.

Приятной работы с Террасофт!

Нравится

Поделиться

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