refactor email.Compose()
This commit is contained in:
@@ -20,8 +20,6 @@ type MTA interface {
|
|||||||
|
|
||||||
// Email object
|
// Email object
|
||||||
type Email struct {
|
type Email struct {
|
||||||
data strings.Builder
|
|
||||||
|
|
||||||
Date string
|
Date string
|
||||||
MessageID string
|
MessageID string
|
||||||
InReplyTo string
|
InReplyTo string
|
||||||
@@ -109,54 +107,54 @@ func (e *Email) Content(threadID id.EventID, options *ContentOptions) *event.Con
|
|||||||
|
|
||||||
// Compose converts email object to string and (optionally) signs it
|
// Compose converts email object to string and (optionally) signs it
|
||||||
func (e *Email) Compose(privkey string) string {
|
func (e *Email) Compose(privkey string) string {
|
||||||
|
var data strings.Builder
|
||||||
|
|
||||||
domain := strings.SplitN(e.From, "@", 2)[0]
|
domain := strings.SplitN(e.From, "@", 2)[0]
|
||||||
|
data.WriteString("From: ")
|
||||||
|
data.WriteString(e.From)
|
||||||
|
data.WriteString("\r\n")
|
||||||
|
|
||||||
e.data.WriteString("From: ")
|
data.WriteString("To: ")
|
||||||
e.data.WriteString(e.From)
|
data.WriteString(e.To)
|
||||||
e.data.WriteString("\r\n")
|
data.WriteString("\r\n")
|
||||||
|
|
||||||
e.data.WriteString("To: ")
|
data.WriteString("Message-Id: ")
|
||||||
e.data.WriteString(e.To)
|
data.WriteString(e.MessageID)
|
||||||
e.data.WriteString("\r\n")
|
data.WriteString("\r\n")
|
||||||
|
|
||||||
e.data.WriteString("Message-Id: ")
|
data.WriteString("Date: ")
|
||||||
e.data.WriteString(e.MessageID)
|
data.WriteString(e.Date)
|
||||||
e.data.WriteString("\r\n")
|
data.WriteString("\r\n")
|
||||||
|
|
||||||
e.data.WriteString("Date: ")
|
|
||||||
e.data.WriteString(e.Date)
|
|
||||||
e.data.WriteString("\r\n")
|
|
||||||
|
|
||||||
if e.InReplyTo != "" {
|
if e.InReplyTo != "" {
|
||||||
e.data.WriteString("In-Reply-To: ")
|
data.WriteString("In-Reply-To: ")
|
||||||
e.data.WriteString(e.InReplyTo)
|
data.WriteString(e.InReplyTo)
|
||||||
e.data.WriteString("\r\n")
|
data.WriteString("\r\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
e.data.WriteString("Subject: ")
|
data.WriteString("Subject: ")
|
||||||
e.data.WriteString(e.Subject)
|
data.WriteString(e.Subject)
|
||||||
e.data.WriteString("\r\n")
|
data.WriteString("\r\n")
|
||||||
|
|
||||||
e.data.WriteString("\r\n")
|
data.WriteString("\r\n")
|
||||||
|
|
||||||
e.data.WriteString(e.Text)
|
data.WriteString(e.Text)
|
||||||
e.data.WriteString("\r\n")
|
data.WriteString("\r\n")
|
||||||
|
|
||||||
e.sign(domain, privkey)
|
return e.sign(domain, privkey, data)
|
||||||
return e.data.String()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Email) sign(domain, privkey string) {
|
func (e *Email) sign(domain, privkey string, data strings.Builder) string {
|
||||||
if privkey == "" {
|
if privkey == "" {
|
||||||
return
|
return data.String()
|
||||||
}
|
}
|
||||||
pemblock, _ := pem.Decode([]byte(privkey))
|
pemblock, _ := pem.Decode([]byte(privkey))
|
||||||
if pemblock == nil {
|
if pemblock == nil {
|
||||||
return
|
return data.String()
|
||||||
}
|
}
|
||||||
parsedkey, err := x509.ParsePKCS8PrivateKey(pemblock.Bytes)
|
parsedkey, err := x509.ParsePKCS8PrivateKey(pemblock.Bytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return data.String()
|
||||||
}
|
}
|
||||||
signer := parsedkey.(crypto.Signer)
|
signer := parsedkey.(crypto.Signer)
|
||||||
|
|
||||||
@@ -167,10 +165,10 @@ func (e *Email) sign(domain, privkey string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var msg strings.Builder
|
var msg strings.Builder
|
||||||
err = dkim.Sign(&msg, strings.NewReader(e.data.String()), options)
|
err = dkim.Sign(&msg, strings.NewReader(data.String()), options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return data.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
e.data = msg
|
return msg.String()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user