Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как послать e-mail с русским текстом. [D7, WinXP]


Inna_Z ©   (2007-06-01 12:29:00) 

Пробовала посылать при помощи стандартных компонент
 TIdSMTP, TIdMessage но возникли проблемы с кодировкой.

 Кто знает какие-то хорошие компоненты
 или расскажите как можно затставить правильно работать эти?

  P.S. Отправленную почту получала аутлуком


TStas   (2007-06-01 20:46:00) [1]

Вот этот рабочий код, взятый откуда-то с форума:
uses Mapi, IniFiles, CommonUnit, TuneUnit, MsgFormUnit, HDDInfo;
const
 FileName = 'MailAddresses.dat';
 Section = 'Main';
 Value = 'ItemIndex';
 TextFileName = 'Распечатка.txt';

function SendEMail(Handle: THandle; Mail: TStrings): Cardinal;
type
TAttachAccessArray = array [0..0] of TMapiFileDesc;
PAttachAccessArray = ^TAttachAccessArray;
var
MapiMessage: TMapiMessage;
Receip: TMapiRecipDesc;
Attachments: PAttachAccessArray;
AttachCount: Integer;
i1: integer;
FileName: string;
dwRet: Cardinal;
MAPI_Session: Cardinal;
WndList: Pointer;
begin
dwRet := MapiLogon(Handle,
  PChar(''),
  PChar(''),
  MAPI_LOGON_UI or MAPI_NEW_SESSION,
  0, @MAPI_Session);

if (dwRet <> SUCCESS_SUCCESS) then
begin
  MessageBox(Handle,
    PChar('Error while trying to send email'),
    PChar('Error'),
    MB_ICONERROR or MB_OK);
end
else
begin
  FillChar(MapiMessage, SizeOf(MapiMessage), #0);
  Attachments := nil;
  FillChar(Receip, SizeOf(Receip), #0);

  if Mail.Values['to'] <> '' then
  begin
    Receip.ulReserved := 0;
    Receip.ulRecipClass := MAPI_TO;
    Receip.lpszName := StrNew(PChar(Mail.Values['to']));
    Receip.lpszAddress := StrNew(PChar('SMTP:' + Mail.Values['to']));
    Receip.ulEIDSize := 0;
    MapiMessage.nRecipCount := 1;
    MapiMessage.lpRecips := @Receip;
  end;

  AttachCount := 0;

  for i1 := 0 to MaxInt do
  begin
    if Mail.Values['attachment' + IntToStr(i1)] = '' then
      break;
    Inc(AttachCount);
  end;

  if AttachCount > 0 then
  begin
    GetMem(Attachments, SizeOf(TMapiFileDesc) * AttachCount);

    for i1 := 0 to AttachCount - 1 do
    begin
      FileName := Mail.Values['attachment' + IntToStr(i1)];
      Attachments[i1].ulReserved := 0;
      Attachments[i1].flFlags := 0;
      Attachments[i1].nPosition := ULONG($FFFFFFFF);
      Attachments[i1].lpszPathName := StrNew(PChar(FileName));
      Attachments[i1].lpszFileName :=
        StrNew(PChar(ExtractFileName(FileName)));
      Attachments[i1].lpFileType := nil;
    end;
    MapiMessage.nFileCount := AttachCount;
    MapiMessage.lpFiles := @Attachments^;
  end;

  if Mail.Values['subject'] <> '' then
    MapiMessage.lpszSubject := StrNew(PChar(Mail.Values['subject']));
  if Mail.Values['body'] <> '' then
    MapiMessage.lpszNoteText := StrNew(PChar(Mail.Values['body']));

  WndList := DisableTaskWindows(0);
  try
  Result := MapiSendMail(MAPI_Session, Handle,
    MapiMessage, MAPI_DIALOG, 0);
  finally
    EnableTaskWindows( WndList );
  end;

  for i1 := 0 to AttachCount - 1 do
  begin
    StrDispose(Attachments[i1].lpszPathName);
    StrDispose(Attachments[i1].lpszFileName);
  end;

  if Assigned(MapiMessage.lpszSubject) then
    StrDispose(MapiMessage.lpszSubject);
  if Assigned(MapiMessage.lpszNoteText) then
    StrDispose(MapiMessage.lpszNoteText);
  if Assigned(Receip.lpszAddress) then
    StrDispose(Receip.lpszAddress);
  if Assigned(Receip.lpszName) then
    StrDispose(Receip.lpszName);
  MapiLogOff(MAPI_Session, Handle, 0, 0);
end;
end;


Inna_Z   (2007-06-01 18:40:00) [2]

Пока без прикреплённых файлов шлю


Inna_Z   (2007-06-01 18:39:00) [3]

Надо вобщем чтоб было и текст письма на русском и заголовок (с ним всё кстати нормально) и прекреплённые файлы

 шлю я его пока так:

 // Настраиваем SMTP
 SMTP.Host := FHost;
 SMTP.Port := FPort;

 // Формируем содержимое письма
 MailMessage.From.Address := 'Inna@asbase.ntu-kpi.kiev.ua';
 MailMessage.Recipients.EMailAddresses := FEmail;
 MailMessage.ContentType := 'plain/text';
 MailMessage.Subject := 'Проверка связи';
 MailMessage.Body.Text := ReportText;

 //send mail
 try
   try
     SMTP.Connect(1000);
     SMTP.SendMsg(MailMessage);
   except
     
   end;
 finally

   if SMTP.Connected then SMTP.Disconnect;
 end;

Как указать ему правильно кодировку?
есть свойство CharSet
в делфи перечисленны варианты

            US-ASCII
ISO-8859-1
ISO-8859-2
ISO-8859-3
ISO-8859-4
ISO-8859-5
ISO-8859-6
ISO-8859-7
ISO-8859-8
ISO-8859-9
ISO-8859-10

можно ли задавать другие?


ANB   (2007-06-01 13:17:00) [4]


> В аутлуке надо было выбрать кодировку
> Cyrillic Windows

аутлук должен сам понимать кодировку. Для сего ему надо ее объяснить.
Письмо шлешь чисто текстом или с аттачами ?


Anatoly Podgoretsky   (2007-06-01 13:16:00) [5]


> Оказывается всё было просто :-)

Не так все просто и главное неправильно.
Что бы не было проблем со чтением писем, надо чтобы в письме были указаны кодировки, для темы и для текста.


clickmaker   (2007-06-01 12:59:00) [6]


> [6] Inna_Z   (01.06.07 12:49)

у меня она тут живет
D:\Delphi7\Indy10\Protocols\IdCoderHeader.pas

у тебя наверно где-то в том же районе


Inna_Z   (2007-06-01 12:49:00) [7]

А что за функция EncodeHeader?
 Откуда она?


Savek   (2007-06-01 12:44:00) [8]

Я проблемы с кодировкой решил вот так:

IdMessage.From.Name:=EncodeHeader(eFName.Text,C,'Q',h,'windows-1251');
IdMessage.Subject:=EncodeHeader(eTema.Text,C,'Q',h,'windows-1251');
//и т.д.


Inna_Z   (2007-06-01 12:44:00) [9]

Спасибо.
 Разобралась

 В аутлуке надо было выбрать кодировку
Cyrillic Windows

 Оказывается всё было просто :-)


Savek   (2007-06-01 12:43:00) [10]

Я проблемы с кодировкой решил вот так:

IdMessage.From.Name:=EncodeHeader(eFName.Text,C,'Q',h,'windows-1251');
IdMessage.Subject:=EncodeHeader(eTema.Text,C,'Q',h,'windows-1251');
//и т.д.


clickmaker   (2007-06-01 12:43:00) [11]

TIdMessagePart.CharSet?


Плохиш   (2007-06-01 12:38:00) [12]

TIdMessagePart.ContentType


Наверх

Титульная страница Поиск, карта сайта Написать письмо