Проблемы с почтовым клиентом (TIdSMTP, TIdPOP3)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.37] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
Проблемы с почтовым клиентом (TIdSMTP, TIdPOP3)
|
Сообщ.
#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
,
|
|
|
|
![]() ![]() unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient, IdPOP3, IdMessage,EncdDecd; type TForm1 = class(TForm) IdPOP31: TIdPOP3; Button1: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; IdMessage1: TIdMessage; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i:integer; mescount:integer; s:string; begin CreateDir('c:\email'); showmessage('Создана директория c:\email'); idPOP31.Username:=edit1.Text; idPOP31.Password:=edit2.text; idPOP31.Host:=edit3.text; idPOP31.Connect(); mescount:=idPOP31.CheckMessages; idPOP31.Retrieve(mescount,idMessage1); showmessage('в ящике - '+inttostr(mescount)+' писем'); for i :=0 to idMessage1.MessageParts.Count-1 do begin if (IdMessage1.MessageParts.Items[i] is TIdAttachment) then begin s:= TIdAttachment(IdMessage1.MessageParts[i]).FileName; delete(s,1,pos('UTF-8',s)+7); //делал под конкретную кодировку аля c mail.ru на mail.ru delete(s,length(s)-1,2); //делал под конкретную кодировку аля c mail.ru на mail.ru s:=DecodeString(s); //делал под конкретную кодировку аля c mail.ru на mail.ru showmessage('получен файл '+s); TIdAttachment(IdMessage1.MessageParts.Items[i]).SaveToFile('c:\email\'+s); end; end; idpop31.disconnect; end; end. пример работает, но нужно допиливать |