如何使用Outlook的SMTP服务器发送电子邮件?

时间:2019-09-04 07:54:03

标签: email go outlook

我想使用Outlook服务器发送电子邮件,但出现错误504 5.7.4 Unrecognized authentication type

这是代码段。

func sendEmail() {
    server := "smtp-mail.outlook.com
    port := 587
    user := "foo@outlook.com"
    from := user
    pass := "foobar"
    dest := "bar@gmail.com"

    auth := smtp.PlainAuth("", user, pass, server)

    to := []string{dest}

    msg := []byte("From: " + from + "\n" +
        "To: " + dest + "\n" +
        "Subject: Test outlook\n" +
        "OK")

    endpoint := server + ":" + port
    err := smtp.SendMail(endpoint, auth, from, to, msg)
    if err != nil {
        log.Fatal(err)
    }
}

如果我不是使用Outlook发送电子邮件,而是使用gmail,则可以正常工作。

在Python中,我可以使用Outlook并通过以下代码发送电子邮件:

    server = smtplib.SMTP(server, port)
    server.starttls()
    server.login(user, password)
    server.sendmail(from, to, msg)
    server.quit()

所以我想我的Go代码中缺少某些内容。根据{{​​3}},SendMail切换到TLS,所以这不应该成为问题。

1 个答案:

答案 0 :(得分:0)

auth := smtp.PlainAuth("", user, pass, server)

这使用身份验证方法PLAIN。不幸的是smtp-mail.outlook.com不支持此身份验证方法:

> EHLO example.com
< 250-AM0PR10CA0007.outlook.office365.com Hello ...
< 250- ...
< 250-AUTH LOGIN XOAUTH2

因此,仅支持LOGIN和XOAUTH2作为身份验证方法。

server.login(user, password)

Python支持LOGIN,因此它将成功。

Golang smtp不支持LOGIN。但是this gist似乎可以通过添加此缺少的身份验证方法来提供有效的解决方案。