首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go sendgrid失败

Go sendgrid失败
EN

Stack Overflow用户
提问于 2016-02-08 18:14:38
回答 1查看 550关注 0票数 0

我正在尝试用sendgrid和golang发送邮件。即时通信使用"github.com/sendgrid/sendgrid-go"

每当我在代码中运行发送电子邮件的部分时,我都会收到这个错误:

代码语言:javascript
复制
sendgrid.go: error:net/http: Client Transport of type init.failingTransport doesn't support CancelRequest; Timeout not supported; response:<nil>

我想不出这是什么..

这是我的代码:

代码语言:javascript
复制
sg := sendgrid.NewSendGridClientWithApiKey("string")
    email := sendgrid.NewMail()
    email.AddTo(req.Email)
    email.SetSubject("Confirm your registration at domain")
    email.SetFrom("noreply@domain.com")
    email.SetFromName("domain")
    email.SetText(url)
    if r := sg.Send(email); r == nil {
        log.Infof(ctx, "email sent")
    } else {
        log.Errorf(ctx, "email not sent %v", r)
        w.WriteHeader(http.StatusInternalServerError)
        return
    }
EN

回答 1

Stack Overflow用户

发布于 2016-03-15 07:40:52

在Go中正常使用Sendgrid API

在Go中使用Sendgrid API的最小程序如下所示:

代码语言:javascript
复制
package main

import (
    "fmt"
    "github.com/sendgrid/sendgrid-go"
)

func main() {
    key := "SENDGRID_API_KEY"
    sg := sendgrid.NewSendGridClientWithApiKey(key)

    message := sendgrid.NewMail()
    message.AddTo("ezra@usefultiftrue.com")
    message.SetFrom("test@example.org")
    message.SetSubject("SUBJECT HERE")
    message.SetHTML("BODY OF THE EMAIL")

    if r := sg.Send(message); r == nil {
        fmt.Println("Sent!")
    } else {
        fmt.Println(r)
    }
}

您可以看到Sendgrid Go Documentation on Github

App Engine上的怪癖

问题是您正在尝试使用默认的net/http客户端获取Url,这是App Engine不允许的。You must use urlfetch to make HTTP requests on App Engine.

您可以通过指定您的*http.Client来使用urlfetch来解决这个问题,因为Sendgrid使用的客户端在默认情况下使用不允许的http.DefaultTransportinit.failingTransport是一个虚拟的传输方法,基本上只是抛出一个错误。

这最终是一个简单的改变。只需导入"appengine/urlfetch"并添加

代码语言:javascript
复制
client := urlfetch.Client(ctx)

App Engine上的SendGrid Go应用编程接口的完整示例

代码语言:javascript
复制
package ezralalonde

import (
    "appengine"
    "appengine/urlfetch"
    "fmt"
    "github.com/sendgrid/sendgrid-go"
    "net/http"
)

func send(w http.ResponseWriter, r *http.Request) {
    key := "SENDGRID_API_KEY"
    sg := sendgrid.NewSendGridClientWithApiKey(key)

    // must change the net/http client to not use default transport
    ctx := appengine.NewContext(r)
    client := urlfetch.Client(ctx)
    sg.Client = client // <-- now using urlfetch, "overriding" default

    message := sendgrid.NewMail()
    message.AddTo("ezra@usefultiftrue.com")
    message.SetFrom("test@example.org")
    message.SetSubject("SUBJECT HERE")
    message.SetHTML("BODY OF THE EMAIL")

    if e := sg.Send(message); e == nil {
        fmt.Fprintln(w, "Sent!")
    } else {
        fmt.Fprintln(w, e)
    }
}

func init() {
    http.HandleFunc("/", send)
}

现在,每次访问/都会导致SendGrid向test@example.org发送一封电子邮件。

代码语言:javascript
复制
To: test@example.org
From: ezra@usefuliftrue.com
Subject: SUBJECT HERE

BODY OF THE EMAIL

请注意

不要在源代码中包含API密钥,或者将它们提交给源代码控制。上述方法是不可取的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35267085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档