2017-05-05 15 views
0

이동 중에 net/mail 라이브러리를 사용하고 있습니다. 모든 것이 훌륭하지만 원래 이메일을 전달하고 헤더 순서를 유지하려고합니다. 이것은 각 메일을 전달하는 메일 서버가 헤더를 헤더에 추가하기 때문에 중요합니다. 순서가 없으면 각 서버가 무엇을 언제, 어떤 헤더를 추가했는지 알기가 어렵습니다. net/mailstores the headers in a map 라이브러리에는 정의 상 개념이 없습니다. 헤더 순서가 전자 메일의 주문에만 기반을두기 때문에 이상한 선택 인 것처럼 보입니다. 헤더를 읽은 순서를 유지할 수있는 방법에 대한 의견이 있으십니까?이메일 헤더 구문 분석 및 주문 유지

감사

+0

'map [string] [] string' ('textproto.MIMEHeader')에 저장합니다. 키는 헤더 이름이며, 값은 해당 헤더의 모든 항목에 대한 슬라이스이며, 순서대로 *되어야합니다. 왜 그들이 주문을 안했다고 생각하는지 모르겠다. 어느 경우에 실패합니까? – Carpetsmoker

+0

메일 헤더를 구문 분석 할 수 없어 원래의 순서대로 인쇄 할 수 없기 때문에 완전히 무언가를 놓친 것 같습니다.메일을 파싱 한 다음 'net/mail' 개체에서 메일을 다시 생성하여지도가 정렬되지 않았으므로'Received '및'Received-SPF '가 주문을 잃을 까봐 걱정되었지만'Received [0 ]'는'Received-SPF [0]'과 일치합니다. 이메일에서와 같이 각 서버가 추가 할 때 서로 옆에있을 것입니다. 따라서 맵에서 헤더를 다시 작성할 때 어떻게 든 배열 위치에서 각 헤더 쌍을 함께 넣어야합니까? – amlwwalker

답변

1

net/mail 패키지는 헤더 을 (ReadMessage() 참조) 구문 분석 net/textproto 패키지를 사용합니다.

반환 맵 m 매핑 CanonicalMIMEHeaderKey (키)의 입력에서 발생하는 동일한 순서 값 의 서열 : 구체적으로 문서화되어 헤더위한 ReadMIMEHeader()를 이용한다.

당신은 당신이 원하는 view the full source 수 있다면,하지만 기본적인 프로세스는 다음과 같습니다

headers = make(map[string][]string) 
for { 
    key, value := readNextHeader() 
    if key == "" { 
     return headers // End of headers 
    } 

    if headers[key] == nil { 
     headers[key] = []string{value} 
    } else { 
     headers[key] = append(headers[key], value) 
    } 
} 

그것은 그들이 메시지 등장으로 헤더의 원래 순서가 손실되는 것은 사실이다,하지만 난 아니에요 이것이 정말로 중요한 시나리오를 알고 있어야합니다. 무엇 가 아닌은 다중 값 헤더의 순서입니다. 슬라이스는 이메일에 나타난 순서대로 임을 확인합니다.

헤더를 반복하는 간단한 프로그램으로 이것을 확인할 수 있으며 은 값 (such as this one in the Playground)을 비교합니다.


그러나 ReceivedReceived-SPF 헤더와 일치하면 좀 더 복잡 같이

  1. 모든 Received 헤더는 대응 Received-SPF 헤더를 가질 수 없다;
  2. Received-SPF 헤더가 Received 헤더 위에 표시되지 않을 수 있습니다. 이것은 recommended but not mandated by the RFC입니다 (게다가 많은 프로그램은 RFC를 따르지 않으므로 도 보증 할 수 없습니다).

그래서 당신은 헤더의 값을 구문 분석하고 에 기반을 일치, 또는 헤더에 더 낮은 수준의 액세스를 위해 net/textproto 패키지를 사용해야 하나. ReadMIMEHeader()의 소스를 시작점으로 사용할 수 있습니다.