summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--widgets/compose.go28
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