[2023-01-16 07:26:49 最后更新]
一个能用 golang dkim 邮件签名库
https://github.com/toorop/go-dkim
有人提到过,不过好象没看到有人写明,所以放一个上来吧.
要说的是它的示例是过不了现在的一些邮件检测工具的,原因大概是签名的字段没有在邮件中出现. 我们现在能用的代码大概如下:
func make_dkim_mail(emailBase string) (string){
fmt.Println("make_dkim_mail()");
defer PrintError("make_dkim_mail"); //奇怪没有阻止异常//不是没阻止,是返回值为空了
//--------------------------------------------------
// email is the email to sign (byte slice)
// privateKey the private key (pem encoded, byte slice )
options := dkim.NewSigOptions(); //从源码可知,默认用的算法是 "rsa-sha256",
//options.PrivateKey = privateKey; //私钥,应该可以用 openssl 生成
////options.PrivateKey = []byte(privateKey); //私钥,应该可以用 openssl 生成
options.PrivateKey = []byte(gPrivateKey_dkim_email); //私钥,应该可以用 openssl 生成
email := []byte(emailBase);
//options.Domain = "mydomain.tld"
options.Domain = "newbt.net"
//options.Selector = "myselector"; //不清楚做什么用//163.com 的是 s110527 这样的
options.Selector = "default"; //不清楚做什么用//163.com 的是 s110527 这样的//似乎是要和 dns 中的相对应
////options.SignatureExpireIn = 3600; //似乎是过期时间,怎样设置成永久? qq 推荐为永久//似乎不要这个就不要有 "x" 标记值了
////options.BodyLength = 50; //似乎不要这个比较好
////options.Headers = []string{"from", "date", "mime-version", "received", "received"}
//var headers = new string[] { "From", "To", "Subject" }; //参考 https://www.cnblogs.com/dudu/archive/2013/03/02/csharp-dkim-sendmail.html
options.Headers = []string{"from", "to", "subject"}; //照例子签名太多字段是过不了检测的
options.AddSignatureTimestamp = true
options.Canonicalization = "relaxed/relaxed"; //计算方式,表示 crlf 和 空白的算法
err := dkim.Sign(&email, options)
// handle err..
// And... that's it, 'email' is signed ! Amazing© !!!
fmt.Println(err);
fmt.Println(string(email));
return string(email);
}//