Как сохранить форматирование HTML-письма при рассылке?
Иногда возникает ситуация, что при выполнении рассылки (шаблон в формате html) - конечный пользователь получает письмо с сплошным текстом, без единого форматирования (которое было выполнено в шаблоне сообщения).
Такая ситуация может происходить в версиях 3.3.1 и 3.3.2.
Для начала, необходимо обновить исполняемы файлы до самых поздних (сделав запрос в службу технической поддержки).
Далее, запускаем TSAdmin.exe и находим сервис scr_OutlookUtils.
В данном сервисе нам необходимо добавить метод CreateNewOutlookMessageByCopy:
var Message;
if (FileName) {
TemplateMessage = Outlook.Application.CreateItemFromTemplate(FileName);
RemoveOutlookMessageProperties(TemplateMessage);
Message = Outlook.Application.CreateItem(0);
RemoveOutlookMessageProperties(Message);
Message.Subject = TemplateMessage.Subject;
var NewMailItemBodyFormat = GetMailItemBodyFormat(Message);
var MessageText;
if ((NewMailItemBodyFormat == olFormatHTML) ||
(NewMailItemBodyFormat == olFormatRichText)) {
MessageText = GetDecodedMessageText(TemplateMessage);
if (GetMailItemBodyFormat(TemplateMessage) == olFormatPlain) {
MessageText = PreparePlainTextForHTML(MessageText, true);
}
if (GetOutlookCodePageOut() != -1) {
var CodePage = GetMailItemCharsetName(Message);
MessageText = System.EncodeText(MessageText, CodePage);
}
} else {
MessageText = TemplateMessage.Body;
}
CopyAttachments(TemplateMessage, Message, false, Log);
SetMailItemBody(Message, MessageText);
var Recipient;
var SourceRecipient;
for (var i = 1; i = TemplateMessage.Recipients.Count; i++) {
SourceRecipient = TemplateMessage.Recipients.Item(i);
Recipient = null;
if (SourceRecipient.AddressEntry.Type != 'EX') {
Recipient = Message.Recipients.Add(SourceRecipient.Address +
' ' + SourceRecipient.Name + '>');
} else {
Recipient = Message.Recipients.Add(SourceRecipient.Name);
Recipient.Resolve();
}
Recipient.Type = TemplateMessage.Recipients.Item(i).Type;
}
TemplateMessage.Close(0);
} else {
Message = Outlook.Application.CreateItem(0);
if (Outlook.CodePageOut) {
Message.InternetCodepage = Outlook.CodePageOut;
} else {
Message.InternetCodepage = 20866;
}
}
return Message;
}
В этом же сервисе модифицировать функцию GetOutlookCodePageOut (добавить return Outlook.CodePageOut;):
if (!Outlook.OutlookCodePageOutInitialize) {
var MSOfficeRootKey = 'Software\\Microsoft\\Office\\';
var OutlookCodePageOptionsKey = '\\Outlook\\Options\\MSHTML\\International';
var Version = GetOutlookVersion();
var OutlookSettingKey = MSOfficeRootKey + Version +
OutlookCodePageOptionsKey;
Outlook.AutoDetectCodePageOut = GetRegParamValue(REG_DWORD,
HKEY_CURRENT_USER, OutlookSettingKey, 'Autodetect_CodePageOut');
Outlook.CodePageOut = GetRegParamValue(REG_DWORD,
HKEY_CURRENT_USER, OutlookSettingKey, 'Default_CodePageOut')
|| 20866;
Outlook.OutlookCodePageOutInitialize = true;
}
return Outlook.CodePageOut;
}
А также, модифицировать метод CreateOutlookMessage
(добавить var Message = CreateNewOutlookMessageByCopy(Params.Template ?
Params.Template.FileName : null):
var Message = CreateNewOutlookMessageByCopy(Params.Template ?
Params.Template.FileName : null);
if (Params.Address) {
if (typeof(Params.Address) == 'string') {
Params.Address = [Params.Address];
} else {
Params.Address = RemoveDublicates(Params.Address);
}
for (var i = 0; i Params.Address.length; i++) {
AddRecipient(Message, Params.Address[i], olTo);
}
}
if (Params.CopyAddress) {
if (typeof(Params.CopyAddress) == 'string') {
Params.CopyAddress = [Params.CopyAddress];
}
for (var i = 0; i Params.CopyAddress.length; i++) {
AddRecipient(Message, Params.CopyAddress[i], olCC);
}
}
}
Для версии 3.3.1, необходимо выполнить еще одно изменение.
В сервисе scr_MailUtils найтифукцию CreateNewMessage(Params) и добавить ByCopy в строчке var Message = CreateNewOutlookMessage(Params.Template ? Params.Template.FileName : null);
:
if (!GetCanCreateMessage(true)) {
return;
}
if (!InitMailUtils()) {
return;
}
if (!Params) {
Params = new Object();
}
var Message = CreateNewOutlookMessageByCopy(Params.Template ?
Params.Template.FileName : null);
Сохраняем сервис и проверяем рассылку!
С уважением
Белецкий Арсений
Группа компаний Terrasoft
Добрый день.
Такая ситуация так же может происходить и в версии 3.3.0 :) Но в ней я не нашел ни скрипта scr_OutlookUtils ни функций GetOutlookCodePageOut, CreateOutlookMessage.
Не подскажите, что можно сделать в данном случае?
Павел, дело в том, что данный функционал был реализован в ядре, а не в сервисах, именно поэтому Вы и не смогли найти данных скриптов :wink:
Если шаблон письма формируется некорректно, прошу обновить исполняемые файлы до более поздних.
На данный момент, это 3.3.0.83.
Данные файлы Вы можете запросить у Службы технической поддержки support@terrasoft.ru
С уважением
Белецкий Арсений
Группа компаний Terrasoft
Дело в том, что мы уже используем версию 3.3.0.83 :sad:
Добрый день!
Прошу предоставить скриншот шаблона, который Вы формируете и скриншот уже полученного письма.
С уважением
Белецкий Арсений
Группа компаний Terrasoft
Причем было замечено, что письма из TS уходят без форматирования только на одной машине, на других все ок. Windows 7 x32, MS Outlook 2010 x32
Павел, а Вы проверяли настройки самого Outlook?
Возможно формат принимаемых и отправляемых писем стоит - текст, а не в html?
Если данная проблема только на одной рабочей машине, то логично предположит, что проблема именно в настройках Office.
Формат отправляемых писем уже установлен в html. Возможно, есть еще какие-нибудь настройки?
Нужно проверить, что бы и шаблон был создан в формате html.
сделал данные настройки но при этом картинки приходят вложениями(( не подскажите что можно сделать? и какую информацию нужно показать?