2011-11-28 2 views
2

머리글에 있는지 여부는 확실하지 않지만 수신 한 전자 메일이 보낸 전자 메일에 대한 응답인지 여부를 알 수있는 방법을 찾고 있습니다. 그렇다면 "따옴표 붙은 텍스트"가 아닌 새 텍스트 만 잡으십시오.PHP가 IMAP을 사용하여 전자 메일을 회신 한 것인지 확인하십시오.

약간의 배경 : 나는 이메일을 자동으로 발송할 스크립트를 만들고 있습니다. 나는 정기적 인 간격으로 실행하여 모든 응답이 있는지 확인하기 위해 크론 작업을 작성 중입니다. 대답이 있다면, 나는 단지 오래된 것들이 아닌 새로운 것을 움켜 잡고 싶습니다.

이전에는 제목에 ID가있는 이메일을 보냈으며 ([1234] 새 응답이 있음) [및] 사이에있는 항목을 확인합니다. 그런 다음 모든 웹 브라우저/이메일이 따옴표로 묶인 텍스트에 대해 다른 문자 나 스타일을 사용하기 때문에 모든 메시지를 집어 저장합니다. 일부는 ">"어떤 것은 수평적인 규칙을 따르고, 어떤 것은 절대적으로 아무것도하지 않습니다.

어쨌든 이메일 헤더에서 답장하고 새로운 텍스트가 무엇인지를 찾는 것입니다. 그것이 가능하지 않다면, 나는 단지 내가하고있는 일을 계속할 것입니다.

답변

3

불행히도 전자 메일 클라이언트는 기본적으로 메시지로 원하는 모든 작업을 수행 할 수 있으며 수신 된 메시지가 클라이언트에서 발생한 방식을 결정하는 신뢰할 수있는 표준은 없습니다. 또한 IMAP은 실제로 그 일과 관련이 없습니다. 전자 메일은 웹 메일을 포함하여 여러 가지 다른 방법으로 보낼 수 있습니다.

당신이 할 수있는 최선의 방법은 제목 줄에서 ID 번호를 찾는 것입니다 (사람이 거의 변경하지 않는다는 가정하에 변경). 또한 Google이 수행 한 작업을 수행 할 수 있습니다 ... 해당 주소로 보낸 전자 메일에 대한 회신 텍스트를 모호하게 일치시킵니다. 일치하는 경우 회신의 일부로 간주합니다. 그래도 큰 노력이 필요합니다.

+1

그래,이게 내가 생각했던거야. 특히 회신을 확인하는 데있어. 모든 웹 메일/이메일 클라이언트가 다르기 때문에 데이터를 다르게 보내는 것이 어렵습니다. 감사! –

+0

가끔 헤더가 있습니다. 헤더는 in-reply-to 또는 비슷한 것을 읽고 원래 메시지의 메시지 ID를 포함합니다. –

+0

@SteveSmith, 클라이언트가 보낼 필요는 없습니다. 당신은 종종 그것을 보지만 항상 그런 것은 아닙니다. – Brad

4

In-Reply-ToReferences의 조합을 사용하여 전자 메일이 다른 전자 메일의 회신인지 알 수 있습니다.

모든 이메일에는 1에 따라 Message-ID이라는 헤더에 고유 한 ID가 있습니다. 모든 이메일의 상위 항목을 추적 할 수 있습니다.

모든 클라이언트 (Outlook, Thunderbird)에서 작동 중입니다.
예제를 사용하겠습니다.

1- 첫 번째로 보낸 이메일의 헤더 (메일 서버 또는 코드에서)는 ID (Message-ID)을 전송합니다. 이메일 원본을 열면 상단 섹션에 표시됩니다 :

... // You (your code) send: 
Message-ID: <[email protected]>  
... 

당신은 당신의 프로그램이 Message-ID을 유지해야합니다. 후속 회신은이 ID을 참조합니다.

2- 고객이 이메일 1에 회신합니다. 고객은 자신의 Message-ID에 추가로이 회신 메일을 알려주도록 crucial header을 전송합니다.

... // Client(Thunderbird) send: 
Message-ID: <[email protected]>  
In-Reply-To: <[email protected]> 
... 

두 번째 이메일을받을 때 메일의 ID (1) 메일 (2)의 In-Reply-To 헤더에 있기 때문에 당신이 보낸 이전 이메일을 추적하는 것은 쉬울 것이다.당신이 당신의 코드 내에서 다시 메일을 회신 할 경우

3, 당신은 단지 In-Reply-To 헤더에 메일 (2)의 Message-ID을 둘 필요가 메일의 Message-ID (1) 및 메일 (2)에서 References 헤더. 그래서 클라이언트는 체인을 올바르게 이해할 것입니다. 이 헤더에 의해

... // You (your code) send: 
Message-ID: <[email protected]> 
In-Reply-To: <[email protected]> 
References: <[email protected]> <[email protected]> 
... 

, 당신이 이메일은 메일 (2)에 대한 응답이라는 클라이언트를 이야기하고 조상 메일 (1) 및 메일 (2).

나는 그들과 함께 일하고 그것에 대해 읽었으며 작동 중이다. 이제 내 문제는 답장에서 인용 된 텍스트가 아닌 마지막 전자 메일의 텍스트를 얻는 것이다. (우리는 자체 발권 시스템을 운영하고 있으며 각 전자 메일에 대한 설명을 작성합니다.)

+0

'In-Reply-To'헤더의 길이에는 최종 최대 길이가 없으므로 저장할 때 sha256 해시 (32 바이트) 만 저장합니다. 나는 그것을 파싱하는 데 정말로 신경 쓰지 않는다. - 내가 보낸 이메일과 룩업을 비교하기 만하면된다. –

+0

나는 당신을 얻지 못했습니다. 그래서 문제가 무엇입니까? 일반 또는 해시로 저장할 지 여부와 관계없이 계속 비교할 수 있습니다. 보내고있는 모든 메시지 ID를 저장하면 전자 메일을받을 때이 두 일반 텍스트를 비교하거나 두 가지 해시를 적절한 방법으로 비교하면됩니다 (어쩌면 두 해시를 비교할 수있는 방법을 묻는 중입니까?) –

+1

토큰의 길이에 공식적인 제한이없는 것 같습니다. 이론적으로 약 995 자 정도 될 수 있습니다. 나는 그것이 평균보다 훨씬 적다는 것을 확신하지만, 해시를 바로 사용하기로 결정했습니다. –