package service import ( "app.yhyue.com/moapp/jybase/mail" "context" "fmt" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" "strings" "time" ) type ( mailConfig struct { Addr string Port int Pwd string User string } invoiceRecord struct { InvoiceType string `json:"invoice_type"` Mail string `json:"mail"` TaxpayerIdentnum string `json:"taxpayer_identnum"` CompanyName string `json:"company_name"` Phone string `json:"phone"` SourceUrl string `json:"source_url"` OrderCode string `json:"order_code"` InvoiceVariety string `json:"invoice_variety"` InvoiceContent string `json:"invoice_content"` InvoiceOrderCode string `json:"invoice_order_code"` } ) var ( GmailAuth []*mail.GmailAuth mailConfigArr []*mailConfig ) const ( emailHtml_header = ` 电子发票

尊敬的用户您好!

感谢您在剑鱼标讯(jianyu360.com)购物!

剑鱼标讯已为您的订单: %s 开具%s,总共 1 张。

%s

安全提醒:剑鱼标讯平台及销售商不会以订单异常、系统升级等理由,通过任何方式发送给您退款链接。请您谨防钓鱼链接或诈骗电话!

发票信息

发票类型: %s

发票内容: %s

` emailHtml_gs = `

公司名称: %s

纳税人识别号: %s

联系电话: %s

电子邮箱: %s

` emailHtml_gr = `

联系电话: %s

电子邮箱: %s

` ) func init() { ctx := context.Background() err := g.Cfg().MustGet(ctx, "mailConfig").Struct(&mailConfigArr) if err != nil { g.Log().Panic(ctx, "初始化邮件配置异常") } for _, v := range mailConfigArr { GmailAuth = append(GmailAuth, &mail.GmailAuth{ SmtpHost: v.Addr, SmtpPort: v.Port, User: v.User, Pwd: v.Pwd, }) } //SendMail(ctx, "wangkaiyue@topnet.net.cn", "

Hello world

", "测试邮件") } func SendMail(ctx context.Context, targetMail, html, title string) error { for k, v := range GmailAuth { if mail.GSendMail("剑鱼标讯", targetMail, "", "", title, html, "", "", v) { g.Log().Infof(ctx, "发送邮件成功%s", targetMail) break } if k < len(GmailAuth)-1 { g.Log().Infof(ctx, "发送邮件失败%s!3s后使用其他邮箱尝试", targetMail) } else { return gerror.Newf("发送邮件失败%s![final]", targetMail) } time.Sleep(time.Second * 3) } return nil } func SendInvoiceSuccessMail(ctx context.Context, callBackId string) error { var ( queryItem, queryValue string err error record invoiceRecord ) queryItem, queryValue, err = GetQueryObj(callBackId) if err != nil { return err } res, err := g.DB().GetOne(ctx, fmt.Sprintf("SELECT invoice_type,mail,taxpayer_identnum,company_name,phone,source_url,order_code,invoice_variety,invoice_content,invoice_order_code FROM invoice WHERE %s = ? AND invoice_status=1 order by id desc limit 1", queryItem), queryValue) if err != nil { return gerror.Wrapf(err, "未查询到订单发票信息 %s:%s", queryItem, queryValue) } if err = res.Struct(&record); err != nil { return gerror.Wrapf(err, "格式化发票信息异常") } if record.Mail == "" { return nil } return SendMail(ctx, record.Mail, record.GetMailHtmlContext(), "电子发票") } func (ir *invoiceRecord) GetMailHtmlContext() string { var ( tType = "电子普通发票" invoiceContext = "信息技术服务-技术服务费" showOrderCode = ir.OrderCode ) if strings.Contains(ir.InvoiceVariety, "专用") { tType = "电子专用发票" } if ir.InvoiceContent != "" { invoiceContext = ir.InvoiceContent } if ir.InvoiceOrderCode != "" { showOrderCode = ir.InvoiceOrderCode } switch ir.InvoiceType { case "单位": return fmt.Sprintf(emailHtml_header+emailHtml_gs, showOrderCode, tType, fmt.Sprintf("查看发票", ir.SourceUrl), invoiceContext, tType, ir.CompanyName, ir.TaxpayerIdentnum, ir.Phone, ir.Mail) case "个人": return fmt.Sprintf(emailHtml_header+emailHtml_gr, showOrderCode, tType, fmt.Sprintf("查看发票", ir.SourceUrl), invoiceContext, tType, ir.Phone, ir.Mail) } return "" } func GetQueryObj(callBackId string) (query, value string, err error) { arr := strings.Split(callBackId, ":") if len(arr) != 2 { err = gerror.Newf("callBackId id异常%s", callBackId) return } query, value = arr[0], arr[1] return }