123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- package service
- import (
- "context"
- "fmt"
- "time"
- "go-common/app/admin/ep/merlin/model"
- "gopkg.in/gomail.v2"
- )
- const (
- _merlinUIAddr = "http://merlin.bilibili.co"
- )
- // SendMail send mail.
- func (s *Service) SendMail(mailType int, machine *model.Machine) (err error) {
- var (
- mailSendHead = ""
- mailSendContext = ""
- m = gomail.NewMessage()
- user *model.User
- )
- switch mailType {
- //将要过期提醒
- case model.MailTypeMachineWillExpired:
- if user, err = s.dao.FindUserByUserName(machine.Username); err != nil {
- return
- }
- m.SetHeader("To", user.EMail)
- mailSendHead = fmt.Sprintf("machine named [%s] will be expired on %s", machine.Name, machine.EndTime.Format(model.TimeFormat))
- m.SetHeader("Subject", mailSendHead)
- delayLink := fmt.Sprintf("http://merlin.bilibili.co/#/machine-list?machine_name=%s&username=&page_num=1&page_size=10", machine.Name)
- mailSendContext = fmt.Sprintf("<br>可前往Merlin平台申请延期</br><br>链接: <a href=%s>点击</a></br>", delayLink)
- //机器删除提醒
- case model.MailTypeMachineDeleted:
- if user, err = s.dao.FindUserByUserName(machine.Username); err != nil {
- return
- }
- m.SetHeader("To", user.EMail)
- mailSendHead = fmt.Sprintf("machine named [%s] has been deleted on %s", machine.Name, time.Now().Format(model.TimeFormat))
- m.SetHeader("Subject", mailSendHead)
- //机器删除失败提醒
- case model.MailTypeTaskDeleteMachineFailed:
- m.SetHeader("To", s.c.Mail.NoticeOwner[0])
- mailSendHead = fmt.Sprintf("machine named [%s] has been failed to delete by task on %s", machine.Name, time.Now().Format(model.TimeFormat))
- m.SetHeader("Subject", mailSendHead)
- }
- if mailSendHead != "" {
- ml := &model.MailLog{
- ReceiverName: m.GetHeader("To")[0],
- MailType: mailType,
- SendHead: mailSendHead,
- SendContext: mailSendContext,
- }
- s.dao.SendMail(m)
- s.dao.InsertMailLog(ml)
- }
- return
- }
- // SendMailDeleteMachine Send Mail Delete Machine.
- func (s *Service) SendMailDeleteMachine(username string, machine *model.Machine) (err error) {
- var (
- mailSendHead = ""
- m = gomail.NewMessage()
- user *model.User
- )
- if user, err = s.dao.FindUserByUserName(machine.Username); err != nil {
- return
- }
- //是不是删自己机器
- if username == machine.Username {
- m.SetHeader("To", user.EMail)
- mailSendHead = fmt.Sprintf("Machine named [%s] has been deleted on %s", machine.Name, time.Now().Format(model.TimeFormat))
- m.SetHeader("Subject", mailSendHead)
- } else {
- var delUser *model.User
- if delUser, err = s.dao.FindUserByUserName(username); err != nil {
- m.SetHeader("To", user.EMail)
- } else {
- m.SetHeader("To", user.EMail, delUser.EMail)
- }
- mailSendHead = fmt.Sprintf("Machine named [%s] has been deleted on %s by %s", machine.Name, time.Now().Format(model.TimeFormat), username)
- m.SetHeader("Subject", mailSendHead)
- }
- for _, header := range m.GetHeader("To") {
- ml := &model.MailLog{
- ReceiverName: header,
- MailType: model.MailTypeMachineDeleted,
- SendHead: mailSendHead,
- SendContext: "",
- }
- s.dao.SendMail(m)
- s.dao.InsertMailLog(ml)
- }
- return
- }
- // SendMailApplyDelayMachineEndTime send mail apply delay machine end time.
- func (s *Service) SendMailApplyDelayMachineEndTime(ctx context.Context, auditor, applicant string, machineID int64, currentEndTime, applyEndTime time.Time) (err error) {
- var (
- userInfo *model.User
- machine *model.Machine
- )
- if userInfo, err = s.QueryUserInfo(ctx, auditor); err != nil {
- return
- }
- if machine, err = s.dao.QueryMachine(machineID); err != nil {
- return
- }
- timeNow := time.Now().Format(model.TimeFormat)
- currentET := currentEndTime.Format(model.TimeFormat)
- applyET := applyEndTime.Format(model.TimeFormat)
- mailSendHead, mailSendContext := applyDelayMachineEndTimeHeadAndContext(machine.Name, applicant, timeNow, currentET, applyET, _merlinUIAddr)
- err = s.sendMail(userInfo.EMail, mailSendHead, mailSendContext, model.MailTypeApplyDelayMachineEndTime)
- return
- }
- // SendMailAuditResult send mail audit result.
- func (s *Service) SendMailAuditResult(ctx context.Context, auditor, applicant string, machineID int64, auditResult bool) (err error) {
- var (
- userInfo *model.User
- machine *model.Machine
- )
- if userInfo, err = s.QueryUserInfo(ctx, applicant); err != nil {
- return
- }
- if machine, err = s.dao.QueryMachine(machineID); err != nil {
- return
- }
- timeNow := time.Now().Format(model.TimeFormat)
- mailSendHead, mailSendContext := auditResultHeadAndContext(machine.Name, timeNow, auditor, _merlinUIAddr, auditResult)
- err = s.sendMail(userInfo.EMail, mailSendHead, mailSendContext, model.MailTypeAuditDelayMachineEndTime)
- return
- }
- func (s *Service) sendMail(receiver, header, body string, mailType int) (err error) {
- m := gomail.NewMessage()
- m.SetHeader("To", receiver)
- m.SetHeader("Subject", header)
- m.SetBody("text/html", body)
- s.dao.SendMail(m)
- ml := &model.MailLog{
- ReceiverName: receiver,
- MailType: mailType,
- SendHead: header,
- SendContext: body,
- }
- err = s.dao.InsertMailLog(ml)
- return
- }
- func applyDelayMachineEndTimeHeadAndContext(machineName, applicant, timeNow, currentEndTime, applyEndTime, operateLink string) (head, context string) {
- head = fmt.Sprintf("申请延期机器 机器名:[%s] %s", machineName, timeNow)
- context = fmt.Sprintf("<br>申请延期机器: %s</br>"+
- "<br>申请者: %s</br>"+
- "<br>当前过期时间: %s</br>"+
- "<br>申请延期时间: %s</br>"+
- "<br>操作链接: <a href=%s>点击</a></br>", machineName, applicant, currentEndTime, applyEndTime, operateLink)
- return
- }
- func auditResultHeadAndContext(machineName, timeNow, auditor, operateLink string, auditResult bool) (head, context string) {
- auditResultStr := "驳回"
- if auditResult {
- auditResultStr = "通过"
- }
- head = fmt.Sprintf("申请延期机器审批结果 机器名:[%s] %s", machineName, timeNow)
- context = fmt.Sprintf("<br>申请延期机器: %s</br>"+
- "<br>审批者: %s</br>"+
- "<br>申请结果: %s</br>"+
- "<br>查看链接: <a href=%s>点击</a></br>", machineName, auditor, auditResultStr, operateLink)
- return
- }
- // SendMailForMultiUsers Send Mail For Multi Users.
- func (s *Service) SendMailForMultiUsers(ctx context.Context, receivers []string, mailSendHead string) (err error) {
- for _, receiver := range receivers {
- var userInfo *model.User
- if userInfo, err = s.QueryUserInfo(ctx, receiver); err != nil {
- continue
- }
- err = s.sendMail(userInfo.EMail, mailSendHead, "", model.MailTypeMachineTransfer)
- }
- return
- }
|