【发布时间】:2019-11-11 16:06:23
【问题描述】:
我正在尝试使用默认的 Go 包 net/smtp 创建一个简单的 Go 电子邮件服务 - 我知道有 gomailer,但我想使用标准库
我需要有关配置 tls/server 设置以使用 Office365
的帮助我相信我有正确的主机:
smtp.office365.com:587
但是,通过复制 Microsoft 提供的 smtp 文档,我在运行以下代码时在控制台中收到以下错误:
错误:tls:第一条记录看起来不像 TLS 握手 恐慌:运行时错误:无效的内存地址或 nil 指针取消引用
package main
import (
"fmt"
"net"
mail "net/mail"
smtp "net/smtp"
)
func main() {
from := mail.Address{"", "example@example.com"}
to := mail.Address{"", "example@example.com"}
subject := "My test subject"
body := "Test email body"
// Setup email headers
headers := make(map[string]string)
headers["From"] = from.String()
headers["To"] = to.String()
headers["Subject"] = subject
message := ""
for k, v := range headers {
message += fmt.Sprintf("%s: %s\r\n", k, v)
}
message += "\r\n" + body
servername := "smtp.office365.com:587"
host, _, _ := net.SplitHostPort(servername)
auth := smtp.PlainAuth("", "example@example.com", "password", host)
tlsconfig := &tls.Config{
InsecureSkipVerify: true,
ServerName: host,
}
conn, err := tls.Dial("tcp", "smtp.office365.com:587", tlsconfig)
if err != nil {
fmt.Println("tls.Dial Error: %s", err)
}
c, err := smtp.NewClient(conn, host)
if err != nil {
fmt.Println("smtp.NewClient Error: %s", err)
}
if err = c.Auth(auth); err != nil {
fmt.Println("c.Auth Error: %s", err)
}
if err = c.Mail(from.Address); err != nil {
fmt.Println("c.Mail Error: %s", err)
}
if err = c.Rcpt(to.Address); err != nil {
fmt.Println("c.Rcpt Error: %s", err)
}
w, err := c.Data()
if err != nil {
fmt.Println("c.Data Error: %s", err)
}
_, err = w.Write([]byte(message))
if err != nil {
fmt.Println("Error: %s", err)
}
err = w.Close()
if err != nil {
fmt.Println("reader Error: %s", err)
}
c.Quit()
}
任何 O365 客户端的示例都将受到赞赏,或者任何人都可以发现似乎可疑的任何东西都会很棒
谢谢
【问题讨论】:
-
此服务器似乎不支持完全加密的连接。试试StartTLS。
-
你搞定了吗,以下答案都不适合我!