2017-09-13 11 views
0

Gmail받은 편지함을 사용하여 공급 업체로부터 송장을 처리하는 응용 프로그램과 전자 메일 및 PDF 첨부 파일을 읽는 S22.Imap이 있습니다. . 그것은 어떤 문제없이 지금 몇 년 동안 사용되어 왔지만,받은 편지함에서 모든 메시지를 얻을 수하려고 할 때 최근에, 내가보고 된 명령을 사용하여 처리 할 오류 "스트림은 읽을 수 없습니다"S22.Imap System.IO.IOException : client.GetMessages (uids) 중에 스트림을 읽을 수 없습니다.

IEnumerable<uint> uids = client.Search(SearchCondition.Unseen()); 
IEnumerable<MailMessage> messages = client.GetMessages(uids); 

이 예외는 특정 공급 업체가 한 번에 많은 수의 전자 메일을 보내는 경우에만 발생하는 것으로 보입니다. S22.Imap documentation을보고 있었지만 도움이되지 않았습니다.

참고 : 나는 이메일을이 방법을 참조했지만 내가 위에서 사용 된 원래의 방법은 설명서의 "보이지 않는 메일 메시지를 다운로드"의 실제 예입니다

// Fetch the messages and process each one 
foreach (uint uid in uids) 
{ 
    MailMessage message = client.GetMessage(uid); 
    ProcessMessage(message); 
} 

여기 내 문제는 내가 로컬에서 예외를 재현하지 못했습니다. 그리고 클라이언트와 관련된 방법을 실제로 이해하지 못합니다 .GetMessages (uids) 명령.

이렇게 처리 할 수있는 최대 메시지 수 또는 이메일을 읽고 처리하는 더 나은 방법이 있습니까?

client.GetMessages (uids)가 이러한 전자 메일을 얻는 가장 좋은 방법 인 경우이 예외를 catch하고 발생했을 때 계속할 수있는 좋은 방법이 있습니까?

나는 모든 조언을 부탁드립니다. 고마워,

답변

0

이메일을 처리하기 위해 s22를 사용하는 방법과 관련하여이 상황에 매우 특별하므로 아무에게도 도움이 될지 확실하지 않지만 답변을 게시 할 것이라고 생각했습니다.

가장 큰 문제는 client.GetMessages (uids) 구문을 사용할 때 모든 전자 메일이 '읽지 않음'으로 표시된다는 것입니다. 이것은받은 편지함에있는 모든 이메일을 '읽음'으로 표시했습니다 (읽지 않은 이메일을 계산하여 모든 이메일이 처리되었음을 확인했습니다). 한 번에 하나씩 수집 된 uid를 통과하도록이 방법을 변경하면이 문제를 방지 할 수 있습니다. 오류는 한동안 발생하지만 사용자에게는 아무 것도 남겨 두지 않습니다. 처리되지 못한 메시지는 다음 번에 앱이 실행될 때 처리됩니다. 그래서 기본적으로, 나는 S22.Imap으로 읽지 않은 이메일을 검색 한 방법을 변경하고 오류를 잡아서 옮겨서 처리했습니다.

//get the message one at a time from uids. catching any rare errors with a message 
try 
{ 
    MailMessage message = client.GetMessage(uid); 
    ProcessMessage(message); 
} 
catch(Exception e) 
{ 
    System.Threading.Thread.Sleep(1000); 
    SendErrorEmail("An exception has been caught: " + e.ToString() + 
        Environment.NewLine + "UID: " + uid.ToString()); 
}