Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.07.2013, 13:48
erslgoeirjh erslgoeirjh вне форума
Прохожий
 
Регистрация: 12.07.2013
Сообщения: 1
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Проблемы с почтовым клиентом (TIdSMTP, TIdPOP3)

В моей программе реализован почтовый клиент, использующий классы TIdSMTP и TIdPOP3. Среда разработки--Delphi 7.

Вот код:

отправка сообщений:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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;

приём сообщений:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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  
Старый 12.07.2013, 15:08
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Говорят надо делать так
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:52.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025