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
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())
|
|
}
|
|
|