Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Прием почты

Страницы: 1 2 След.
Прием почты
Ребят, здесь есть тема по отправки почты и там очень много полезного, но дело в том, что мне нужно как раз получать почту, а не отправлять. Кто-нибудь подскажите, как это можно сделать.
Я знаю только такой способ, хотя он уже устаревший, но для старых версий Delphi вполне применим.
Сначала нужно подключиться к серверу, осуществляется это так
Код
NMPOP31.Host:=Edit1.Text; 
NMPOP31.UserID:=Edit2.Text; 
NMPOP31.Password:=Edit3.Text; 
NMPOP31.DeleteOnRead:=false; 
NMPOP31.Connect;

В трех компонентах edit храниться адрес сервера, логин и пароль пользователя. Теперь нам нужно получить письма, для этого пишем такой код
Код
var 
N:Integer; 
if NMPOP31.MailCount>0 then 
begin 
N:=StrToIntDef(Edit4.Text, -1); 
if (NNMPOP31.MailCount) then ShowMessage('Wrong number') 
else 
begin 
NMPOP31.GetMailMessage(N); 
Edit5.Text:=NMPOP31.MailMessage.From; 
Edit6.Text:=NMPOP31.MailMessage.Subject; 
Edit7.Text:=NMPOP31.MailMessage.MessageID; 
Memo1.Lines.Assign (NMPOP31.MailMessage.Head); 
Memo1.Lines.Assign(NMPOP31.MailMessage.Body); 
end; 
end; 

Думаю здесь также все понятно, в каком компоненте, что отображается и для чего он нужен
Спасибо, не совсем понял, зачем нужен Edit4?
В edit4 храниться номер письма, которое нужно получить.
Сейчас уже не нужно использовать NMPOP3 для получения почты, на смену ему пришли компоненты Indy. Например, я получаю письмо так
Код
procedure TForm1.Button1Click(Sender: TObject); 
   begin 
    POP3.Host:='mail.58r.ru'; // адрес почтового сервера 
    POP3.Port:=110; // порт по которому будет осуществляться подключение 
    POP3.Username:='test+58r.ru'; // Логин пользователя
    POP3.Password:='12345666'; // пароль пользователя 
    IdMessage.Clear; // очистка буфера для сообщения 
    POP3.Connect; // подключение по протоколу POP3, по настройкам в компоненте IdPOP3, с именем POP3 
    Memo1.Clear; // очистка компонента memo для отображения текста письма.
    POP3.Retrieve(1,IdMessage); // получение одного сообщения 
    Memo1.Lines.AddStrings(IdMessage.Body); // передача сообщения из компонента IdMessage в memo 
    POP3.Delete(1); // удаление с сервера, полученного сообщения 
    POP3.Disconnect; // разрыв связи
end; 
Все верно, кстати, чтобы получить письмо и вывести его атрибуты можно использовать такой код
Код
procedure TForm1.Button3Click(Sender: TObject); 
var 
   i,numPosts: Integer; 
begin 
   POP3.Host:='mail.58r.ru'; // адрес почтового сервера 
   POP3.Port:=110; // порт по которому будет осуществляться подключение 
   POP3.Username:='test+58r.ru'; // логин пользователя 
   POP3.Password:='12345666'; // пароль пользователя 
   IdMessage.Clear; // очистка буфера для сообщения 
   POP3.Connect; // подключение по протоколу POP3, по настройкам в компоненте IdPOP3, с именем POP3 
   Memo1.Clear; // очистка компонента memo для отображения текста письма. 
   POP3.Retrieve(1,IdMessage); // получение одного сообщения 
   Memo1.Lines.AddStrings(IdMessage.Body); // передача сообщения из компонента IdMessage в memo 
   // вывод в компоненты Label информации о сообщении. 
   Label1.Caption := IdMessage.From.Text; 
   Label2.Caption := IdMessage.Recipients.EmailAddresses; 
   Label3.Caption := IdMessage.CCList.EMailAddresses; 
   Label4.Caption := IdMessage.Subject; 
   Label5.Caption := FormatDateTime('dd mmm yyyy hh:mm:ss', IdMessage.Date); 
   Label6.Caption := IdMessage.ReceiptRecipient.Text; 
   Label7.Caption := IdMessage.Organization; 
   POP3.Delete(1); // удаление с сервера, полученного сообщения 
   POP3.Disconnect; // разрыв связи 
end; 
 
А вот так можно получить несколько писем. В данном случае их 10. Хочу спросить, может быть, кто-нибудь знает, как доработать этот код, чтобы он получал все письма из почтового ящика
Код
procedure TForm1.Button2Click(Sender: TObject); 
label f; 
var 
  mailcicl:integer; // счётчик получаемых писем 
  addr:string; // папка в которой будут сохраняться получаемые письма 
begin 
   POP3.Host:='mail.58r.ru'; // адрес почтового сервера 
   POP3.Port:=110; // порт по которому будет осуществляться подключение 
   POP3.Username:='test+58r.ru'; // Логин пользователя 
   POP3.Password:='12345666'; // пароль пользователя 
   addr:=ExtractFilePath(Application.ExeName); // получения адреса папки, в которой находиться наша программа 
   POP3.Connect; // подключение к серверу 
   for mailcicl:=1 to 10 do // цикл получения писем 
   begin 
   if POP3.CheckMessages<1 then goto f ; // Если писем нет, то выйти и цикла 
   IdMessage.Clear; // очистка буфера для сообщения 
   Memo1.Clear; // очистка компонента memo для отображения текста письма. 
   POP3.Retrieve(1,IdMessage); // получение одного сообщения 
   Memo1.Lines.AddStrings(IdMessage.Body); // передача сообщения из компонента IdMessage в memo 
   Memo1.Lines.SaveToFile(addr+inttostr(mailcicl)+'.txt'); // сохранение письма в папке, где находится наша программа 
   POP3.Delete(mailcicl); // удаление письма на сервере 
   end; 
  f: // метка выхода из цикла 
  POP3.Disconnect; // разрыв соединения с сервером 
end;
Здесь достаточно ограничить цикл очень большим числом, а выход осуществляется при отсутствии писем, но нужно еще продумать вопрос получениях новых писем. Для этого придется либо удалять все письма с сервера после их получения, либо запоминать количество писем которое было в прошлый раз.
Спасибо, а как получить количество всех писем в почтовом ящике?
Ну, как получить количество писем я не знаю, но можно загружать только заголовки писем, используя RetrieveHeader, а потом уже посчитать количество этих заголовков.
Чтобы отличить прочитанное и непрочитанное письмо можно использовать идентификатор писем. Каждое письмо содержит уникальный идентификатор UIDL. После получения UIDL всех писем на сервере, нужно сравнить их (UIDL) с теми, что уже имеются у клиента и загрузить только те, у которых идентификатор будет отличаться.
А можно, как-нибудь получить информацию о еще непрочитанных письмах с сервера? Ведь если зайти на сервер, там все непрочитанные письма выделены жирным шрифтом.
Протокол POP3 не дает информации о том, было ли прочитано письмо или нет. В этом протоколе такого просто нет.
Но как же, например, в TheBat точно есть функция пометить письма как прочитанные.
Есть почтовые клиенты, которые обрабатывают информацию о прочтении писем от сервера, а не хранят её у себя, но в самом протоколе такая информация не содержится.
Здравствуйте все. У меня сейчас проблема есть небольшая, надеюсь вы сможете мне помочь. Как можно отобразить заголовок письма по-русски, потому что у меня там сейчас пишется примерно такая абракадабра
=?koi8-r?B?68nOz+vBxNI6INPSxcTBLCAwNSDExcv BwtLR?=
Для этого нужно перекодировать KOI-8 в win. Можно с помощью такого кода
Код
const

Koi: array[0..66] of Char = (
'T', 'Ё', 'ё', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж',
'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р',
'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ',
'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д',
'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о',
'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш',
'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я');

Win: array[0..66] of Char = (
'ё', 'Ё', 'T', 'ю', 'а', 'б', 'ц', 'д', 'е', 'ф',
'г', 'х', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п',
'я', 'р', 'с', 'т', 'у', 'ж', 'в', 'ь', 'ы', 'з',
'ш', 'э', 'щ', 'ч', 'ъ', 'Ю', 'А', 'Б', 'Ц', 'Д',
'Е', 'Ф', 'Г', 'Х', 'И', 'Й', 'К', 'Л', 'М', 'Н',
'О', 'П', 'Я', 'Р', 'С', 'Т', 'У', 'Ж', 'В', 'Ь',
'Ы', 'З', 'Ш', 'Э', 'Щ', 'Ч', 'Ъ');


function WinToKoi(Str: string): string;
var
  i, j, index: Integer;
begin
  Result := '';

  for i := 1 to Length(Str) do
  begin
    index := -1;
    for j := Low(Win) to High(Win) do
      if Win[j] = Str[i] then
      begin
        index := j;
        Break;
      end;

    if index = -1 then
      Result := Result + Str[i]
    else
      Result := Result + Koi[index];
  end;
end;

function KoiToWin(Str: string): string;
var
  i, j, index: Integer;
begin
  Result := '';

  for i := 1 to Length(Str) do
  begin
    index := -1;
    for j := Low(Win) to High(Win) do
      if Koi[j] = Str[i] then
      begin
        index := j;
        Break;
      end;

    if index = -1 then
      Result := Result + Str[i]
    else
      Result := Result + Win[index];
  end;
end;


procedure SendFileOnSMTP(Host: string; Port: Integer;
Subject, FromAddress, ToAddress, Body, FileName: string);
var
  NMSMTP: TNMSMTP;
begin
  if DelSpace(ToAddress) = '' then
    Exit;
  if ToAddress[1] = '' then
    Exit;

  if (DelSpace(FileName) <> '') and not FileExists(FileName) then
    raise Exception.Create('SendFileOnSMTP: file not exist: ' + FileName);

  NMSMTP := TNMSMTP.Create(nil);
  try
    NMSMTP.Host := Host;
    NMSMTP.Port := Port;
    NMSMTP.Charset := 'koi8-r'
    NMSMTP.PostMessage.FromAddress := FromAddress;
    NMSMTP.PostMessage.ToAddress.Text := ToAddress;
    NMSMTP.PostMessage.Attachments.Text := FileName;
    NMSMTP.PostMessage.Subject := Subject;
    NMSMTP.PostMessage.Date := DateTimeToStr(Now);
    NMSMTP.UserID := 'netmaster'
    NMSMTP.PostMessage.Body.Text := WinToKoi(Body);
    NMSMTP.FinalHeader.Clear;
    NMSMTP.TimeOut := 5000;
    NMSMTP.Connect;
    NMSMTP.SendMail;
    NMSMTP.Disconnect;
  finally
    NMSMTP.Free;
  end;
end;
Помню я тоже, когда-то мучился с такой же проблемой. Тут еще сложность в том, что непонятно в какой кодировки написан заголовок.
Алексей, спасибо, но как я узнаю какая кодировка у заголовка письма?
Если кодировка win, то все отобразиться без проблем, а если koi-8 то об этом будет написано. Используйте pos('koi8', ..)
Алексей, а Ваш код не будет работать. Сами посмотрите там только русские буквы, а в заголовке могут быть еще и английские.
Может быть стоит использовать ЕIdDecoderMIME или может быть есть стандартные INDY которые решают эту проблему. Я вообще не специалист, но советую копать в этом направлении.
А где их можно скачать или на какой они вкладке?
В IndyMisc, там на иконке «64» написано
Изменено: Иван Прокофьев - 23.12.2009 19:50:23
Думаю, вам стоит обратить внимание вот на эту статью http://www.delphikingdom.com/asp/viewitem.asp?catalogid=691 Мне кажется, что она позволит Вам решить Ваше проблему.
Страницы: 1 2 След.
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)