diff options
Diffstat (limited to 'widgets')
| -rw-r--r-- | widgets/compose.go | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/widgets/compose.go b/widgets/compose.go index 01c6281..91599c6 100644 --- a/widgets/compose.go +++ b/widgets/compose.go @@ -3,15 +3,18 @@ package widgets import ( "bufio" "bytes" + "encoding/binary" "fmt" "io" "io/ioutil" + "math/rand" "mime" "net/http" "net/textproto" "os" "os/exec" "path/filepath" + "strconv" "strings" "time" @@ -381,9 +384,24 @@ func (c *Composer) PrepareHeader() (*mail.Header, error) { // control headers not normally set by the user // repeated calls to PrepareHeader should be a noop if !c.header.Has("Message-Id") { - err := c.header.GenerateMessageID() - if err != nil { - return nil, err + if c.header.Has("From") { + // generate the Message-Id our self, to include a FQDN, code is based on the GenerateMessageID of go-message + now := uint64(time.Now().UnixNano()) + + nonceByte := make([]byte, 8) + if _, err := rand.Read(nonceByte); err != nil { + return nil, err + } + nonce := binary.BigEndian.Uint64(nonceByte) + + fromAddresses, err := c.header.AddressList("From") + if err != nil { + return nil, err + } + domain := strings.Split(fromAddresses[0].Address, "@")[1] + + msgID := fmt.Sprintf("%s.%s@%s", base36(now), base36(nonce), domain) + c.header.Set("Message-Id", "<"+msgID+">") } } if !c.header.Has("Date") { @@ -392,6 +410,10 @@ func (c *Composer) PrepareHeader() (*mail.Header, error) { return c.header, nil } +func base36(input uint64) string { + return strings.ToUpper(strconv.FormatUint(input, 36)) +} + func (c *Composer) WriteMessage(header *mail.Header, writer io.Writer) error { if err := c.reloadEmail(); err != nil { return err |
