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


Автор: killerbean 28.11.2006, 15:02
Необходимо получить письмо с ящика gmail. На форуме порылся и получил следующий код:
Код

procedure ReseiveMail(Host: string; Port: integer; User, Password: string);
var
  pop: TIdPOP3;
  m:   TIdMessage;
  mc,i: integer;
  SSLIO : TIdSSLIOHandlerSocketOpenSSL;
begin
  FileName := 'c:\!!!\123\mes.txt';
  pop := TIdPOP3.Create(nil);
  pop.Host:=Host; pop.Port:=Port;
  pop.Username:=User; pop.Password:=Password;
  try
    pop.Connect;
    mc:=pop.CheckMessages;
    while mc > 0 do
    begin
      m:=TIdMessage.Create(pop);
      pop.Retrieve(mc,m);
      for i:=0 to m.MessageParts.Count-1 do
        with m.MessageParts do
          if items[i].ClassType=TIdAttachment then
            with TIdAttachment(items[i]) do
              try
                if FileExists(FileName) then DeleteFile(FileName);
                SaveToFile(FileName);
              except
                ShowMessage('Не удается сохранить файл');
              end;
      m.Free; dec(mc);
    end;
    ShowMessage('Все в порядке');
  except
    general.e.Text :=SysErrorMessage(GetLastError);
  end;
  SSLIO.Free;
  pop.Free;
end;


вроде все понял правельно, но коннект все равно не происходит. В чем моя ошибка? Может я неправельные данные передаю, или еще где-то ошибочка?  Помогите

Автор: Snowy 28.11.2006, 15:25
Цитата(killerbean @  28.11.2006,  15:02 Найти цитируемый пост)
но коннект все равно не происходит
А что говорит?

Автор: killerbean 28.11.2006, 15:34
на pop.Connect возвращает ошибку
Код

Запрос на отправку или получение данных  (when sending on a datagram socket using a sendto call) no address was supplied

Автор: killerbean 29.11.2006, 13:58
Попробовал соединиться с mail.ru. Код тотже, только убрал SSL поддержку.

в функцию передаю следующие параметры:
Код

ReseiveMail('pop.mail.ru', 110, 'my_login', 'my_password');


в результате получаю "Host not found", может я чего-то не то передаю?


Автор: Snowy 29.11.2006, 14:19
Открой телнет. Набери:
o pop.mail.ru 110
Подключается?

Автор: killerbean 29.11.2006, 14:32
нет, а что делать?  smile 

Автор: Snowy 29.11.2006, 14:44
Значит ты не можешь напрямую подключиться со своего компьютера.
Вероятно ты за прокси и порты закрыты smile

Автор: killerbean 29.11.2006, 16:01
Спасибо Snowy. Проблема была с 110-м портом, но всеравно в данном коде не принимаеться аттач. Точнее никогда не выполняеться условие "m.MessageParts.items[i].ClassType=TIdAttachment", хотя письмо точно с аттачем (я проверял). В чем может быть проблема?

Автор: Matematik 29.11.2006, 16:09
ИМХО

Код

if m.MessageParts.items[0] is TIdAttachment then

Автор: Snowy 29.11.2006, 16:15
Почитай этот топ: http://forum.vingrad.ru/index.php?showtopic=84672&view=all
Возможно у тебя та же проблема.
Там последним постом я дал код с обходом ошибки Indy.

Автор: killerbean 30.11.2006, 11:11
TO: Matematik если заменить на is, то даже не компилируеться с ошибкой 
Код

[Pascal Error] m_main.pas(158): E2015 Operator not applicable to this operand type


Snowy. Не получаеться. Письмо приходит, а условие "if (items[i].ClassType = TIdAttachment) then" не выполняеться. (Код взял с последнего поста)

Автор: Matematik 30.11.2006, 11:17
Цитата(killerbean @ 30.11.2006,  11:11)
TO: Matematik если заменить на is, то даже не компилируеться с ошибкой 
Код

[Pascal Error] m_main.pas(158): E2015 Operator not applicable to this operand type

В indy 9 is работает 100%
Код

if IdMessage.MessageParts.Items[i] is TIdAttachment then


Автор: Snowy 30.11.2006, 11:25
killerbean, отправь себе другое письмо для проверки.
Код полностью рабочий. Проверен.
Вероятно что-то не так в самом письме.
Что - не знаю. Его у меня нет smile

Автор: killerbean 30.11.2006, 11:52
Тогда я вышлю Вам тестовое письмо. Создаю его так:

Код

procedure Tgeneral.SendEmail(Email: string; AttachmentName: string);
begin
  smtp.Host := 'xxx';
  smtp.Port := 25;
  smtp.Password := 'xxx';
  smtp.Username := 'jj';
  smtp.HeloName := 'Info';
  mes.From.Text := 'jj@krm.com.ua';
  mes.Sender.Text := 'jj@krm.com.ua';
  mes.Recipients.EMailAddresses := Email;
  mes.Subject := 'testsubj';
  mes.Body.Text := 'testbody';
  //attachment creation
  mes.MessageParts.Clear;
  TIdAttachmentFile.Create(mes.MessageParts, AttachmentName);
  try
    smtp.Connect;
    smtp.Send(mes);
  except
    mess.MessageDlg2('Не могу отправить письмо для ' + ResipientEmail, 'Ошибка', mtwarning, [mbOk], 0);
    smtp.Disconnect;
  end;
  smtp.Disconnect;
end;

вызываю так:
Код

SendEmail(ResipientEmail, 'c:\!!!\test.zip');


Автор: Snowy 30.11.2006, 12:39
Получил письмо.
Нарисовал код для проверки:
Код
var m: TIdMessage;
begin
  m := TIdMessage.Create(nil);
  try m.LoadFromFile('testsubj.mbs'); except end;
  ProcessMessage(m);
  m.Free;
end;
Проглотил твоё письмо без проблем, создал 2 файла - текст и test.zip
ProcessMessage брал из топа по той самой ссылке.
Единственное, что я не сам забирал, а мой почтовик. Я только в файл сохранил.
Но не думаю, что это имеет какое-либо значение. Цель была - разбор мессаги.

Автор: killerbean 30.11.2006, 13:11
Привел функцию ReseiveMail к виду:
Код

begin
  pop:=TIdPOP3.Create(nil);
  pop.Host:=Host; pop.Port:=Port;
  pop.Username:=User; pop.Password:=Password;
  try
    pop.Connect;
    mc:=pop.CheckMessages;
    while mc>0 do begin
      m:=TIdMessage.Create(pop);
      pop.Retrieve(mc,m);
      for i:=0 to m.MessageParts.Count-1 do
        ProcessMessage(m);
      m.Free; dec(mc);
    end;
    ShowMessage('Все в порядке');
  except
    ShowMessage('Не удалось подключиться к серверу');
  end;
  pop.Free;
end;


в папке "Messages" сохраняеться текстовый файл с телом письма, а аттача как небыло так и нет.
Условие "m.MessageParts.items[i].ClassType=TIdAttachment" не выполняеться  smile 

Я понимаю что дело в кривых руках, но я даже не знаю в каком направлении двигаться

Автор: Snowy 30.11.2006, 13:26
После 
pop.Retrieve(mc,m);
Поставь
m.SaveToFile('test.msg');
И этот файл вышли мне.

Добавлено @ 13:38 
Блин. [Посыпаю пеплом голову].
Я только при переходе на следующую страницу заметил, что Indy у тебя 10!
А в 10-ке вместо TIdAttachment нужно по коду везде прописать TIdAttachmentFile.
И где были мои глаза...
Потому и не проходило проверку - TIdAttachmentFile наследний TIdAttachment и это уже другой класс.
Вобщем замени в коде везде на TIdAttachmentFile и всё заработает.

Автор: killerbean 30.11.2006, 13:50
Ну наконец-то всё нормально. Огромное спасибо Snowy за терпение

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