powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / CDO + Русский язык
16 сообщений из 16, страница 1 из 1
CDO + Русский язык
    #38708655
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно код, написан лет 5 назад:
Код: vbnet
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
Option Explicit

Private Sub Command1_Click()
  SendTestMailCDO
End Sub

Private Sub SendTestMailCDO()
  Const email_To As String = "recipient@gmail.com"
  Const email_From As String = "myname@myserver.com"
  Const smtp_Server As String = "myserver.com"
  Const smtp_Username As String = "myname+myserver.com"
  Const smtp_Password As String = "password"

  Dim o_Mess As CDO.Message 'As Object
  Dim v_Conf As String
  
  '-------------------------------
  'composing message with CDO
  On Error GoTo ErrOfSend
  Set o_Mess = CreateObject("CDO.Message")
  v_Conf = "http://schemas.microsoft.com/cdo/configuration/"
  With o_Mess
    .To = email_To
    .From = email_From
    .Subject = "Тема письма на Русском!!!"
    .TextBody = "Текст письма на Русском! Привет!"
    '.AddAttachment Trim(TextAttach.Text)
    With .Configuration.Fields
      .Item(v_Conf & "sendusing") = 2
      .Item(v_Conf & "smtpserver") = smtp_Server
      .Item(v_Conf & "smtpauthenticate") = 1 '1-использовать
      '.Item(v_Conf & "smtpauthenticate") = 0 '0-без
      .Item(v_Conf & "sendusername") = smtp_Username
      .Item(v_Conf & "sendpassword") = smtp_Password
      .Item(v_Conf & "smtpserverport") = "25"
      '.Item(v_Conf & "smtpusessl") = True 'использовать SSL
      .Item(v_Conf & "smtpusessl") = False
      .Item(v_Conf & "smtpconnectiontimeout") = 60 'пока считаем что 60, потом м.б. добавим параметр
      .Update
    End With
    .Send
  End With
  MsgBox "Пробное сообщение на адрес " & o_Mess.To & " было успешно отправлено!", vbInformation + vbOKOnly, "Email отправлен"
  Exit Sub
ErrOfSend:
  MsgBox "Отправка письма завершилась неудачей." & vbCrLf & "Код ошибки: " & Err.Number & vbCrLf & Err.Description, _
   vbCritical + vbOKOnly, "Отправка email не удалась."
End Sub


Код изначально испытывался на русском XP.
С XP Письмо приходит с русским текстом в кодировке Кириллица KOI8-R

Я полагал что все нормально. Оказалось НЕТ.
Испытал этот тест сейчас на двух 8.1, Win 7, Vista.
Письмо приходит со знаками вопроса вместо русского текста, кодировке указана та же: Кириллица KOI8-R
Все тестовые 8/7/Vista английские либо мультиязычные (ну, "чисто русской" кажется может быть только виста, на лицензионном ноуте с Win 8.1 выбран русский, но он именно "выбирался").
Но везде выставлена настройка:
Current language for non-Unicode programs: Russian(Russia)
Вообще я считал что этого достаточно, и для всяких менюшек и надписей на кнопках этого действительно достаточно.
А здесь таки-фигня.

Как универсально вылечить? (Ну естественно Current language for non-Unicode programs: Russian(Russia) принимаем за аксиому).

Никаких CDO-библиотек естественно за собой не таскаю.
В продакшн-варианте код идет c Dim o_Mess As Object / CreateObject("CDO.Message")
и никаких сбоев на каких-либо системах по самой отправке писем не выявлено.
...
Рейтинг: 0 / 0
CDO + Русский язык
    #38708662
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался. Кодировку надо явно задавать. Ну вроде вот эти общеупотребительные для RUS.
Код: vbnet
1.
2.
3.
4.
5.
6.
    'либо
    o_Mess.TextBodyPart.Charset = "windows-1251"
    'либо
    o_Mess.TextBodyPart.Charset = "koi8-r"
    'либо
    o_Mess.TextBodyPart.Charset = "utf-8"



По хорошему видимо делать в программе опцию с возможностью выбора.
Странно, что на русском XP по дефолту работало, что так жестоко обманулся.
...
Рейтинг: 0 / 0
CDO + Русский язык
    #38709130
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты бы еще cp866 приписал.
koi8-r можно назвать ископаемым, все еще никак не могущим испустить дух, но никак не общеупотребительным. даже win-1251 уже не торт.
...
Рейтинг: 0 / 0
CDO + Русский язык
    #38709266
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyты бы еще cp866 приписал..
Насчет cp866 что-то не уверен.
Но глядючи в настройки и что предлагает Outlook Express 6, я бы приписал еще:
iso-8859-5 'кириллица ISO
koi8-u
utf-7
(если уж делать опцию выбора кодировки)

Antonariykoi8-r можно назвать ископаемым, все еще никак не могущим испустить дух, но никак не общеупотребительным. даже win-1251 уже не торт.
Странно. У меня в OE6 по дефолту стоит как раз koi8-r

Хорошо, что ты предлагаешь?
Если кодировку вообще не указывать (исходный код в первом топике),
то со всех OS начиная с висты письма уходят без указания кодировки - с "вопросиками" вместо русского текста.
С русского XP письма по дефолту уходят в koi8-r (через CDO), я проверил, поэтому проблемы не возникает.

Я предлагаю добавить настраиваемое поле "кодировка" с дефолтом win-1251 и засунуть в комбобокс все 6 вариантов.
Геморой, да. Придется исправлять код в нескольких местах программы.

Что предлагаешь ты?
Жеско зашить utf-8?

Поясню. Программа отправляет "технические" e-mail-ы.
В русской версии есть опция-галка:
"Отправлять сообщения e-mail на русском" (именно на русском, а не на каком-либо,по дефолту EN с которым проблем нет)
С этой опцией прога вставляет в e-mail русский текст (комментарии, названия параметров и т.п.).
...
Рейтинг: 0 / 0
CDO + Русский язык
    #38709300
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Насчет cp866 что-то не уверен.Это я шучу так.
Дмитрий77Странно. У меня в OE6 по дефолту стоит как раз koi8-rОн из какой винды?
Дмитрий77Что предлагаешь ты?
Жеско зашить utf-8?Да, если нет требования экономить на спичках траффике. У твоего текста больше вероятность нарваться на софт, не понимающий koi, чем utf.
...
Рейтинг: 0 / 0
CDO + Русский язык
    #38709326
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyДмитрий77Странно. У меня в OE6 по дефолту стоит как раз koi8-rОн из какой винды?.
XP естественно.
AntonariyДмитрий77Что предлагаешь ты?
Жеско зашить utf-8?Да, если нет требования экономить на спичках траффике. У твоего текста больше вероятность нарваться на софт, не понимающий koi, чем utf.
Если я зашью utf-8 совсем жестко,
т.е. и для "чисто английских e-mail", хуже не сделаю?

Просто возиться с настраевымыми опциями для "русской версии" честно желания нет.
Но покорябать английскую версию (которую используют 95% пользователей) где итак работает желание еще меньше.

Т.е. интересует, при указании utf-8 и использовании чисто английского текста,
при проблемах на клиенте с utf-8,
английcкий текст будет читаться все равно корректно?
...
Рейтинг: 0 / 0
CDO + Русский язык
    #38709600
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Если я зашью utf-8 совсем жестко,
т.е. и для "чисто английских e-mail", хуже не сделаю?
Ну фиг с ним. Пусть будет Юникод utf-8.
Для чисто английского текста хуже не сделает, похоже он при "чисто английском" =?utf-8? вообще не пишет.
Для русского похоже "универсально сойдет".

Но я тут нашел другой весьма противный баг.
Дмитрий77Разобрался. Кодировку надо явно задавать. ....
Код: vbnet
1.
    o_Mess.TextBodyPart.Charset = "utf-8"



Этого недостаточно.
Фрагмент кода (с реально добавленным) .Attachment
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  Set o_Mess = CreateObject("CDO.Message")
  v_Conf = "http://schemas.microsoft.com/cdo/configuration/"
  With o_Mess
    .To = email_To
    .From = email_From
    .Subject = "Тема письма на Русском!!!"
    .TextBody = "Текст письма на Русском! Привет!"
    If Len(Trim(TextAttach.Text)) > 0 Then _
    .AddAttachment Trim(TextAttach.Text)
    .TextBodyPart.Charset = "utf-8"
    With .Configuration.Fields
...


будет глючить на Vista-8.1 в части .Subject.
Кодировка utf-8 не добавится для .Subject и там будут вопросики.
Я долго не мог понять (тест то делал без вложений, а в production большинство e-mail с вложениями), но лечится любым из 2-х способов

1. Добавлением такого кода в самом начале, т.е.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
  With o_Mess
    '===(В-1)код необходим для добавления utf-8 в Subject(если .AddAttachment стоит до .TextBodyPart.Charset)===
    Dim o_BodyPart As Object 'CDO.IBodyPart
    Set o_BodyPart = .BodyPart
    o_BodyPart.Charset = "utf-8"
    '===(В-1)код необходим для добавления utf-8 в Subject(если .AddAttachment стоит до .TextBodyPart.Charset)===

    .To = email_To



2. Либо .TextBodyPart.Charset = "utf-8" должно быть ДО .AddAttachment
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
    .Subject = "Тема письма на Русском!!!"
    .TextBody = "Текст письма на Русском! Привет!"
    '===(В-2)для добавления utf-8 в Subject эта строчка должна стоять до .AddAttachment===
    .TextBodyPart.Charset = "utf-8"
    '===(В-2)для добавления utf-8 в Subject эта строчка должна стоять до .AddAttachment===
    If Len(Trim(TextAttach.Text)) > 0 Then _
     .AddAttachment Trim(TextAttach.Text)



Береженого бог бережет, поэтому добавил оба "фикса":
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  'composing message with CDO
  On Error GoTo ErrOfSend
  Set o_Mess = CreateObject("CDO.Message")
  v_Conf = "http://schemas.microsoft.com/cdo/configuration/"
  With o_Mess
    '===(В-1)код необходим для добавления utf-8 в Subject(если .AddAttachment стоит до .TextBodyPart.Charset)===
    Dim o_BodyPart As Object 'CDO.IBodyPart
    Set o_BodyPart = .BodyPart
    o_BodyPart.Charset = "utf-8"
    '===(В-1)код необходим для добавления utf-8 в Subject(если .AddAttachment стоит до .TextBodyPart.Charset)===

    .To = email_To
    .From = email_From
    .Subject = "Тема письма на Русском!!!"
    .TextBody = "Текст письма на Русском! Привет!"
    '===(В-2)для добавления utf-8 в Subject эта строчка должна стоять до .AddAttachment===
    .TextBodyPart.Charset = "utf-8"
    '===(В-2)для добавления utf-8 в Subject эта строчка должна стоять до .AddAttachment===
     If Len(Trim(TextAttach.Text)) > 0 Then _
     .AddAttachment Trim(TextAttach.Text)
    With .Configuration.Fields
...
...
Рейтинг: 0 / 0
CDO + Русский язык
    #38709656
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Для чисто английского текста хуже не сделаеткоды символов английского языка одинаковы в большинстве кодировок, можно не париться.
Дмитрий77Береженого бог бережет, поэтому добавил оба "фикса":это правильно, т.к. у subject кодировка отдельно от body. уже не помню, как я это делал в cdo, но в дотнете просто есть отдельно свойство для кодировки сабжекта.
...
Рейтинг: 0 / 0
CDO + Русский язык
    #38711280
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какое максимальное количество писем можно отправить в сутки таким способом ?
...
Рейтинг: 0 / 0
CDO + Русский язык
    #38711307
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159Какое максимальное количество писем можно отправить в сутки таким способом ?
В смысле?
И какое отношение вопрос имеет к коду?
Если SMTP у провайдера, он обычно ограничивает, чтоб спам не слали.
Мой провайдер например разрешает не более 300 в час.
...
Рейтинг: 0 / 0
CDO + Русский язык
    #38711613
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой провайдер если не секрет ? Ищу надежный, не дорогой и не жадный к рассылкам. Есть заказ на рассылку, чтоб было выгодней по цене чем в Responder, по количеству нагрузки не будет (просто с запасом)
...
Рейтинг: 0 / 0
CDO + Русский язык
    #38711640
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159Какой провайдер если не секрет ?
Андрей159, не обижайся но не буду отвечать.
Я думаю пару-тройку сотен в час много кто позволит.

Могу добавить лишь то, что я не использую CDO для рассылки, свою рассылку делаю крайне редко для клиентов, ручками на несколько тысяч адресов, создаю в Outlook Express 6.0 письмо с полем CC на ~250 адресов, через час на другие 250. Долго, да. При этом еще анализирую (ручками) ответы серверов и вычищаю мертвые e-mail. Зато качественно.

CDO не использую потому что 1) люблю чтоб копия оставалась в "Отправленные" 2) неохота думать как через CDO вставлять всякие html, таблицы, картинки и т.д.

CDO я использую исключительно в своей программе, но она отправляет e-mail-ы по делу и рассылкой спама не занимается.
...
Рейтинг: 0 / 0
CDO + Русский язык
    #38711687
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77создаю в Outlook Express 6.0 письмо с полем CC на ~250 адресов...
BCC (скрытая копия) конечно, а не CC,
какой-нормальный человек будет адреса друг другу светить
...
Рейтинг: 0 / 0
CDO + Русский язык
    #38711704
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не загорался особым желанием, спросил от фонаря, интересно, обижаться нет причин. Все гуд. Кроме много-тисячной отправки еще и в ч.с. легко попасть, так что этот вопрос бы так просто не решился. А Responder имеет свою команду, в случай чего звонят и все снова работает.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
CDO + Русский язык
    #39147870
Bombat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищи, подскажите, будет ли работать данный метод отправки писем если у рабочей станции нет доступа к инету? Т.е. локальный smtp-сервер есть, а подключение к инету отсутствует.
...
Рейтинг: 0 / 0
CDO + Русский язык
    #39151115
Bombat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблему решил. Работать будет.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / CDO + Русский язык
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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