Go语言调用AWS SES实现邮件页脚动态年份展示问题咨询
你的猜测是错误的。
问题根因
所有主流邮件客户端出于安全考虑,都会默认拦截、禁用HTML邮件中的JavaScript代码。你在本地浏览器打开HTML文件时JS能正常执行,但邮件发送后,收件方的邮件客户端不会执行你插入的document.write脚本,所以年份位置显示为空,和AWS SES将HTML转为字符串传递没有关系,这是所有邮件服务商发HTML邮件的通用限制。
实现方案
你可以在服务端发送邮件前,直接把当前年份渲染到HTML模板中,不需要依赖前端JS执行,具体操作如下:
- 修改HTML邮件模板的页脚代码,把年份位置替换成占位符:
<span style="font-family:lato,helvetica neue,helvetica,arial,sans-serif"><em>Copyright © {{.CurrentYear}} Hive Wealth, All rights reserved.</em><br></span><br>
- 修改Go发送代码,使用Go标准库的模板引擎渲染HTML内容,传入当前年份:
import ( "html/template" "bytes" "time" // 其他你原有导入的包保持不变 ) // 原有读取文件的逻辑替换为模板渲染 tpl, err := template.ParseFiles(fmt.Sprintf("./schemas/html/%s.html", template)) if err != nil { Logger.Error("parse template err", zap.Any("err", err)) return } // 传入模板需要的动态参数 data := map[string]interface{}{ "CurrentYear": time.Now().Year(), // 其他动态内容(比如用户名、验证码等)也可以放在这个map里 } // 渲染得到最终的HTML字符串 var htmlBuf bytes.Buffer if err = tpl.Execute(&htmlBuf, data); err != nil { Logger.Error("render template err", zap.Any("err", err)) return } htmlBody := htmlBuf.String() // 后续SES发送逻辑保持不变,直接使用上面渲染好的htmlBody即可 charSet := "UTF-8" input := &ses.SendEmailInput{ Destination: &ses.Destination{ CcAddresses: []*string{}, ToAddresses: []*string{ aws.String(recipient), }, }, Message: &ses.Message{ Body: &ses.Body{ Html: &ses.Content{ Charset: aws.String(charSet), Data: aws.String(htmlBody), }, Text: &ses.Content{ Charset: aws.String(charSet), Data: aws.String(textBody), }, }, Subject: &ses.Content{ Charset: aws.String(charSet), Data: aws.String(subject), }, }, Source: aws.String(sender), } result, err := ns.SendEmail(input)
内容的提问来源于stack exchange,提问作者Mia Mia
相关产品推荐
相关产品推荐

