Форум по 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.

Вот код:

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

Код:
    
    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  
Старый 12.07.2013, 15:08
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Говорят надо делать так
Код:
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, время: 06:32.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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