•  

ГлавнаяIndyЧастые вопросы по Indy → Как правильнее обрабатывать сообщения почты

Создано: 26.01.2012 21:47:27 · Исправлено: 26.01.2012 21:47:27 · Прочтений: 1431

Здравствуйте всем!
Посоветуйте, плиЗ, кто нить делал программы обработки почты на компоненте indy. Как правильнее обрабатывать сообщения у меня сложности следующего плана. Есть такой код
procedure TForm1.Button1Click(Sender: TObject);
var MesCount,i:integer;
begin
MesCount:=0;
try
  If not pop.Connected then pop.Connect;
  MesCount:=pop.CheckMessages;
  while MesCount>0 do
  begin
  pop.Retrieve(1,msg);
  pop.Delete(1);
  pop.Disconnect;
  msg.Recipients.EMailAddresses:[email protected];
  if not smtp.Connected then smtp.Connect;
  smtp.Send(Msg);
  If not pop.Connected then pop.Connect;
  MesCount:=pop.CheckMessages;
  end;
finally
  if pop.Connected then pop.Disconnect;
  if smtp.Connected then smtp.Disconnect;
end;
end;
Вроде всё нормально работает пока дело не доходит до аттачей! То просто прога ломается с ошибкой TextCount должен быть > 1, то пересылает письмо НО, оутлук отображает вместо текста письма This is a multi-part message in MIME format.. Но при этом если посмотреть полностью текст со всеми заголовками, то там есть исходное письмо. но не правильно(как я понимаю) обрабатывается мультипарты. Короче жду советов и предложений. Может кто посоветует другие компоненты, только плиз или с примерами , или где взять можно.
Все очень просто.
Нужно только чуть-чуть знать сам стандарт MIME. В нем есть такое свойство как Content-Type, которое в интернет документах встречается сплошь и всюду, в том числе и в электронных письмах. Чаще всего оно бывает трех типов.
1. text/plain - обычный текст без форматирования и вложений.
2. text/html - текст с форматированием html, но тоже без вложений.
3. multipart/mixed - сложное письмо состоящее из многих частей.
В первых двух случаях тело сообщения заносится в idMessage.Body. А с третьим все несклолько сложнее. Сообщение состоит из нескольких частей и одно из них (первое по счету) это текст. Причем у каждой из частей тоже должно указываться Content-Type. Эти части находятся в idMessage.MessageParts и могут быть двух видов: TidText и TidAttachmentFile Вот так это должно выглядеть:
public
Body: TidText;// если объявить в другом месте, будет Access Violation
...
begin
Msg.Clear;
Body:=TidText.Create(Msg.MessageParts, Memo1.Lines);
TidAttachmentFile.Create(Msg.MessageParts, писька.jpg);
...
SMTP.Connect;
SMTP.Send(Msg);
SMTP.Disconnect;
end;
Но это касается только писем с аттачами. При приеме писем все эти части в т.ч. и текст будет в idMessage.MessageParts. Количество лучше узнавать просто Countом а TextCount лучше не использовать. Кстати у принятого письма Content-Type можно узнать из одноименного свойства, таким-же образом можо узнать и кодироку письма (КОИ, WIN, UTF).