Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché Новый топик    Ответить
 Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
Аленочка
Member

Откуда: Владик
Сообщений: 2147
Доброго всем.

Возникла проблема с неверной кодировкой файлов аттачей при отправке их по e-amil. Аттачи хранятся в виде файлов csv на сервере.

ПО сервера:
Операционная система: Linux version 3.12.48-52.27-default (geeko@buildhost) (gcc version 4.8.5 (SUSE Linux) ) #1 SMP Mon Oct 5 10:08:10 UTC 2015 (314f0e3)
Версия Cache: Cache for UNIX (SUSE Linux Enterprise Server for x86-64) 2015.1.2 (Build 607_2) Tue Aug 11 2015 15:24:03 EDT

+
Сообщение со списком аттачей формирую следующим образом:

	s m = ##class(%Net.MailMessage).%New()
	s m.From = from
	d m.To.Insert(to)
	s m.Subject = subject
	s status = m.TextData.Write(text)	
	if $$$ISNOTNULL(attachList){
		for i=1:1:$LL(attachList) {
			s iattach = $LG(attachList,i)
			s filename = ##class(%File).GetFilename(iattach)
			s directory = ##class(%File).GetDirectory(iattach)
			s sc = m.AttachFile(directory,filename,1)
			q:'$$$ISOK(sc)
		}
	}

В результате выполнения кода выше, получаю письма с нужными количеством вложений, но в неверной кодировке в наименовании аттача (см.рисунок). Там где закодировано - хотелось бы получить русские буквы, вместо "кракозябров". При этом, содержимое самого файла получаю корректное, в нужной мне кодировке.

При запуске программы из Студии в режиме отладки в переменной iattach и списке attachList отображаются перекодированные русские символы, именно так и не иначе я могу получить доступ к файлам и добавить их к письму. Пользователи же работают с почтой в ОС Windows и там аттачи должны отображаться по-русски (перекодированные).

Может у кого-то была схожая проблема - как удалось решить?
Или придется "извратиться", н-р, через класс %FileBinaryStream и метод AttachStream класса %Net.MailMessage?

-----------------------------------------------
А мы тут плюшками балуемся...

Аленочка тм

К сообщению приложен файл. Размер - 19Kb
27 июн 17, 10:06    [20592912]     Ответить | Цитировать Сообщить модератору
 Re: Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
eduard93
Member

Откуда:
Сообщений: 129
Аленочка, что выдаёт:
do ##class(%File).FileSetFunc(dir).%Display()

для любой папки с файлами аттачей? Если в имени файла неверная кодировка, то скорее всего где-то не хватает локализации, вот основные шаги по локализации сервеа и Caché:
1. Изменить локализацию сервера если она не ru_RU.UTF-8
2. Изменить локализацию Caché если она не rus(w)
3. ^NLS -> Select defaults -> I/O tables -> System call -> Выбрать UTF8 -> Сохранить
4. Перезапустить сервер
27 июн 17, 11:36    [20593315]     Ответить | Цитировать Сообщить модератору
 Re: Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1417
Аленочка,

кодировка имён файлов - больная тема для всех, кто работает в гетерогенных средах. Как вы, конечно, знаете, в Linux используется кодировка UTF-8, в Windows - всяко бывает :), но некоторые почтовые клиенты действительно ожидают CP-1251.

Почта должна доставить имя файла в его оригинальной кодировке (UTF-8) и скорее всего делает это правильно. Вы можете убедиться в этом, используя какой-нибудь кросс-платформенный почтовый клиент, например, Zimbra, либо приняв его его с помощью Cache (%Net.POP3), либо раскодировав "ручками" заголовок принятого письма (большинство почтовых клиентов позволяют его увидеть).

Можно попробовать задать m.Charset="CP-1251", но не уверен, что это поможет.

Лучшее решение - совсем отказаться от кириллических имён файлов.

P.S. В правильно настроенной Linux-системе предложенный Эдуардом вызов непременно выдаст крякозябры из-за лишней перекодировки в UTF-8. Правильно так:
u $p:(:"K\RAW\") d ##class(%File).FileSetFunc("/vol/home/alex").%Display()
27 июн 17, 11:59    [20593447]     Ответить | Цитировать Сообщить модератору
 Re: Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1417
Alexey Maslov
...В правильно настроенной Linux-системе предложенный Эдуардом вызов непременно выдаст крякозябры из-за лишней перекодировки в UTF-8...
Виноват, впал в субъективизм. Сказанное зависит от используемой локали, а у меня она несколько отличается от дефолтной RUW8. Но лишний раз выставить K\RAW\ в данном случае не повредит :)
27 июн 17, 12:06    [20593481]     Ответить | Цитировать Сообщить модератору
 Re: Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3531
Alexey Maslov,

Я не очень глубоко в это все лез, но вроде бы есть кодировка имен файлов, кодировка контента и кодировки аттачей (каждого) тоже есть.
27 июн 17, 12:25    [20593544]     Ответить | Цитировать Сообщить модератору
 Re: Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3531
Аленочка,

У меня в свое время были проблемы с нестандартной оправкой писем.
Если лень читать все, то вам нужно пользоваться
m.Headers.SetAt(..)
m.Parts.Headers.SetAt(..)

Ну и знать, соответственно, что же в этих заголовках должно быть. В Каше не все заголовки выведены как свойства.
27 июн 17, 12:41    [20593626]     Ответить | Цитировать Сообщить модератору
 Re: Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1417
Да, не всё в Cache выведено как свойства. Например, корректный заголовок письма с вложенным файлом с кириллическим именем выглядит так (отправлено не из Cache):
--------------983C235995597249C6590230
Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document;
name="=?UTF-8?B?0KDQtdCz0LvQsNC80LXQvdGCICjQl9Cw0L/RgNC+0YHRiyDQvdCwINCg?=
=?UTF-8?B?0LDQt9GA0LDQsdC+0YLQutGDKS5kb2N4?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename*0*=utf-8''%D0%A0%D0%B5%D0%B3%D0%BB%D0%B0%D0%BC%D0%B5%D0%BD%D1%82;
filename*1*=%20%28%D0%97%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D1%8B%20%D0%BD%D0;
filename*2*=%B0%20%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA;
filename*3*=%D1%83%29%2E%64%6F%63%78

Насколько критично наличие полей filename*n*, сейчас не скажу. Возможно, для некоторых почтовых клиентов критично.

Поэтому и посоветовал Алёночке посмотреть заголовки писем в почтовом клиенте, "внушающем доверия". Возможно, придётся добавлять дополнительные поля.

Кстати, кое-что можно почерпнуть из этой статьи.
27 июн 17, 12:57    [20593674]     Ответить | Цитировать Сообщить модератору
 Re: Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
Аленочка
Member

Откуда: Владик
Сообщений: 2147
Alexey Maslov
Почта должна доставить имя файла в его оригинальной кодировке (UTF-8) и скорее всего делает это правильно. Вы можете убедиться в этом, используя какой-нибудь кросс-платформенный почтовый клиент, например, Zimbra, либо приняв его его с помощью Cache (%Net.POP3), либо раскодировав "ручками" заголовок принятого письма (большинство почтовых клиентов позволяют его увидеть).

Используем как раз Zimbra )))

Alexey Maslov
Можно попробовать задать m.Charset="CP-1251", но не уверен, что это поможет.

Правильно вроде UTF-8 или CP1251. Пробовала уже и m.Charset выставлять и добавлять параметром в AttachFile - никак не влияет.

Alexey Maslov
Лучшее решение - совсем отказаться от кириллических имён файлов.

Кириллические имена файлов - это требования бизнеса, отказаться от них нельзя.
29 июн 17, 02:47    [20598379]     Ответить | Цитировать Сообщить модератору
 Re: Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
Аленочка
Member

Откуда: Владик
Сообщений: 2147
Блок А.Н.
Аленочка,

У меня в свое время были проблемы с нестандартной оправкой писем.
Если лень читать все, то вам нужно пользоваться
m.Headers.SetAt(..)
m.Parts.Headers.SetAt(..)

Ну и знать, соответственно, что же в этих заголовках должно быть. В Каше не все заголовки выведены как свойства.


Попробовала, что-то ничего у меня не получилось, кроме того что удалось изменить Content-Type (значок вложения вместо синего стал зеленым ))))
29 июн 17, 03:31    [20598383]     Ответить | Цитировать Сообщить модератору
 Re: Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
Аленочка
Member

Откуда: Владик
Сообщений: 2147
Попробовала еще вариант через %FileBinaryStream.
Идея была отрыть файл в потоке, скопировать поток с новым именем и отправить по почте.
Наименование вложения получаю в нужной кодировке, но содержимое файлов пустое.

+
s m = ##class(%Net.MailMessage).%New()
s m.From = from
d m.To.Insert(to)
s m.Subject = subject
d m.TextData.Write(text)
	
	if $$$ISNOTNULL(attachList){
		for i=1:1:$LL(attachList) {
			s iattach = $LG(attachList,i)
			s filename = ##class(%File).GetFilename(iattach)
			s filenameUTF8 = $ZCVT(filename, "O", "UTF8")
			
			s currStream=##class(%FileBinaryStream).%New()
			s currStream.Filename=iattach
			s sc = m.AttachStream(currStream,filename,1)
			q:'$$$ISOK(sc)
			
                        s stream = ##class(%FileBinaryStream).%New()
			d stream.CopyFrom(currStream)
	  		s sc = m.AttachStream(stream,filenameUTF8,1)
			q:'$$$ISOK(sc)
		}
	}
	
s status=s.Send(m)
q status


К сообщению приложен файл. Размер - 31Kb
29 июн 17, 07:49    [20598440]     Ответить | Цитировать Сообщить модератору
 Re: Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1417
Аленочка,

У вас оба вложения пустые, исходное тоже. Думаю, причина в том, что вы попросту создали пустой поток этими командами:

s currStream=##class(%FileBinaryStream).%New()
s currStream.Filename=iattach

Сопоставить поток с существующим файлом, ЕМНИП, можно так:

s currStream=##class(%FileBinaryStream).%New()
s sc=currStream.LinkToFile(Filename)
29 июн 17, 10:52    [20598865]     Ответить | Цитировать Сообщить модератору
 Re: Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1417
Аленочка, рада эксперимента отправил сам себе файл с кириллическим именем из Cache 2015.1 for Linux /8bit.

Вложение пришло в таком виде (смотрим исходник!):

----Boundary5564.1764705882352945174.941176470588235--
Content-Type: application/octet-stream; name="=?windows-1251?B?0LDQsdCy?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="=?windows-1251?B?0LDQsdCy?="

0L/RgNC40LLQtdGCCtGC0LXQsdC1CtC00YDRg9Cz
----Boundary5564.1764705882352945174.941176470588235----

Как видим, имя файла закодировано в соответствие с RFC 2047. Windows-кодировка выбрана, очевидно, исходя из текущей локализации Cache. Всё вроде бы нормально, и Thunderbird правильно показал имя вложения. А вот Zimbra с задачей не справилась, и ровно как у вас, показала крякозябры.

Возможный выход из положения: предварительно разобравшись, какие форматы кодирования имён понимает Zimbra, отключить автоматическое кодирование заголовка
 set s.AllowHeaderEncoding=0
и кодиовать самостоятельно. Все необходимые функции в Cache для этого есть; мне когда-то приходилось делать нечто подобное для отправки писем из Cache 4.1, в которой класс %Net.SMTP был ещё в зачаточном состоянии.
29 июн 17, 11:55    [20599138]     Ответить | Цитировать Сообщить модератору
 Re: Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1417
Alexey Maslov
...причина в том, что вы попросту создали пустой поток этими командами:

s currStream=##class(%FileBinaryStream).%New()
s currStream.Filename=iattach
погорячился, конечно, так тоже можно; значит, файл оказался пустым по какой-то другой причине.

Кстати, в какой кодировке у вас читаются имена файлов при просмотре каталога средствами Cache?
zzdump name ; - проверяли?
У меня они в UTF-8, что правильно: именно так и кодируются имена файлов в Linux, хоть и это и не совсем удобно в рамках Cache/8bit.
29 июн 17, 12:47    [20599316]     Ответить | Цитировать Сообщить модератору
 Re: Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
Аленочка
Member

Откуда: Владик
Сообщений: 2147
Забыла отписаться как удалось решить, возможно кому-то пригодится.
У сообщения %Net.MailMessage выставляем параметр s m.IsMultiPart = 1 и формируем для него столько частей %Net.MailMessagePart, сколько у нас вложений. Далее делаем почти все то же самое что делает метод AttachFile (содержимое взято оттуда) с небольшим, но важным изменением вот в этом месте: s attach.FileName = $ZCVT(filename, "I", "UTF8"). Только таким образом удалось решить.

+
        s m = ##class(%Net.MailMessage).%New()
	s m.From = from
	d m.To.Insert(to)
	s m.Subject = subject
	s status = m.TextData.Write(text)
	
	if $$$ISNOTNULL(attachList){
	 	s m.IsMultiPart = 1
		for i=1:1:$LL(attachList) {
			s iattach = $LG(attachList,i)
			s filename = ##class(%File).GetFilename(iattach)
			s directory = ##class(%File).GetDirectory(iattach)
			s attach = ##class(%Net.MailMessagePart).%New()
			s attach.IsBinary = 1
			s stream = attach.BinaryData
			s sc = stream.LinkToFile(directory_filename)
			q:'sc
			if (stream.AtEnd) {
				s sc = "CANNOT_OPEN_FILE"
				q
			}
			s count = m.Parts.Count()+1
 			s attach.Dir = directory
 			s attach.FileName = $ZCVT(filename, "I", "UTF8")
 			s sc = m.Parts.SetAt(attach, count)
			q:'$$$ISOK(sc)
		}	
	}
6 июл 17, 04:55    [20617596]     Ответить | Цитировать Сообщить модератору
 Re: Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1417
Аленочка,

рад, что нашли достаточно изящное решение, и спасибо, что отписались.

Кстати, в Cache Unicode ошибка не возникла бы, т.к. в локализации (RUSW) таблица по умолчанию для файлов - UTF8.

В 8-битной же локализации (RUW8) по какой-то причине таблица по умолчанию для файлов - RAW. Такое впечатление, что разработчики ИнтерСистемз считают, что если некоторая кодовая таблица является "центральной" в локализации Cache (в данном случае, CP1251), то локализация ОС должна быть основана на той же таблице, т.е. в случае Linux - ru_RU.CP1251. Однако такое встретишь нечасто, стандарт де-факто - ru_RU.UTF8.
6 июл 17, 16:30    [20619822]     Ответить | Цитировать Сообщить модератору
 Re: Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
Аленочка
Member

Откуда: Владик
Сообщений: 2147
Пожалуйста) да вот такие особенности, которые усложняют жизнь разработчикам)
7 июл 17, 07:56    [20621376]     Ответить | Цитировать Сообщить модератору
 Re: Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3531
Alexey Maslov
и спасибо, что отписались.
Вот это, кстати, да.
А то некоторые напишут пост и пропадают. И непонятно, нашли они решение сами, или им помогли советы, или они вообще это все не читают :-)
7 июл 17, 12:47    [20622690]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché Ответить