![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() В моей программе реализован почтовый клиент, использующий классы 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 )? |
#2
|
||||
|
||||
![]() Говорят надо делать так
Код:
var MessPart: TIdMessagePart; AttachFile: string; AFileStream: TFileStream; ... .. . // Перебираем все части письма for i := 0 to mMessege.MessageParts.Count-1 do begin MessPart:= mMessege.MessageParts[i]; if MessPart.PartType = mptText then begin // Если это текстовая часть извлекаем текст и помещаем его в TMemo Memo1.Lines.Add('Текстовая часть: ' + TIdText(MessPart).Body.Text); end else begin // Если это файловое вложение (PartType=mptAttachment) // Запоминаем имя файла AttachFile:= TIdAttachment(MessPart).FileName; // Содержимое файлового вложения будем сохранять в TFileStream // Предполагается, что объект создан где-то заранее // В качестве имени файла может использоваться AttachFile TIdAttachment(MessPart).SaveToStream(AFileStream); end; end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |