Z.S.K.'s Records

golang学习(golang搭建邮件系统解决Unrecognized authentication type)

最近在搞一个邮件RestfulAPI的邮件系统, 通过接口可直接发送邮件, 后端使用的是outlook,在测试过程发现会提示 Unrecognized authentication type错误, 折腾一下终于解决了, 记录一下.

刚开始的时候使用的是PlainAuth类型的认证方式, 因为之前的一个账号一直使用,没出过问题, 到这里就提示以下错误

1
504 5.7.4 Unrecognized authentication type [xxx.prod.partner.outlook.cn]

这个意思很明确, 不能识别的认证方式,PlainAuth这里简单说一下,PlainAuth的是大部分的邮件系统都支持的认证, 但由于是明文传输, 安全性不太好, 因此很多公司默认都关闭了.

可以通过telnet命令来查看一下邮件服务器支持的验证方式:

1
telnet yourmailserver 25

可以看到在这里是不支持PlainAuth这种认证方式的, 因此可以使用STARTTLS这种支持的方式

好在大部分情况下都支持我们使用自定义的认证.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
type loginAuth struct {
username, password string
}

func LoginAuth(username, password string) smtp.Auth {
return &loginAuth{username, password}
}

func (a *loginAuth) Start(server *smtp.ServerInfo) (string, []byte, error) {
return "LOGIN", []byte(a.username), nil
}

func (a *loginAuth) Next(fromServer []byte, more bool) ([]byte, error) {
if more {
switch string(fromServer) {
case "Username:":
return []byte(a.username), nil
case "Password:":
return []byte(a.password), nil
default:
return nil, errors.New("Unkown fromServer")
}
}
return nil, nil
}

// 发送邮件
// auth := smtp.PlainAuth("", user, passwd, host)
auth := LoginAuth(config.GlobalConfig.User, config.GlobalConfig.Password)

err := smtp.SendMail(mailServer, auth, config.GlobalConfig.User, to, []byte(msg)

将auth 从PlainAuth切换至自定义的auth即可.

目前该小工具已经开源, github在这里, 感兴趣的可以查看README.md

参考文章:

转载请注明出处https://izsk.me

Z.S.K. wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?