我正在尝试用一些CSS编写HTML,以通过电子邮件发送。电子邮件通过 Go 命令行执行发送。但它在发送电子邮件时返回有关 CSS 属性的错误。
我收到属性错误,例如,background: rgb(255, 255, 255)
或padding
的某些属性,它在终端中返回"未找到"错误。
<div style="margin: 0; padding: 0; background: #ffffff; font-family: Montserrat, sans-serif; font-size: 16px; color: #313131">
上面是我正在使用的一大块 html 和 css 属性。
以下是通过命令行发送电子邮件的代码:
package utils
import(
"bytes"
"html/template"
"os/exec"
"fmt"
)
type EmailRequest struct{
EmailTo string
EmailSubject string
EmailBody string
}
func (request *EmailRequest) EmailSend(notificationTemplateData interface{}) (bool, error) {
subject, errParse := ParseTemplate(request.EmailSubject, notificationTemplateData)
body, errParse := ParseTemplate(request.EmailBody, notificationTemplateData)
if errParse != nil{
return false, errParse
}
err := ExecuteCommand("echo ""+body+" " | mail -s "$(echo " "+subject+" nMIME-version: 1.0;nContent-Type: text/html;charset="UTF-8";n")" "+request.EmailTo)
if err != nil {
return false, err
}
return true, nil
}
func ParseTemplate(templateHtml string, data interface{}) (string, error) {
var body string
t, err := template.New("test").Parse(templateHtml)
if err != nil {
return body, err
}
buf := new(bytes.Buffer)
if err = t.Execute(buf, data); err != nil {
return body, err
}
body = buf.String()
return body, nil
}
func ExecuteCommand(command string) error{
cmd := exec.Command("sh", "-c",command)
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
return err
}
fmt.Println("Result: " + out.String())
return nil
}
我有一个编辑器,客户可以在其中配置其自定义模板。显然,客户可以添加任何CSS属性。因此,对于随机属性,它会导致错误。
我从上面的错误中了解到的是,它为随机CSS属性抛出了错误,或者是否有任何CSS规则可以通过go命令行发送电子邮件?
编辑:
以下是我在运行 EmailSend(( 函数时在终端中遇到的错误。
sh:
padding: not found
sh:
background: not found
正如Adrian在上面的评论中提到的,我使用go命令本身来解析html和css属性。下面是一个大大简化的解决方案,通过命令行使用 html 和 css 发送电子邮件。
func (request *EmailRequest) EmailSend(notificationTemplateData interface{}) (bool, error) {
subject, errParse := ParseTemplate(request.EmailSubject, notificationTemplateData)
body, errParse := ParseTemplate(request.EmailBody, notificationTemplateData)
if errParse != nil{
return false, errParse
}
err := ExecuteMailCommand("mail -s "$(echo " "+subject+" nMIME-version: 1.0;nContent-Type: text/html;charset="UTF-8";n")" "+request.EmailTo, body)
if err != nil {
return false, err
}
return true, nil
}
func ExecuteMailCommand(command string, body string) error {
cmd := exec.Command("sh", "-c", command)
cmd.Stdin = bytes.NewBufferString(body)
stdout, err := cmd.CombinedOutput()
if err != nil {
fmt.Printf("%vn", err)
return err
}
fmt.Printf("%sn", stdout)
return nil
}
在上面的代码中,函数 ParseTemplate 将保持不变。
谢谢!