powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
17 сообщений из 17, страница 1 из 1
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39478208
Фотография Аленочка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго всем.

Возникла проблема с неверной кодировкой файлов аттачей при отправке их по 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

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

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
	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?

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

Аленочка тм
...
Рейтинг: 0 / 0
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39478309
eduard93
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аленочка, что выдаёт:
Код: sql
1.
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. Перезапустить сервер
...
Рейтинг: 0 / 0
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39478340
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аленочка,

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

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

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

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

P.S. В правильно настроенной Linux-системе предложенный Эдуардом вызов непременно выдаст крякозябры из-за лишней перекодировки в UTF-8. Правильно так:
Код: javascript
1.
u $p:(:"K\RAW\") d ##class(%File).FileSetFunc("/vol/home/alex").%Display()
...
Рейтинг: 0 / 0
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39478348
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslov...В правильно настроенной Linux-системе предложенный Эдуардом вызов непременно выдаст крякозябры из-за лишней перекодировки в UTF-8...Виноват, впал в субъективизм. Сказанное зависит от используемой локали, а у меня она несколько отличается от дефолтной RUW8. Но лишний раз выставить K\RAW\ в данном случае не повредит :)
...
Рейтинг: 0 / 0
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39478365
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslov,

Я не очень глубоко в это все лез, но вроде бы есть кодировка имен файлов, кодировка контента и кодировки аттачей (каждого) тоже есть.
...
Рейтинг: 0 / 0
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39478385
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аленочка,

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


Ну и знать, соответственно, что же в этих заголовках должно быть. В Каше не все заголовки выведены как свойства.
...
Рейтинг: 0 / 0
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39478400
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, не всё в Cache выведено как свойства. Например, корректный заголовок письма с вложенным файлом с кириллическим именем выглядит так (отправлено не из Cache):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
--------------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*, сейчас не скажу. Возможно, для некоторых почтовых клиентов критично.

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

Кстати, кое-что можно почерпнуть из этой статьи .
...
Рейтинг: 0 / 0
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39479393
Фотография Аленочка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey MaslovПочта должна доставить имя файла в его оригинальной кодировке (UTF-8) и скорее всего делает это правильно. Вы можете убедиться в этом, используя какой-нибудь кросс-платформенный почтовый клиент, например, Zimbra, либо приняв его его с помощью Cache (%Net.POP3), либо раскодировав "ручками" заголовок принятого письма (большинство почтовых клиентов позволяют его увидеть).

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

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

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

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

Кириллические имена файлов - это требования бизнеса, отказаться от них нельзя.
...
Рейтинг: 0 / 0
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39479395
Фотография Аленочка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.Аленочка,

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


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

Попробовала, что-то ничего у меня не получилось, кроме того что удалось изменить Content-Type (значок вложения вместо синего стал зеленым ))))
...
Рейтинг: 0 / 0
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39479422
Фотография Аленочка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовала еще вариант через %FileBinaryStream.
Идея была отрыть файл в потоке, скопировать поток с новым именем и отправить по почте.
Наименование вложения получаю в нужной кодировке, но содержимое файлов пустое.

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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

...
Рейтинг: 0 / 0
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39479518
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аленочка,

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

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

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

s currStream=##class(%FileBinaryStream).%New()
s sc=currStream.LinkToFile(Filename)
...
Рейтинг: 0 / 0
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39479572
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аленочка, рада эксперимента отправил сам себе файл с кириллическим именем из Cache 2015.1 for Linux /8bit.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
----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, отключить автоматическое кодирование заголовка
Код: javascript
1.
 set s.AllowHeaderEncoding=0

и кодиовать самостоятельно. Все необходимые функции в Cache для этого есть; мне когда-то приходилось делать нечто подобное для отправки писем из Cache 4.1, в которой класс %Net.SMTP был ещё в зачаточном состоянии.
...
Рейтинг: 0 / 0
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39479612
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslov...причина в том, что вы попросту создали пустой поток этими командами:

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

Кстати, в какой кодировке у вас читаются имена файлов при просмотре каталога средствами Cache?
zzdump name ; - проверяли?
У меня они в UTF-8, что правильно: именно так и кодируются имена файлов в Linux, хоть и это и не совсем удобно в рамках Cache/8bit.
...
Рейтинг: 0 / 0
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39483486
Фотография Аленочка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыла отписаться как удалось решить, возможно кому-то пригодится.
У сообщения %Net.MailMessage выставляем параметр s m.IsMultiPart = 1 и формируем для него столько частей %Net.MailMessagePart, сколько у нас вложений. Далее делаем почти все то же самое что делает метод AttachFile (содержимое взято оттуда) с небольшим, но важным изменением вот в этом месте: s attach.FileName = $ZCVT(filename, "I", "UTF8"). Только таким образом удалось решить.

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
        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)
		}	
	}

...
Рейтинг: 0 / 0
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39483959
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аленочка,

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

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

В 8-битной же локализации (RUW8) по какой-то причине таблица по умолчанию для файлов - RAW. Такое впечатление, что разработчики ИнтерСистемз считают, что если некоторая кодовая таблица является "центральной" в локализации Cache (в данном случае, CP1251), то локализация ОС должна быть основана на той же таблице, т.е. в случае Linux - ru_RU.CP1251. Однако такое встретишь нечасто, стандарт де-факто - ru_RU.UTF8.
...
Рейтинг: 0 / 0
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39484195
Фотография Аленочка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пожалуйста) да вот такие особенности, которые усложняют жизнь разработчикам)
...
Рейтинг: 0 / 0
Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
    #39484440
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslovи спасибо, что отписались.Вот это, кстати, да.
А то некоторые напишут пост и пропадают. И непонятно, нашли они решение сами, или им помогли советы, или они вообще это все не читают :-)
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Cache for UNIX и проблемы с кодировкой файлов при отправке по e-mail (Unix vs Windows)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]