123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- 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")
- //}
|