123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- 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"`
- Url string `json:"url"`
- OrderCode string `json:"order_code"`
- InvoiceVariety string `json:"invoice_variety"`
- }
- )
- var (
- GmailAuth []*mail.GmailAuth
- mailConfigArr []*mailConfig
- )
- const (
- emailHtml_header = `<!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>电子发票</title>
- </head>
- <style type="text/css">
- html, body,a,div,p {
- margin:0;
- padding:0;
- }
- .jymail a{text-decoration: none !important;font-family: "PingFang SC";font-size: 15px;}
- .email{width: 680px;border: 1px solid #E0E0E0;background: #fff;margin: 20px auto;border-radius: 8px;}
- .jymail .top{height: 80px;width:100%%;padding: 0 40px;margin:0 auto;background-color: #2CB7CA;border-radius:8px 8px 0 0;clear: both;box-sizing: border-box;}
- .jymail .left{float:left;width:120px;height: 32px;margin: 20px 0;}
- .jymail .left img{width:100%%;height: 100%%;}
- .jymail .right{float: right;margin: 30px 0;}
- .jymail .right a{color: #fff;font-size: 14px;line-height: 18px;}
- .jymail .middle{width: 100%%;padding: 64px 40px;box-sizing: border-box;}
- .jymail .user{font-size: 18px;line-height: 24px;color: #1D1D1D;padding-bottom: 32px;}
- .jymail .text{font-size: 13px;line-height: 20px;color: #1D1D1D;}
- .jymail .download{display: inline-block;width: 90px;height: 30px;background-color: #2CB7CA;color: #fff;text-align: center;border-radius: 6px;line-height: 30px;}
- .jymail .warning{font-size: 12px;line-height: 20px;color: red;color: #FE737A;}
- .jymail .bottom{margin-top:32px;border-top: 4px solid #2CB7CA;background: #F5F5FB;padding: 32px 40px;box-sizing: border-box;border-bottom-left-radius: 8px;border-bottom-right-radius: 8px;}
- .jymail .item{margin-bottom: 10px;font-size: 12px;line-height: 24px;}
- .jymail .label{display: inline-block; min-width: 92px;color: #686868;}
- .jymail .value{color: #1D1D1D;}
- </style>
- <body>
- <div class="email jymail">
- <div class="top">
- <div class="left">
- <img src="https://www.jianyu360.com/images/pc/logo.png">
- </div>
- <div class="right">
- <a href="https://www.jianyu360.com">剑鱼首页</a>
- <span style="color: #fff;margin: 0 12px;">|</span>
- <a href="https://www.jianyu360.com/front/swordfish/toMyOrder">我的订单</a>
- </div>
- </div>
- <div class="middle">
- <p class="user">尊敬的用户您好!</p><b></b>
- <p class="text">感谢您在剑鱼标讯(<a href="https://www.jianyu360.com" style="color: #2CB7CA;">jianyu360.com</a>)购物!</p>
- <p class="text">剑鱼标讯已为您的订单: <span id="order_code">%s</span> 开具%s,总共 1 张。</p>
- <div style="padding: 32px 0;">
- %s
- </div>
- <p class="warning">安全提醒:剑鱼标讯平台及销售商不会以订单异常、系统升级等理由,通过任何方式发送给您退款链接。请您谨防钓鱼链接或诈骗电话!</p>
- <div class="bottom" >
- <p style="padding-bottom:16px;color: #2CB7CA; font-size: 14px;line-height: 24px;">发票信息</p>
- <p class="item">
- <span class="label">发票类型:</span>
- <span class="value">%s</span>
- </p>
- <p class="item">
- <span class="label">发票内容:</span>
- <span class="value">信息技术服务-技术服务费</span>
- </p>`
- emailHtml_gs = `<p class="item">
- <span class="label">公司名称:</span>
- <span class="value">%s</span>
- </p>
- <p class="item">
- <span class="label">纳税人识别号:</span>
- <span class="value">%s</span>
- </p>
- <p class="item">
- <span class="label">联系电话:</span>
- <span class="value">%s</span>
- </p>
- <p class="item">
- <span class="label">电子邮箱:</span>
- <span class="value">%s</span>
- </p>
- </div>
- </div>
- </div>
- </body>
- </html>`
- emailHtml_gr = `<p class="item">
- <span class="label">联系电话:</span>
- <span class="value">%s</span>
- </p>
- <p class="item">
- <span class="label">电子邮箱:</span>
- <span class="value">%s</span>
- </p>
- </div>
- </div>
- </div>
- </body>
- </html>`
- )
- 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", "<h1>Hello world</h1>", "测试邮件")
- }
- 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,url,order_code,invoice_variety FROM invoice WHERE %s = ? ", 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 {
- tType := "电子普通发票"
- if strings.Contains(ir.InvoiceVariety, "专用") {
- tType = "电子专用发票"
- }
- g.Dump(ir, strings.Contains(ir.InvoiceVariety, "专用"))
- switch ir.InvoiceType {
- case "单位":
- return fmt.Sprintf(emailHtml_header+emailHtml_gs, ir.OrderCode, tType, fmt.Sprintf("<a href=\"%s\" download class=\"download\">查看发票</a>", ir.Url), tType, ir.CompanyName, ir.TaxpayerIdentnum, ir.Phone, ir.Mail)
- case "个人":
- return fmt.Sprintf(emailHtml_header+emailHtml_gr, ir.OrderCode, tType, fmt.Sprintf("<a href=\"%s\" download class=\"download\">查看发票</a>", ir.Url), 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
- }
|