You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

87 lines
1.8 KiB

package postman
import (
"bytes"
"errors"
"net/smtp"
"strconv"
"strings"
"time"
)
// SMTP сервис
type Service struct {
user string
password string
host string
port int
}
func NewService(host string, port int, sender string, password string) *Service {
return &Service{
user: sender,
password: password,
host: host,
port: port,
}
}
// Отправка письма
func (s *Service) Send(message Message) error {
if len(message.to) < 1 {
return errors.New("empty list of recipients")
}
//
auth := smtp.PlainAuth("", s.user, s.password, s.host)
//
buffer := bytes.NewBuffer(nil)
boundary := "GoBoundary"
headery := ""
// header
header := make(map[string]string)
header["From"] = s.user
header["To"] = message.to[0]
header["Cc"] = strings.Join(message.to[1:], ";")
header["Subject"] = message.subject
header["Content-Type"] = "multipart/mixed;boundary=" + boundary
header["Mime-Version"] = "1.0"
header["Date"] = time.Now().String()
for key, value := range header {
headery += key + ":" + value + "\r\n"
}
buffer.WriteString(headery + "\r\n")
// body
body := "\r\n--" + boundary + "\r\n"
body += "Content-Type:" + message.contentType + "\r\n"
body += "\r\n" + message.body + "\r\n"
buffer.WriteString(body)
// attachments
for _, x := range message.attachments {
if x.withFile {
attachment := "\r\n--" + boundary + "\r\n"
attachment += "Content-Transfer-Encoding:base64\r\n"
attachment += "Content-Disposition:attachment\r\n"
attachment += "Content-Type:" + x.contentType + ";name=\"" + x.name + "\"\r\n"
//
buffer.WriteString(attachment)
//
x.WriteFile(buffer)
}
}
buffer.WriteString("\r\n--" + boundary + "--")
// Sending message
return smtp.SendMail(s.host+":"+strconv.Itoa(s.port), auth, s.user, message.to, buffer.Bytes())
}