~emersion/public-inbox

Add utility function for generating Message-Id v1 SUPERSEDED

Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.sr.ht/~emersion/public-inbox/%3C20190516162942.7372-1-sir%40cmpwn.com%3E/mbox | git am -3
Learn more about email & git

[PATCH] Add utility function for generating Message-Id Export this patch

---
 go.mod            |  1 +
 go.sum            |  7 +++++++
 mail/mail.go      | 31 +++++++++++++++++++++++++++++++
 mail/mail_test.go | 15 +++++++++++++++
 4 files changed, 54 insertions(+)
 create mode 100644 go.sum

diff --git a/go.mod b/go.mod
index c4b1a3e..d077adc 100644
--- a/go.mod
+++ b/go.mod
@@ -4,5 +4,6 @@ go 1.12
 
 require (
 	github.com/emersion/go-textwrapper v0.0.0-20160606182133-d0e65e56babe
+	github.com/martinlindhe/base36 v0.0.0-20190418230009-7c6542dfbb41
 	golang.org/x/text v0.3.2
 )
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..93c2bb9
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,7 @@
+github.com/emersion/go-textwrapper v0.0.0-20160606182133-d0e65e56babe h1:40SWqY0zE3qCi6ZrtTf5OUdNm5lDnGnjRSq9GgmeTrg=
+github.com/emersion/go-textwrapper v0.0.0-20160606182133-d0e65e56babe/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U=
+github.com/martinlindhe/base36 v0.0.0-20190418230009-7c6542dfbb41 h1:CVsnY46BCLkX9XOhALJ/S7yb9ayc4eqjXSXO3tyB66A=
+github.com/martinlindhe/base36 v0.0.0-20190418230009-7c6542dfbb41/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8=
+golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/mail/mail.go b/mail/mail.go
index 2f9a12c..68ae121 100644
--- a/mail/mail.go
+++ b/mail/mail.go
@@ -7,3 +7,34 @@
 //
 // RFC 5322 defines the Internet Message Format.
 package mail
+
+import (
+	"bytes"
+	"encoding/binary"
+	"fmt"
+	"math/rand"
+	"os"
+	"time"
+
+	"github.com/martinlindhe/base36"
+)
+
+// Generates an RFC 2822-complaint Message-Id based on the informational draft
+// "Recommendations for generating Message IDs", for lack of a better
+// authoritative source.
+func GenerateMessageId() string {
+	var (
+		now   bytes.Buffer
+		nonce bytes.Buffer
+	)
+	binary.Write(&now, binary.BigEndian, time.Now().UnixNano())
+	binary.Write(&nonce, binary.BigEndian, rand.Uint64())
+	hostname, err := os.Hostname()
+	if err != nil {
+		hostname = "localhost"
+	}
+	return fmt.Sprintf("<%s.%s@%s>",
+		base36.EncodeBytes(now.Bytes()),
+		base36.EncodeBytes(nonce.Bytes()),
+		hostname)
+}
diff --git a/mail/mail_test.go b/mail/mail_test.go
index cfb30ca..5f8c713 100644
--- a/mail/mail_test.go
+++ b/mail/mail_test.go
@@ -1,5 +1,12 @@
 package mail_test
 
+import (
+	"regexp"
+	"testing"
+
+	"github.com/emersion/go-message/mail"
+)
+
 const mailString = "Subject: Your Name\r\n" +
 	"Content-Type: multipart/mixed; boundary=message-boundary\r\n" +
 	"\r\n" +
@@ -33,3 +40,11 @@ const nestedMailString = "Subject: Fwd: Your Name\r\n" +
 	"\r\n" +
 	mailString +
 	"--outer-message-boundary--\r\n"
+
+func TestGenerateMessageId(t *testing.T) {
+	msgId := mail.GenerateMessageId()
+	regex := regexp.MustCompile(`^<.*@.*>$`)
+	if !regex.MatchString(msgId) {
+		t.Error("Generated message ID does not meet RFC requirement")
+	}
+}
-- 
2.21.0
View this thread in the archives