Получение почты по IMAP (Synapse.ImapSend)

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

alaken
постоялец
Сообщения: 221
Зарегистрирован: 18.02.2010 08:02:13

Сообщение alaken »

Ism писал(а):Здесь чтото про ssl ,

Как и в предыдущем посте, решение использовать не стандартный порт 993 вместо 143 стандартного, с включенным SSL/TLS

Пробовал в коде модуля synapse.imapsend присваивать константе значение порта:

Код: Выделить всё

const
  cIMAPProtocol = '993';


Не соединяется...

Ism писал(а):Может надо установить вот это http://www.slproweb.com/products/Win32OpenSSL.html как у меня viewtopic.php?f=10&t=7406

Буду пробовать.
alaken
постоялец
Сообщения: 221
Зарегистрирован: 18.02.2010 08:02:13

Сообщение alaken »

alaken писал(а):
Ism писал(а):Может надо установить вот это http://www.slproweb.com/products/Win32OpenSSL.html как у меня viewtopic.php?f=10&t=7406

Буду пробовать.


Не соединяется даже с установленным пакетом Win32OpenSSL...

Код: Выделить всё

IMAPSnd.ResultString

Ничего не выдает...

Подкинте идею, очень нужно.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Может файрвол или антивирус мешает
alaken
постоялец
Сообщения: 221
Зарегистрирован: 18.02.2010 08:02:13

Сообщение alaken »

Фаервол и антивирус отключены, через POP3 соединяется и работает...
Thunderbird через IMAP работает на этой машине...
Настройки Thunderbird:
Порт: 143
Защита соединения: STARTTLS
Метод аутентификации: Обычный пароль
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Надо было
imapsnd.FullSSL:=true;

Часть инфы отсюда
http://developers.do.am/publ/delphi/bib ... g/9-1-0-37

Пример извлечения аттачей и текста по imap gmail

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
   imapsnd: TImapSend;
   n,i: integer;
   sl: TStringList;
   mime:TMimemess;
   part: TMimepart;
begin
   sl := TStringList.Create;
   imapsnd := TImapSend.Create;
   mime:=TMimemess.create;
   imapsnd.Username := 'mybox@gmail.com';
   imapsnd.Password := 'pass';
   imapsnd.TargetHost := 'imap.googlemail.com';
   imapsnd.AutoTLS:=true;
   imapsnd.TargetPort:='993';
   imapsnd.FullSSL:=true;
   Memo1.Lines.Assign(imapsnd.FullResult);
   if imapsnd.Login then
   begin
     imapsnd.List('', Listbox1.Items);
     if imapsnd.SelectFolder('inbox') then
     begin
       for i:=1 to 10 do
       begin
         imapsnd.FetchMess(i,mime.Lines);
         mime.DecodeMessage;
         Memo2.Lines.Add(mime.Header.From);
         Memo2.Lines.Add(DateTimeToStr(mime.Header.Date));
         Memo2.Lines.Add('');
         for n := 0 to mime.MessagePart.GetSubPartCount-1 do
         begin
           part:=mime.MessagePart.GetSubPart(n);
           part.DecodePart;
           Memo2.Lines.Add(part.Charset);
           if (LowerCase(part.Primary)='text') and (LowerCase(part.FileName)='') then //Проверим , данный блок - текст сообщения
           begin
             if LowerCase(part.Secondary)='plain' then
             begin
               //Memo1.Lines.LoadFromStream(part.DecodedLines)
               part.DecodedLines.SaveToFile('.\attaches\'+IntToStr(i)+'_'+part.Charset+'.txt')
             end
             else
             begin
               part.DecodedLines.SaveToFile('.\attaches\'+IntToStr(i)+'_'+part.Charset+'.html')
             end;
           end;
           if part.FileName<>'' then
           begin
             part.DecodedLines.SaveToFile('.\attaches\'+IntToStr(i)+'_'+part.FileName) ;
             Memo3.Lines.Add(IntToStr(i)+' '+part.FileName);
             Application.ProcessMessages;
           end;
         end;
       end;
       imapsnd.CloseFolder;
     end;
     imapsnd.Logout;
   end
   else
       Memo1.Lines.Add('Соединение с сервером не установлено' );
   mime.Free;
   imapsnd.Free;
   sl.Free;
end;           
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Ism 26.05.2012 13:26:28, всего редактировалось 1 раз.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Ism
Хороший примерчик. Мне как раз нужно сваять консольную утилитку для выковыривания аттачей из писем.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Оказалось этот пример криво работает со сложными письмами, так как может быть много вложенных субчастей
Из ссылки рекурсивная функция выбирает все

Код: Выделить всё

unit Unit1;

interface

uses
 ... mimemess, mimepart, ActiveX;

type
 TForm1 = class(TForm)
 ...
 procedure Button1Click(Sender: TObject);
 procedure GetParts(const part: TMimepart);
 private
 { Private declarations }
 public
 { Public declarations }
 end;

var
 Form1: TForm1;
 IdMes:TMimeMess;
implementation

{$R *.dfm}
procedure TForm1.GetParts(const part: TMimepart);
var
  s: string;
  i: integer;
begin
 if (LowerCase(part.Primary)='text') and (LowerCase(part.FileName)='') then //Проверим ÷то данный блок - текст сообщения
 begin
   part.DecodePart;
   if LowerCase(part.Secondary)='plain' then // Определяем что это простой текст
   Memo1.Lines.LoadFromStream(part.DecodedLines) // Загружаем раскодированные данные
 else // о, нашелся еще и альтеративный метод отображения, я предположил что у меня всегда формат html
 begin
   // загрузим в браузер, не обязательно, можно и просто сохранить как страницу html
   WebBrowser1.Navigate('html.htm');
   while WebBrowser1.ReadyState < READYSTATE_INTERACTIVE do
   Application.ProcessMessages;
   (WebBrowser1.Document as
   IPersistStreamInit).Load(TStreamAdapter.Create(part.DecodedLines));
 end;
 end;
 if LowerCase(part.FileName)<>'' then begin // а вдруг это вложение
   part.DecodePart;
   part.DecodedLines.SaveToFile('c:\'+part.FileName) ;
   Memo3.Lines.Add('Сохранено в '+'c:\'+part.FileName)
 end;
 for i := 0 to part.GetSubPartCount - 1 do GetParts( part.getsubpart(i)); // проверяем наличие следующего блока
end;


procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
 if OpenDialog1.Execute then
 begin
   IdMes:=TMimeMess.Create;
   IdMes.Lines.LoadFromFile(OpenDialog1.FileName);
 end;
 IdMes.DecodeMessage; // Раскодируем сообщение, обязательно
 LabeledEdit2.Text:=IdMes.Header.From;
 LabeledEdit1.Text:=trim(IdMes.Header.ToList.Text); // Получатели сообщения
 LabeledEdit3.Text:=IdMes.Header.Subject;
 Memo2.Lines.Assign(IdMes.Header.CustomHeaders); // Заголовки, не спицифичные для формата MIME
 GetParts(IdMes.MessagePart); // рекурсивная процедура обхода блоков сообщения

end;
Ответить