/// <summary> /// 对邮件内容进行签名,如果出错将返回错误 /// </summary> public Result Sign(MailMessage message) { var rtv = new Result(); message.Headers.Set(DKIMTimeKeyT, DateTime.Now.ToUniversalTime().ToString("r").Replace("GMT", "+000")); message.Headers.Remove(EMail_DKIM.DKIMTimeKeyTS); var rawRes = EMail_DKIM_MailMessageText.ToRAW(message); if (rawRes.IsError) { rawRes.errorTo(rtv); return(rtv); } var signRes = Sign(rawRes.Value); if (signRes.IsError) { rawRes.errorTo(rtv); return(rtv); } message.Headers.Set(DKIMKey, signRes.Value); return(rtv); }
/// <summary> /// 获取待签名的header /// /// signParams="...; b="。 /// /// dkimKeyOrNull为null时会格式化signParams用于对发送邮件进行签名,如果是验证签名必须提供这个key,因为不知道源格式是什么样的字符串,而且不会对signParams做任何处理。 /// /// signHeaderNames要一起签名的header,From一定会有。 /// /// 返回内容(relaxed/simple https://service.mail.qq.com/cgi-bin/help?subtype=1&id=16&no=1001507): /// k:v /// k:v /// DKIM-Signature:...; b= /// </summary> public Result <string> GetSignHeader(bool relaxed, string signParams, string dkimKeyOrNull, List <string> signHeaderNames) { var rtv = new Result <string>(); var headVals = new List <string>(); Action <string, string> addHead = (key, val) => { if (relaxed) { val = ReduceWitespace(val.Trim()); headVals.Add(key.Trim().ToLower() + ":" + val); } else { headVals.Add(key + ":" + val); } }; foreach (var key in signHeaderNames) { var val = GetHeader(key); addHead(key, val); } if (dkimKeyOrNull != null) { addHead(dkimKeyOrNull, signParams); } else { //生成空白签名内部格式,签名专用 var msg = new MailMessage("*****@*****.**", "*****@*****.**"); msg.HeadersEncoding = Encoding.UTF8; msg.Subject = new string('a', 1024); msg.Body = new string('a', 1024); msg.Headers.Add(EMail_DKIM.DKIMKey, signParams + new string('0', 70)); var rawRes = EMail_DKIM_MailMessageText.ToRAW(msg); if (rawRes.IsError) { rawRes.errorTo(rtv); return(rtv); } var wDkim = rawRes.Value.GetHeader(EMail_DKIM.DKIMKey); wDkim = wDkim.Substring(0, wDkim.Length - 70); addHead(EMail_DKIM.DKIMKey, wDkim); } rtv.Value = headVals.join("\r\n"); return(rtv); }
static void EMailTest() { var domain = "test.localhost"; var selector = "op"; //DKIM签名私钥 var rsa = new RSA.RSA(@" -----BEGIN RSA PRIVATE KEY----- MIIBOwIBAAJBALYyNggDBZ2SjrnZsOolGW1UWjf5Mt6P3zmitHctuOv8TvkdAAnH knzM8soIWXFUjQ3yTSweJ54hvX2UmDpjEe0CAwEAAQJAM7vkLbg18v03e7w9iO7J 3opyJ6yh7iJqHyJ9Hc4k0RTT69q+rTWky2NNOQjDIb7dFiN8soXSttkgxJWHpvS1 XQIhANphUALecb2vyi9fVtZsLf+IPHQQSxmaRwpszmXqvD/jAiEA1ZUp/cLuPhvL aVGoAOpMI3+tTrAS+rD4ynS9m+pQb+8CIQDWGgQ029wNyhRi/4kGrocmeW4zqGnI zy4JNYXh/BLWWwIgMnLhUEdS7uixy1a2UEEHavslfIiqcvyKR4f7oXBfP5ECIQDK B4JqZMGSBWkvkoGZOoTEr5UF7/EUeZIjux3wm2wYXA== -----END RSA PRIVATE KEY----- ", true); Console.WriteLine("【DKIM测试公钥512位(PEM)】:"); Console.WriteLine(rsa.ToPEM_PKCS1(true)); Console.WriteLine(); var dkim = new EMail_DKIM(domain, selector, rsa); Action <Action <EMail> > create = (call) => { //投递邮件给qq服务器 using (var email = new EMail()) { //new EMail("mx1.qq.com", 25),默认会自动解析收件箱的mx记录,得到smtp服务器地址,如果是要通过发件服务器来发送,则需要手动填写为发件服务器地址 //使用签名 email.TryUseDKIM(dkim); email.FromEmail = "test@" + domain; email.ToEmail("*****@*****.**"); //改成有效的邮箱地址 //添加附件 email.AddAttachment("abc文本内容123", "文本.txt"); email.AddAttachment("未命名文件内容,红红火火恍恍惚惚", ""); call(email); } }; create((email) => { //发送邮件出去,去垃圾箱找,如果私钥是域名设置的话正常点 var res = email.Send("标题", "内容"); Console.WriteLine("【邮件发送】"); Console.WriteLine(res.IsError ? "失败:" + res.ErrorMessage : "成功"); Console.WriteLine(); }); create((email) => { int len; var msg = email.BuildMessage("标题", "内容", out len).Value; //手动签名 dkim.Sign(msg); //获取邮件内容 var raw = EMail_DKIM_MailMessageText.ToRAW(msg); if (raw.IsError) { Console.WriteLine("获取邮件内容出错:" + raw.ErrorMessage); return; } Console.WriteLine("【验证签名】"); Console.WriteLine(dkim.Verify(raw.Value) ? "合法" : "非法"); Console.WriteLine(); Console.WriteLine("【邮件(.eml)内容】"); Console.WriteLine(raw.Value.Raw); }); create((email) => { //设置发送到文件夹内,保存邮件,不投递 var dir = "d:/.email测试保存邮件文件夹"; Directory.CreateDirectory(dir); email.OnSendBefore = (msg, smtp) => { smtp.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; smtp.PickupDirectoryLocation = dir; return(true); }; var res = email.Send("标题", "内容"); Console.WriteLine("【另类保存】"); Console.WriteLine("目录:" + dir); Console.WriteLine("结果:" + (res.IsError ? "失败," + res.ErrorMessage : "已保存")); }); }