package services import ( "encoding/json" "errors" "eta/eta_api/utils" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" tencentErr "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile" ses "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ses/v20201002" "time" ) // TencentEmail 腾讯云邮件 type TencentEmail struct { Client *ses.Client } // NewClient func (te *TencentEmail) NewClient() (err error) { if utils.TencentSDKSecretId == `` { err = errors.New("腾讯云邮箱未配置") return } // 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密 // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取 credential := common.NewCredential( utils.TencentSDKSecretId, utils.TencentSDKSecretKey, ) // 实例化一个client选项,可选的,没有特殊需求可以跳过 cpf := profile.NewClientProfile() cpf.HttpProfile.Endpoint = "ses.tencentcloudapi.com" // 实例化要请求产品的client对象,clientProfile是可选的 client, _err := ses.NewClient(credential, "ap-hongkong", cpf) te.Client = client err = _err return } // TencentEmailTemplateData 邮箱模板替换数据 type TencentEmailTemplateData struct { REPORT_TITLE string `description:"报告标题"` REPORT_ABSTRACT string `description:"报告摘要"` REPORT_CONTENT string `description:"报告内容"` REPORT_SHARE_LINK string `description:"报告分享链接"` REPORT_TIME string `description:"报告时间"` } // TencentEmailResult 邮件推送响应体 type TencentEmailResult struct { Code string `description:"错误码"` Message string `description:"响应信息"` RequestId string `description:"请求成功-请求ID"` } // SendEmail 推送模板邮件 func (te *TencentEmail) SendEmail(req *EnglishReportSendEmailRequest) (ok bool, result string, err error) { if te.Client == nil { if e := te.NewClient(); e != nil { err = e return } } // 实例化一个请求对象,每个接口都会对应一个request对象 request := ses.NewSendEmailRequest() // 模板数据替换 tmpData := &TencentEmailTemplateData{ REPORT_TITLE: req.ReportTitle, REPORT_ABSTRACT: req.ReportAbstract, REPORT_CONTENT: req.ReportContent, REPORT_SHARE_LINK: req.ReportShareLink, REPORT_TIME: req.ReportTime, } tmpDataByte, e := json.Marshal(tmpData) if e != nil { err = e return } tmpDataStr := string(tmpDataByte) request.Template = &ses.Template{ TemplateID: common.Uint64Ptr(utils.TencentEmailTemplateID), TemplateData: common.StringPtr(tmpDataStr), } request.FromEmailAddress = common.StringPtr(utils.TencentEmailFromEmailAddress) request.Destination = common.StringPtrs([]string{req.Email}) request.Subject = common.StringPtr(req.Subject) // 返回的resp是一个SendEmailResponse的实例,与请求对象对应 response, e := te.Client.SendEmail(request) if _, o := e.(*tencentErr.TencentCloudSDKError); o { errByte, _ := json.Marshal(e) result = string(errByte) return } if e != nil { err = e return } ok = true result = response.ToJsonString() return } // BatchSendEmail 批量推送邮件 func (te *TencentEmail) BatchSendEmail(list []*EnglishReportSendEmailRequest) (results []*EnglishReportSendEmailResult, err error) { results = make([]*EnglishReportSendEmailResult, 0) if len(list) == 0 { return } if e := te.NewClient(); e != nil { err = e return } // SendEmail接口有QPS20的限制, 保险起见每秒只请求10次接口 max := 10 c := 0 for i := range list { if c >= max { time.Sleep(time.Second) c = 0 } c += 1 dataByte, _ := json.Marshal(list[i]) ok, result, _ := te.SendEmail(list[i]) results = append(results, &EnglishReportSendEmailResult{ ReportId: list[i].ReportId, EmailId: list[i].EmailId, Email: list[i].Email, Ok: ok, SendData: string(dataByte), ResultData: result, Source: 1, }) } return } // TencentEmailCallBack 回调请求体 type TencentEmailCallBack struct { Event string `description:"事件类型"` Email string `description:"收件人地址"` Link string `description:"用户点击的邮件中的链接 URL,仅在event=click时生效"` BulkId string `description:"SendEmail 接口返回的 MessageId"` Timestamp int `description:"事件产生的时间戳"` Reason string `description:"邮件递送失败的原因"` BounceType string `description:"如果收件人邮件服务商拒信,拒信类型,取值:soft_bounce | hard_bounce,仅在event=bounce的时候生效"` Username string `description:"腾讯云账号对应的 appId"` From string `description:"发信地址(不带发件人别名)"` FromDomain string `description:"发信域名"` TemplateId int `description:"模板 Id"` } //func init() { // fmt.Println("start email init") // // te := new(TencentEmail) // te.NewClient() // req := new(EnglishReportSendEmailRequest) // req.Subject = "这是一封邮件的主题" // req.Email = "" // req.ReportTitle = "Report Hello World" // req.ReportAbstract = "This is abstract" // req.ReportContent = "This is content" // req.ReportShareLink = "https://share.hzinsights.com/reportEn?code=a226e450e214f350856e2980b6e55ac9" // req.ReportTime = "2022/11/23" // // ok, result, e := te.SendEmail(req) // fmt.Println(ok) // if e != nil { // fmt.Println("出错了: ", e) // } else { // fmt.Println("没出错: ", result) // } // // fmt.Println("end email init") //}