我正在尝试用sendgrid和golang发送邮件。即时通信使用"github.com/sendgrid/sendgrid-go"
每当我在代码中运行发送电子邮件的部分时,我都会收到这个错误:
sendgrid.go: error:net/http: Client Transport of type init.failingTransport doesn't support CancelRequest; Timeout not supported; response:<nil>我想不出这是什么..
这是我的代码:
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
}发布于 2016-03-15 07:40:52
在Go中正常使用Sendgrid API
在Go中使用Sendgrid API的最小程序如下所示:
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.DefaultTransport。init.failingTransport是一个虚拟的传输方法,基本上只是抛出一个错误。
这最终是一个简单的改变。只需导入"appengine/urlfetch"并添加
client := urlfetch.Client(ctx)App Engine上的SendGrid Go应用编程接口的完整示例
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发送一封电子邮件。
To: test@example.org
From: ezra@usefuliftrue.com
Subject: SUBJECT HERE
BODY OF THE EMAIL请注意
不要在源代码中包含API密钥,或者将它们提交给源代码控制。上述方法是不可取的。
https://stackoverflow.com/questions/35267085
复制相似问题