는 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)을 비교합니다.
그러나 Received
Received-SPF
헤더와 일치하면 좀 더 복잡 같이
- 모든
Received
헤더는 대응 Received-SPF
헤더를 가질 수 없다;
Received-SPF
헤더가 Received
헤더 위에 표시되지 않을 수 있습니다. 이것은 recommended but not mandated by the RFC입니다 (게다가 많은 프로그램은 RFC를 따르지 않으므로 도 보증 할 수 없습니다).
그래서 당신은 헤더의 값을 구문 분석하고 에 기반을 일치, 또는 헤더에 더 낮은 수준의 액세스를 위해 net/textproto
패키지를 사용해야 하나. ReadMIMEHeader()
의 소스를 시작점으로 사용할 수 있습니다.
'map [string] [] string' ('textproto.MIMEHeader')에 저장합니다. 키는 헤더 이름이며, 값은 해당 헤더의 모든 항목에 대한 슬라이스이며, 순서대로 *되어야합니다. 왜 그들이 주문을 안했다고 생각하는지 모르겠다. 어느 경우에 실패합니까? – Carpetsmoker
메일 헤더를 구문 분석 할 수 없어 원래의 순서대로 인쇄 할 수 없기 때문에 완전히 무언가를 놓친 것 같습니다.메일을 파싱 한 다음 'net/mail' 개체에서 메일을 다시 생성하여지도가 정렬되지 않았으므로'Received '및'Received-SPF '가 주문을 잃을 까봐 걱정되었지만'Received [0 ]'는'Received-SPF [0]'과 일치합니다. 이메일에서와 같이 각 서버가 추가 할 때 서로 옆에있을 것입니다. 따라서 맵에서 헤더를 다시 작성할 때 어떻게 든 배열 위치에서 각 헤더 쌍을 함께 넣어야합니까? – amlwwalker