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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user