Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2013, 13:59   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию Проблемы с почтовым клиентом (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 )?
erslgoeirjh вне форума Ответить с цитированием
Старый 14.07.2013, 20:32   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

в инди почта плохо сделана...
сам нарывался на баги - один из них: чтение сообщения из файла и запись в файл - файлы получатся разные, добавляется лишняя секция.

первое что предложу - динамически создавай TMessage, поработал-убил.
второе - не обходи компоненту через StoredPathName - используй встроенное сохранение.
и третье как поступил я самое правильное и кардинальное - переписать TIdMessage, отучить его от временных файлов в мемори стримы, допилить все баги неидентичности загруженного и сохраненного сообщений
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с почтовым клиентом на Паскале MisterDie Паскаль, Turbo Pascal, PascalABC.NET 2 04.06.2013 15:09
работа с почтовым клиентом в делфях alice1505 Помощь студентам 1 22.04.2011 11:09
Приоблемы с формами, почтовым клиентом и удаление своей проги Mercurium Помощь студентам 6 16.02.2011 16:48
Проблемы: Получение / прием писем (TidPOP и TidSMTP) Черничный Работа с сетью в Delphi 7 20.02.2010 03:33
Проблемы с одним клиентом и множеством серверов Maxxon Работа с сетью в Delphi 5 28.08.2007 17:27