В моей программе реализован почтовый клиент, использующий классы TIdSMTP и TIdPOP3. Среда разработки--Delphi 7.
Вот код:
отправка сообщений:
Код:
mMessege.Clear;
mSMTP.AuthenticationType := atLogin;
mSMTP.Username := 'user';
mSMTP.Password := 'password';
mSMTP.Host := '192.1.2.3';
mSMTP.Port := 25;
mMessege.CharSet := 'windows-1251';
mMessege.ContentType := 'text/plain';
mMessege.Subject := 'My Text';
mMessege.Body.Add('My Text');
mMessege.From.Address := 'myaddress@myserver.ru';
mMessege.Recipients.EMailAddresses := 'myaddress@myserver.ru';
myfilename := 'mytextfile.txt';
fe := FileExists(myfilename);
if (fe=true) then begin
TIdAttachment.Create(mMessege.MessageParts, myfilename);
end;
//mMessege.IsEncoded := true;
try
mSMTP.Connect;
mSMTP.Send(mMessege);
except
ShowMessage('Ошибка соединения с сервером!');
end;
mSMTP.Disconnect;
mMessege.Clear;
Exit;
приём сообщений:
Код:
iMess := mPop.CheckMessages;
If iMess = 0 then begin
WriteToLog('на сервере отсутствуют сообщения!');
RxTrayIcon1.Hint := 'на сервере отсутствуют сообщения!';
iTimer :=IniTool.ReadInteger('Time', 'Timer', 15)*60;
Timer1.Enabled := True;
RxTimerPOP.Enabled := True;
Exit;
end;{end If iMess = 0}
WriteToLog('На сервере ' + IntToStr(iMess) + 'новых сообщений!');
For ii := 1 to iMess do begin
mMessege.Clear;
strFileName.Clear;
strFormatNam.Clear;
strTableName.Clear;
strDataWrite.Clear;
strAutorName.Clear;
sForShablon:='';
mPOP.RetrieveHeader(ii, mMessege);
ctenc := mMessege.ContentTransferEncoding;
if (ctenc='') then begin
// если есть кодировка в сообщении
mMessege.Clear;
mMessege.NoDecode := true;
mPOP.Retrieve(ii, mMessege);
end
else begin
// если нет кодировки в сообщении
mMessege.Clear;
mPOP.Retrieve(ii, mMessege);
end;
FMimeMsg := TMimeMess.Create;
FMimeMsg.Clear;
FMimeMsg.Lines.SetText(mMessege.Body.GetText);
FMimeMsg.DecodeMessage;
FMimePart := FMimeMsg.MessagePart;
for i := 0 to FMimePart.GetSubPartCount — 1 do begin
FMimePart2 := FMimePart.GetSubPart(i);
if FMimePart2.FileName <> '' then begin
FMimePart2.DecodePart;
FMimePart2.DecodedLines.SaveToFile(MainPath +'\Buffer\' + FMimePart2.FileName) ;
end;
end;
FMimeMsg.Clear;
for i:=0 to (mMessege.MessageParts.Count-1) do begin
if (mMessege.MessageParts.Items[i].ClassType=TIdAttachment) then begin
filename := MainPath + '\Buffer\'+ (mMessege.MessageParts.Items[i] as TIdAttachment).FileName;
CopyFile(PChar(mMessege.MessageParts.Items[i].StoredPathName),PChar(filename),true);
end;
end;
Сообщение нормально отправляется на сервер.
Но при приёме сообщения с сервера почему-то не считывается аттач (вложение) -- файл mytextfile.txt . То есть почему-то не проходит ни часть кода FMimeMsg--там FMimePart.GetSubPartCount равно нулю, ни часть кода с mMessege.MessageParts -- там также mMessege.MessegeParts.Count также равно нулю.
В чём причина этого? Что надо сделать так, чтобы аттач вытаскивался (в первую очередь меня интересует вариант с mMessege.MessegeParts, но также интересует и вариант с FMimeMsg.MessagePart )?