Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > ошибка при получении почты


Автор: redline85 9.1.2011, 12:18
Доброго времени суток, господа форумчане! 
Возникла такая  задача, необходимо отправить на почту письма с вложение,то есть даже не  просто на почтовик, а через него.  два одинаковых приложения крутятся между пользователями, единственная связь м\у ними через почтовик, но ограничение на аттач примерно 7мб.отправку делаю стандартными компонентами делфи NMSMTP1, IdMessage  используя перекодировку wintokoi(код нашел  в инете,c  ней хотяб почтовик коректно получает...). при получении письма почтовым клиентом, с кодировкой все норм и с аттачем. но при попытке получить  почту своей же программой  через компонент IdPOP31 вылетает ошибка 
Цитата
(Project Projectl.exe raised exception class EConvertError with message 'Invalid argument to date encode1. Process stopped. Use Step or Run to continue.)

пробовал использовать сторонний компонент SakSMTP1 отправленное им письмо приходит без проблем, НО, в этом компоненте нельзя динамически сменить  имя аттача. так что пришлось от него отказаться.
Хочу уточнить, что программа получает только те письма, которые ей же посланы, это определяется по теме письма, и вот тут то и вылетает ошибка...
На получение почты
Код

procedure TForm1.XiButton7Click(Sender: TObject);
var i:integer;
from:string;
begin

 
    idPOP31.UserId:=(edit3.Text); // Логин пользователя
    idPOP31.Password:=(edit4.Text); // пароль пользователя
   IdMessage1.Clear; // очистка буфера для сообщения

try
  idPOP31.Connect;
   
    if IdPOP31.CheckMessages<>0 then
        begin
        Memo2.Clear;

 if IdPOP31.RetrieveHeader ( 1,IdMessage1)=true then//-----------вот тут и вылетает ошибка
     begin

    memo1.Lines.AddStrings(IdMessage1.Body);
        if  pos('111',KoiToWin (IdMessage1.Subject))<>0    then
     begin
     from:= decod(IdMessage1.From.text);
    label11.Caption:=trim(copy(from,1,pos('<',from)-1));
        IdPOP31.Retrieve(1,IdMessage1) ;// получение одного сообщения
///////////////////////////////////////////////////////////
    for i:=0 to IdMessage1.MessageParts.Count-1 do
        with IdMessage1.MessageParts do
        begin
          if items[i].ClassType=TIdAttachment then
            with TIdAttachment(items[i]) do
              try
                Form1.Memo2.Lines.Add('--> Attach: '+FileName);
                If not DirectoryExists((ExtractFilePath(paramstr(0))+'incomming\'+ label11.Caption)) then

 CreateDir((ExtractFilePath(paramstr(0))+'incomming\'+ label11.Caption)) ;

              //  if FileExists(FileName) then DeleteFile(FileName);
              ShowMessage('incomming\'+ label11.Caption+'\'+FileName);
                 SaveToFile     ((ExtractFilePath(paramstr(0))+'incomming\'+ label11.Caption+'\')+FileName);
           //     SaveToFile((ExtractFilePath(paramstr(0))+'incomming\'+ FileName);
              except
                ShowMessage('Не удается сохранить файл');
              end;
          if items[i].ClassType = TIdText then
            with TIdText(items[i]) do
            begin
              Form1.Memo2.Lines.Add('--> Text: ');
            Form1.Memo2.Lines.AddStrings(Body);
             Form1.Memo2.Lines.text:=(Body.Text);
               // Form1.Memo2.Lines.Add(wintokoi(body.Text));
            end;
        end;
//////////////////////////////////////////////////////////
  //decod(IdMessage1.Headers.Text);
    // Memo2.Lines.AddStrings(IdMessage1.MessageParts.Items.);
     // передача сообщения из компонента IdMessage в memo
idPOP31.Delete(1); // удаление с сервера, полученного сообщения
   end;
   end
   else
    ShowMessage('no new message');
   end ;
finally
  idPOP31.Disconnect; // разрыв связи
 //     ShowMessage('disssssssconnect');
    end;


end;


Отправка почты
Код

procedure TForm1.XiButton1Click(Sender: TObject);

var sr: TSearchRec;
i,j:integer;
      begin

      XiPanel2.Visible:=true;
      i:=0;
      j:=0;
         label3.Caption:=inttostr(i+1);
      label5.Caption:=inttostr(j+1);
          label9.Caption:=label1.Caption;
      label10.Caption:=inttostr( memo1.Lines.Count);
      XiProgressBar1.Max:=strtoint(label1.Caption)*memo1.Lines.Count;
      XiProgressBar1.Position:=0;
          for j:=0 to memo1.Lines.Count-1 do
          begin
          for i:=0 to strtoint(label1.Caption)-1 do

                                                begin
with NMSMTP1 do
  begin

    Host := '192.168.1.2';
        label3.Caption:=inttostr(i+1);
      label5.Caption:=inttostr(j+1);
    Connect;
          PostMessage.Date:=wintokoi(FormatDateTime('dddddd',now));
         PostMessage.Attachments.Add(wintokoi(sfile.Strings[i]));///////-----тут храниться список файлов для отправки
    PostMessage.FromAddress :=wintokoi(edit1.Text);
    PostMessage.ToAddress.Text := wintokoi(memo1.Lines.Strings[j]);
  NMSMTP1.Charset:='KOI8-R';
    PostMessage.Body.Text := wintokoi(memo2.Text);
    PostMessage.Subject := wintokoi('111 '+ inttostr(i+1));

    try
    SendMail;
          XiProgressBar1.Position:= XiProgressBar1.Position+1;
 NMSMTP1.Disconnect;

 DeleteFile(sfile.Strings[i]);

                                         except
     ShowMessage('Ошибка отправки, почтовый сервак работает?');
     
     end;
        end;
        end;
end;
  
      XiButton5.Enabled:=true;
      label2.Caption:='Файлы отправленны';
      label2.Font.Color:=clBlue;
end;

=========
немогу понять, какое поле еще надо перекодировать??? или это надо сделать при отправке?

Автор: Akella 9.1.2011, 16:37
Цитата
ошибка при получении почты



Цитата(redline85 @  9.1.2011,  12:18 Найти цитируемый пост)
необходимо отправить на почту письма с вложение




ты уж определись, т.к. название темы должно отражать её суть!!!

Автор: redline85 10.1.2011, 06:51
IdSMTP1  мне помог. вопрос закрыт.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)