| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- package email
- import (
- "io"
- "mime"
- "net/mail"
- "strings"
- "testing"
- )
- func TestBuildMessageIsRFC5322(t *testing.T) {
- raw := buildMessage("[email protected]", "3x-ui", []string{"[email protected]", "[email protected]"}, "Тест", "<b>hi</b>")
- msg, err := mail.ReadMessage(strings.NewReader(string(raw)))
- if err != nil {
- t.Fatalf("message does not parse as RFC 5322: %v", err)
- }
- from, err := mail.ParseAddress(msg.Header.Get("From"))
- if err != nil {
- t.Fatalf("From header does not parse: %v", err)
- }
- if from.Name != "3x-ui" || from.Address != "[email protected]" {
- t.Errorf("From = %q <%q>, want name %q addr %q", from.Name, from.Address, "3x-ui", "[email protected]")
- }
- if _, err := msg.Header.Date(); err != nil {
- t.Errorf("Date header missing or unparseable: %v", err)
- }
- id := msg.Header.Get("Message-ID")
- if !strings.HasPrefix(id, "<") || !strings.HasSuffix(id, "@example.com>") {
- t.Errorf("Message-ID = %q, want <[email protected]>", id)
- }
- subject, err := (&mime.WordDecoder{}).DecodeHeader(msg.Header.Get("Subject"))
- if err != nil {
- t.Fatalf("Subject does not decode: %v", err)
- }
- if subject != "Тест" {
- t.Errorf("Subject = %q, want %q", subject, "Тест")
- }
- body, _ := io.ReadAll(msg.Body)
- if string(body) != "<b>hi</b>" {
- t.Errorf("body = %q, want %q", body, "<b>hi</b>")
- }
- }
- func TestBuildMessageFromWithoutName(t *testing.T) {
- raw := buildMessage("[email protected]", "", []string{"[email protected]"}, "s", "b")
- msg, err := mail.ReadMessage(strings.NewReader(string(raw)))
- if err != nil {
- t.Fatalf("parse: %v", err)
- }
- from, err := mail.ParseAddress(msg.Header.Get("From"))
- if err != nil {
- t.Fatalf("From header does not parse: %v", err)
- }
- if from.Name != "" || from.Address != "[email protected]" {
- t.Errorf("From = %q <%q>, want bare addr", from.Name, from.Address)
- }
- }
- func TestBuildMessageStripsHeaderInjection(t *testing.T) {
- raw := buildMessage(
- "[email protected]\r\nBcc: [email protected]",
- "Name\r\nX-Evil: 1",
- []string{"[email protected]"}, "s", "b",
- )
- msg, err := mail.ReadMessage(strings.NewReader(string(raw)))
- if err != nil {
- t.Fatalf("parse: %v", err)
- }
- if got := msg.Header.Get("Bcc"); got != "" {
- t.Errorf("injected Bcc header leaked: %q", got)
- }
- if got := msg.Header.Get("X-Evil"); got != "" {
- t.Errorf("injected X-Evil header leaked: %q", got)
- }
- }
|