Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по INDY а точнее IdPOP3   Найти похожие ветки 

 
C@N ©   (2006-10-17 22:06) [0]

Как узнать пришла ли новая почта мне на ящик???


 
Орион ©   (2006-10-17 22:15) [1]

function CheckForNewMessagesInMyMailBox(AServer, AUser, APassword: string): Boolean;
begin
 //здесь твой код с использованием IdPOP3
end;


 
Percent   (2006-10-17 22:24) [2]

Как узнать пришла ли новая почта мне на ящик???

Это очень сложный вопрос...


 
C@N ©   (2006-10-18 09:17) [3]

ну вот... издеваетесь((((

На сколько я в курсе, то у каждого сообщения есть свойство типа NEW,
как понять сообщение НЬЮ или OLD ????


 
Percent   (2006-10-18 09:42) [4]

На сколько я в курсе, то у каждого сообщения есть свойство типа NEW

Я сомневаюсь, что ты в курсе...

Если в почтовом ящике есть сообщения, то ты их, обычно, закачиваешь. После чего ящик становится пустым. Как только ящик перестает быть пустым, это значит, что пришли новые сообщения.

Есть вариант, когда закачивается не все сообщение, а лишь его заголовок. Само же сообщение хранится на сервере. Для того, чтобы проверить, новое это сообщение, или нет, надо получить UIDL этого сообщения от сервера, потом покопаться в полученных сообщениях, и, если сообщения с таким же UIDL нет в полученных, то это сообщение - новое.
Но в таком случае возникают проблемы с удалением почты с локального компьютера. То есть, ты не имеешь права просто удалять сообщение с локального компьютера; если ты так сделаешь, программа, не обнаружив его локально, закачает его с сервера повторно; для корректной обработки удаления, необходимо после удаления где-то хранить информацию об этом событии, чтобы при очередном подключении к серверу, выполнить не закачку сообщения с сервера, а удалить его также и с сервера.

Но и это еще не все. Если почтовых сообщений у клиента много, например, несколько тысяч, а то и десятков тысяч сообщений, то процесс проверки почты может затянуться на довольно длительное время. Чтобы этого избежать, закачивать почту надо с конца очереди, т. е., последние пришедшие закачивать первыми; как только появится "старое" ссобщение, значит, все идущие за ним (0..MsgNo - 1) уже закачаны, и можно прерывать процесс закачки почты.

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

Поэтому следует применять дополнительные проверки...

То есть, это очень сложно. И ни капли издевки.

P.S. Я не знаю, поддерживает ли такую функциональность IdPOP3...


 
umbra ©   (2006-10-18 10:14) [5]

поддерживает


 
C@N ©   (2006-10-18 10:17) [6]

Хек!!!....
И как всетаки получить этот UIDL

Пишу програмацию...которая по типу MRA... и с ящика закачивать пока ничо не собираюсь...


 
Percent   (2006-10-18 10:29) [7]

И как всетаки получить этот UIDL

Послать серверу команду

UIDL N

где N - порядковый номер сообщения.

В ответ сервер вернет UIDL.


 
Percent   (2006-10-18 10:38) [8]

Посмотрел только что IdPOP3.
Там нет метода для получения UIDL"а, можно получить только заголовок.
Но в заголовке письма UIDL"a нет. IdMessage.MsgID - это, скорее всего, не то. Скорее всего, MsgID - это поле сообщения Message-ID, т.е.,  идентификатор письма в контексте отправителя, но не сервера. То есть, для MsgID не гарантируется уникальность в контексте отдельно взятого почтового ящика.


 
Percent   (2006-10-18 10:42) [9]

которая по типу MRA

Это что за зверь?


 
Dmitrij_K   (2006-10-18 10:42) [10]


> Там нет метода для получения UIDL"а

Плохо искал.
код из idpop3.pas
function TIdPOP3.UIDL(const ADest: TStrings; const AMsgNum: Integer = -1): Boolean;
Begin
 if AMsgNum >= 0 then begin
   Result:=SendCmd("UIDL "+IntToStr(AMsgNum))=wsOk;    {Do not Localize}
   if Result then
   begin
     ADest.Assign(LastCmdResult.Text);
   end;
 end
 else begin
   Result:=SendCmd("UIDL")=wsOk;    {Do not Localize}
   if Result then
   begin
     Capture(ADest);
   end;
 end;
End;//TIdPOP3.GetUIDL


 
Percent   (2006-10-18 10:58) [11]

Плохо искал.

Да нет, искал хорошо, просто у меня Delphi 6, и в нем нет этого метода...


 
Dmitrij_K   (2006-10-18 11:00) [12]


> Да нет, искал хорошо, просто у меня Delphi 6, и в нем нет
> этого метода...

Тогда пользуйся
:)


 
Percent   (2006-10-18 11:07) [13]

Тогда пользуйся

Спасибо, но у меня есть свое, не Indy...

function TRSPOP3.MessageUIDL(a_iMessageNo: integer): string;
var
 iPos: integer;
 sStr: string;
begin
 SendCommand("UIDL " + IntToStr(a_iMessageNo));
 sStr := ReceiveSingle;
 if not CheckAnswer(sStr) then
   raise ERSPOP3Exception.Create("UIDL query error: " + Result);
 DeleteOKERR(sStr);
 iPos := Pos(" ", sStr);
 if (iPos = 0) then
   ERSPOP3Exception.Create("Wrong UIDL answer: " + sStr);
 Result := Copy(sStr, iPos + 1, MaxInt);
end;


 
C@N ©   (2006-10-18 12:50) [14]

MRA - MailRuAgent... эта фигня умеет сидеть в трее и палить почту, на новые сообщения)))
Попробую разобраться.....



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.046 c
1-1159196321
newbie2
2006-09-25 18:58
2006.11.05
Какой сhart в "Домашние финансы"


2-1161163863
pkm
2006-10-18 13:31
2006.11.05
Мемо.


3-1157093965
Delphi basic
2006-09-01 10:59
2006.11.05
Неправильный расчет выражений в SQL


1-1159295713
AlexeyT
2006-09-26 22:35
2006.11.05
Задать рамке TPanel стиль от TEdit


1-1159163057
oleg__
2006-09-25 09:44
2006.11.05
Код нажатой клавиши





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский