2010-07-01 3 views
4

전자 메일받은 편지함을 입력 대기열로 사용하는 deamon 응용 프로그램을 작성 중입니다. 응답 시간은 가능한 한 서버 오버 헤드가 최소로 유지되어야하므로 폴링 전자 메일 수신함은 문제가되지 않습니다. IMAP 프로토콜은 새 전자 메일에 대한 알림을 활성화하므로 응용 프로그램에 이상적입니다.Indy IMAP 클라이언트 (Delphi 2009)로 전자 메일 도착 알림

그러나 Delphi/Indy 응용 프로그램에서이 메커니즘을 구현하려 할 때 문제가 발생했습니다. TIdIMAP4는 훌륭하게 작동하지만 (제 경우에는 관련없는 일부 유니 코드 문제를 제외하고), 알림을 구현하는 방법을 찾을 수 없었습니다.

이것은 간단한 GIYF 문제 일 수 있지만 일부 정보를 알 수없는 이유로 온라인에서 검색 할 때 Indy 구성 요소와 관련된 정보를 찾을 수 없습니다.

해결책이나 대안 접근법을 깊이 생각해보십시오.

편집 : Indy는 분명히 비동기 전자 메일 알림을 지원하지 않으므로 델파이의 무료 구성 요소가 무엇인지 알 수 있습니다.

답변

4

TIdIMAP4는 새 전자 메일 알림과 같은 비동기 알림 수신을 지원하지 않습니다. TIdIMAP4의 구현을 TIdTelnet이 사용하는 것과 유사한 다중 스레드 모델로 변경해야하지만 TIdIMAP4의 현재 차단 명령/응답 모델로 인해 더 복잡합니다. 지금은받은 편지함을 주기적으로 폴링해야합니다.

+1

Delphi IMAP 클라이언트 구성 요소를 알고 계십니까? – Tibor

+0

미안하지만. –

0

확인. 이 방법이 대안입니다. 전자 메일을 사용하고자하는 이유가 없다고 가정하면 (예 : 정보가 전자 메일을 통해 외부 소스로 전송되는 경우), 입력 테이블을 만드는 데 훨씬 간단한 방법 인 데이터베이스 테이블을 제안합니다.

정기적으로 데이터베이스를 폴링하십시오. 이메일 수신함을 폴링하는 것보다 훨씬 빠르며 생각보다 훨씬 더 빠릅니다. 데이터베이스를 폴링하는 것은 매우 빠르며 성능에 거의 영향을주지 않으면 서 분당 수백 번 데이터베이스 테이블을 쉽게 폴링 할 수 있습니다.

간단 Q 항목을 저장하고이 질문 항목이 처리되었다는 타임 스탬프 또는 플래그를 저장할 수있는 추가 필드를 추가하는 테이블을 만든 다음 당신은 스택

예를 들면 떨어져 다음 처리되지 않은 항목을 다음 MSSQL

select Top 1 * from tbl_MyQ where AlreadyHandled = 0 

MySQL의

select * from tbl_MyQ where AlreadyHandled = 0 Limit 1 

update tbl_MyQ Set AlreadyHandled = 1 where QueueID = #ItemIDRetrieved# 

데이터베이스가 빠르며 걱정되는 경우 테스트를 실행하십시오. IMAP 이벤트 및 전자 메일받은 편지함보다 훨씬 복잡합니다.

+1

우리는 이것을 고려해 왔지만 처음부터 전자 메일 형태로 다양한 사용자로부터 입력이 왔기 때문에 데이터베이스는 불필요한 중간 단계 일 것입니다. – Tibor

+1

대기열을 구현하는 데이터베이스도 있습니다 (오라클이 수행함). 그들은 동시성을 처리합니다 (코드는 처리하지 않습니다. 두 프로세스가 처리하기 전에 동일한 프로세스가 동일한 레코드를 얻을 수 있습니다). 또한 테이블을 연속적으로 폴링 할 필요없이 클라이언트에 이벤트를 발생시킬 수있는 데이터베이스 (다시 Oracle)는 있습니다. 그렇지 않으면 순수한 메시지 대기열이 있습니다. –

2

왜 앱을 클라이언트가 아닌 smtp 서버로 만들까요?

새 이메일을 가져 오는 대신 전자 메일이 앱으로 직접 전송되므로 직접 알림을받을 수 있습니다.

ms exchange 또는 postfix 등이 제대로 작동하도록 설정할 수 있지만 앱이 다운 된 경우 이메일이 대기열에 저장되지 않는다는 점에서 몇 가지 단점이 있습니다.

0

전자 메일받은 편지함 (IMAP)이 아키텍처의 기본 요구 사항이며 사용 가능한 IMAP 클라이언트가없는 경우 다른 언어 (C, C# 또는 Java)로 작성된 비동기 알림이 포함 된 IMAP 클라이언트를 찾으려고합니다. 새로운 메시지가 도착할 때 델파이 데몬 앱을 트리거 할 '프록시'또는 게이트웨이를 구현해야합니다.

델파이 데몬은 간단한 소켓 기반 프로토콜이나 http를 사용하여 메시지 (TIdHTTPServer, TIdTCPClient)를 수신 할 수 있습니다.

Indy의 학습 곡선이 가파른 경우 무료 및 오픈 소스 인 Ararat Synapse TCP/IP 라이브러리를 사용하여 프로토 타입을 작성할 수 있습니다.이 컴파일러는 Delphi 2009 앱에서 매우 잘 작동합니다 (컴파일러가 일부 문자열/ansi 변환).