123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- package service
- import (
- "context"
- "fmt"
- "go-common/app/admin/main/macross/conf"
- "go-common/app/admin/main/macross/model/mail"
- "go-common/app/admin/main/macross/tools"
- "go-common/library/log"
- "io"
- "os"
- "path/filepath"
- "strings"
- gomail "gopkg.in/gomail.v2"
- )
- // SendMail send mail
- func (s *Service) SendMail(c context.Context, m *mail.Mail, attach *mail.Attach) (err error) {
- var (
- toUsers []string
- ccUsers []string
- bccUsers []string
- msg = gomail.NewMessage()
- )
- msg.SetAddressHeader("From", conf.Conf.Property.Mail.Address, conf.Conf.Property.Mail.Name) // 发件人
- for _, ads := range m.ToAddresses {
- toUsers = append(toUsers, msg.FormatAddress(ads.Address, ads.Name))
- }
- for _, ads := range m.CcAddresses {
- ccUsers = append(ccUsers, msg.FormatAddress(ads.Address, ads.Name))
- }
- for _, ads := range m.BccAddresses {
- bccUsers = append(bccUsers, msg.FormatAddress(ads.Address, ads.Name))
- }
- msg.SetHeader("To", toUsers...)
- msg.SetHeader("Subject", m.Subject) // 主题
- if len(ccUsers) > 0 {
- msg.SetHeader("Cc", ccUsers...)
- }
- if len(bccUsers) > 0 {
- msg.SetHeader("Bcc", bccUsers...)
- }
- if m.Type == mail.TypeTextHTML {
- msg.SetBody("text/html", m.Body)
- } else {
- msg.SetBody("text/plain", m.Body)
- }
- // 附件处理
- if attach != nil {
- tmpSavePath := filepath.Join(os.TempDir(), "mail_tmp")
- err = os.MkdirAll(tmpSavePath, 0755)
- if err != nil {
- log.Error("os.MkdirAll error(%v)", err)
- return
- }
- destFilePath := filepath.Join(tmpSavePath, attach.Name)
- destFile, cErr := os.Create(destFilePath)
- if cErr != nil {
- log.Error("os.Create(%s) error(%v)", destFilePath, cErr)
- return cErr
- }
- defer os.RemoveAll(tmpSavePath)
- io.Copy(destFile, attach.File)
- // 如果 zip 文件需要解压以后放在邮件附件中
- if attach.ShouldUnzip && strings.HasSuffix(attach.Name, ".zip") {
- unzipFilePath := filepath.Join(tmpSavePath, "unzip")
- err = os.MkdirAll(tmpSavePath, 0755)
- if err != nil {
- log.Error("os.MkdirAll error(%v)", err)
- return
- }
- err = tools.Unzip(destFilePath, unzipFilePath)
- if err != nil {
- log.Error("unzip(%s, %s) error(%v)", destFilePath, unzipFilePath, err)
- return
- }
- err = filepath.Walk(unzipFilePath, func(path string, f os.FileInfo, err error) error {
- if err != nil {
- log.Error("filepath.Walk error(%v)", err)
- return err
- }
- if f == nil {
- errMsg := "found no file"
- err = fmt.Errorf(errMsg)
- log.Error(errMsg)
- return err
- }
- if f.IsDir() {
- return nil
- }
- msg.Attach(path)
- return err
- })
- } else {
- msg.Attach(destFilePath)
- }
- }
- d := gomail.NewDialer(
- conf.Conf.Property.Mail.Host,
- conf.Conf.Property.Mail.Port,
- conf.Conf.Property.Mail.Address,
- conf.Conf.Property.Mail.Pwd,
- )
- if err = d.DialAndSend(msg); err != nil {
- log.Error("Send mail Fail(%v) diff(%s)", msg, err)
- return
- }
- return
- }
|