0

我是 Go 和 Echo 的初学者。我需要存储一个 html 模板(电子邮件模板),它还将包含一些作为上下文传递的详细信息。以便它可以存储到正文列(MySQL 中的文本)并稍后触发。

if user.Email !=""{
            visitingDetails := H{"user_name"      : user.Fname,
                                 "location"       : location.Name,
                                 "visitor_company": visitor.Company,
                                 "visitor_name"   : visitor.Fname +" "+visitor.Lname,
                                 "visitor_phone"  : visitor.Phone,
                                 "visitor_email"  : visitor.Email,
                                 "visitor_fname"  : visitor.Fname,
                                 "visitor_image"  : visitor.ProfilePicture,
                              }
            subject := visitor.Fname +" has come to visit you at the reception"
            body := c.Render(http.StatusOK,"email/user_notify_email.html",visitingDetails)
            emailJob := models.EmailJob{Recipients: visitor.Email , Subject: subject, Body: body}
            db.Create(&emailJob)
            if db.NewRecord(emailJob){
                fmt.Println("Unable to send email")
            }
        }

电子邮件工作

type EmailJob struct {
    Id              int       
    Recipients      string    
    Subject         string   
    Body            string          
    Sent            int        
    Error           string 
}

func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
    return t.templates.ExecuteTemplate(w, name, data)
}

正文 := c.Render(http.StatusOK,"email/user_notify_email.html",visitingDetails)

此行给出错误,因为它返回渲染错误。我不知道我会怎么做?我希望我说清楚了。一点帮助将不胜感激。

4

2 回答 2

1

您使用的context.Render方法不正确。

https://github.com/labstack/echo/blob/master/context.go#L111

// Render renders a template with data and sends a text/html response with status
// code. Renderer must be registered using `Echo.Renderer`.
Render(code int, name string, data interface{}) error

Render 方法呈现模板并将其作为响应发送。这个方法返回一个错误值,如果发生了意外,这个错误值就是对它的描述。否则,它等于nil。见:https ://golang.org/pkg/errors/

为了使用渲染器,您必须注册它,并且您可以使用该注册的渲染器来获取渲染的模板文本并将其保存在数据库中。

您可以在 Echo 框架的单元测试中看到示例渲染器:https ://github.com/labstack/echo/blob/master/context_test.go#L23

希望这可以帮助。

于 2018-02-18T20:44:38.380 回答
1

在做了一些事情并理解了 golang 中的模板之后。我想出了这样的解决方案。

t, err := template.ParseFiles("templates/email/user_notify_email.html")
        if err != nil {
            fmt.Println("Error happend")
            fmt.Println(err)
            return c.JSON(http.StatusOK, data)
        }
        buf := new(bytes.Buffer)
        if err = t.Execute(buf, visitingDetails); err != nil {
            fmt.Println(err)
        }
        body := buf.String()

而现在这具尸体可以被储存起来。Body 已经渲染了我需要的模板。这篇文章很多功劳https://medium.com/@dhanushgopinath/sending-html-emails-using-templates-in-golang-9e953ca32f3d

于 2018-02-20T17:22:07.447 回答