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("
可前往Merlin平台申请延期

链接: 点击
", 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("
申请延期机器: %s
"+ "
申请者: %s
"+ "
当前过期时间: %s
"+ "
申请延期时间: %s
"+ "
操作链接: 点击
", 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("
申请延期机器: %s
"+ "
审批者: %s
"+ "
申请结果: %s
"+ "
查看链接: 点击
", 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 }