mirror of
https://github.com/astaxie/beego.git
synced 2024-11-26 05:11:31 +00:00
mv mime.QEncoding.Encode logic to mail
it is named qEncode
This commit is contained in:
parent
f26d360ec9
commit
bf870eb9a2
@ -31,10 +31,13 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
maxLineLength = 76
|
maxLineLength = 76
|
||||||
|
|
||||||
|
upperhex = "0123456789ABCDEF"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Email is the type used for email messages
|
// Email is the type used for email messages
|
||||||
@ -238,8 +241,7 @@ func (e *Email) Send() error {
|
|||||||
e.From = e.Username
|
e.From = e.Username
|
||||||
}
|
}
|
||||||
// use mail's RFC 2047 to encode any string
|
// use mail's RFC 2047 to encode any string
|
||||||
sub := mail.Address{Name: e.Subject, Address: ""}
|
e.Subject = qEncode("utf-8", e.Subject)
|
||||||
e.Subject = strings.TrimRight(sub.String(), " <@>")
|
|
||||||
|
|
||||||
raw, err := e.Bytes()
|
raw, err := e.Bytes()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -347,3 +349,73 @@ func base64Wrap(w io.Writer, b []byte) {
|
|||||||
w.Write(out)
|
w.Write(out)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Encode returns the encoded-word form of s. If s is ASCII without special
|
||||||
|
// characters, it is returned unchanged. The provided charset is the IANA
|
||||||
|
// charset name of s. It is case insensitive.
|
||||||
|
// RFC 2047 encoded-word
|
||||||
|
func qEncode(charset, s string) string {
|
||||||
|
if !needsEncoding(s) {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
return encodeWord(charset, s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func needsEncoding(s string) bool {
|
||||||
|
for _, b := range s {
|
||||||
|
if (b < ' ' || b > '~') && b != '\t' {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// encodeWord encodes a string into an encoded-word.
|
||||||
|
func encodeWord(charset, s string) string {
|
||||||
|
buf := getBuffer()
|
||||||
|
|
||||||
|
buf.WriteString("=?")
|
||||||
|
buf.WriteString(charset)
|
||||||
|
buf.WriteByte('?')
|
||||||
|
buf.WriteByte('q')
|
||||||
|
buf.WriteByte('?')
|
||||||
|
|
||||||
|
enc := make([]byte, 3)
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
b := s[i]
|
||||||
|
switch {
|
||||||
|
case b == ' ':
|
||||||
|
buf.WriteByte('_')
|
||||||
|
case b <= '~' && b >= '!' && b != '=' && b != '?' && b != '_':
|
||||||
|
buf.WriteByte(b)
|
||||||
|
default:
|
||||||
|
enc[0] = '='
|
||||||
|
enc[1] = upperhex[b>>4]
|
||||||
|
enc[2] = upperhex[b&0x0f]
|
||||||
|
buf.Write(enc)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buf.WriteString("?=")
|
||||||
|
|
||||||
|
es := buf.String()
|
||||||
|
putBuffer(buf)
|
||||||
|
return es
|
||||||
|
}
|
||||||
|
|
||||||
|
var bufPool = sync.Pool{
|
||||||
|
New: func() interface{} {
|
||||||
|
return new(bytes.Buffer)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func getBuffer() *bytes.Buffer {
|
||||||
|
return bufPool.Get().(*bytes.Buffer)
|
||||||
|
}
|
||||||
|
|
||||||
|
func putBuffer(buf *bytes.Buffer) {
|
||||||
|
if buf.Len() > 1024 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
buf.Reset()
|
||||||
|
bufPool.Put(buf)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user