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 : "已保存")); }); }
/// <summary> /// 发送邮件 /// </summary> public Result Send(string title, string content, bool isHtml = true) { var rtv = new Result(); if (String.IsNullOrEmpty(SmtpHost)) { rtv.error("必须提供发送邮件的smtp地址"); return(rtv); } if (_ToEmails.Count == 0) { rtv.error("需要设置发送到的邮件地址"); return(rtv); } MailMessage msg = null; var smtp = new SmtpClient(); //SmtpConnection Hello 乱发名字 try { var attr = smtp.GetType().GetField("clientDomain", Monitor.AllFlag); attr.SetValue(smtp, ClientName); } catch (Exception e) { rtv.fail("无法设置客户端名称:" + e.Message, e.ToString()); return(rtv); } try { int dataLen; var msgRes = BuildMessage(title, content, out dataLen, isHtml); if (msgRes.IsError) { msgRes.errorTo(rtv); return(rtv); } msg = msgRes.Value; var timeout = TimeoutMillisecond; if (timeout == defaultTimeout) { //重新计算超时时间 timeout = Math.Max((dataLen / (50 * 1024)) * 1000, defaultTimeout); } while (_DKIM != null) { if (dataLen > DKIM_MaxLen) { break; } var res = _DKIM.Sign(msg); if (res.IsError) { res.errorTo(rtv); return(rtv); } break; } smtp.Host = SmtpHost; smtp.Port = SmtpPort; smtp.EnableSsl = SmtpSSL; if (!String.IsNullOrEmpty(User)) { smtp.Credentials = new NetworkCredential(User, Password); } smtp.Timeout = timeout; if (OnSendBefore != null) { if (!OnSendBefore(smtp)) { rtv.error("邮件发送前被取消"); return(rtv); } } var task = smtp.SendMailAsync(msg); var isout = !task.Wait(timeout); if (isout || task.Exception != null) { smtp.SendAsyncCancel(); if (isout) { rtv.error("邮件发送超时"); return(rtv); } throw task.Exception; } return(rtv); } catch (AggregateException ex) { var e = ex.InnerException; rtv.fail("邮件发送出错:" + e.Message, e.ToString()); return(rtv); } catch (Exception e) { rtv.fail("邮件发送异常:" + e.Message, e.ToString()); return(rtv); } finally { if (msg != null) { msg.Dispose(); } if (smtp != null) { smtp.Dispose(); } } }
/// <summary> /// 发送邮件 /// </summary> public Result Send(string title, string content, bool isHtml = true) { var rtv = new Result(); if (_ToEmails.Count == 0) { rtv.error("需要设置发送到的邮件地址"); return(rtv); } if (String.IsNullOrEmpty(SmtpHost) && _ToEmails.Count != 1) { rtv.error("不提供smtp地址时只能提供一个收件地址"); return(rtv); } MailMessage msg = null; var smtp = new SmtpClient(); //SmtpConnection Hello 乱发名字 try { var attr = smtp.GetType().GetField("clientDomain", Monitor.AllFlag); attr.SetValue(smtp, ClientName); } catch (Exception e) { rtv.fail("无法设置客户端名称:" + e.Message, e.ToString()); return(rtv); } try { int dataLen; var msgRes = BuildMessage(title, content, out dataLen, isHtml); if (msgRes.IsError) { msgRes.errorTo(rtv); return(rtv); } msg = msgRes.Value; var timeout = TimeoutMillisecond; if (timeout == defaultTimeout) { //重新计算超时时间 timeout = Math.Max((dataLen / (50 * 1024)) * 1000, defaultTimeout); } while (_DKIM != null) { if (dataLen > DKIM_MaxLen) { break; } var res = _DKIM.Sign(msg); if (res.IsError) { res.errorTo(rtv); return(rtv); } break; } if (String.IsNullOrEmpty(SmtpHost)) { var hostRes = new DNS_MX().QueryOne(msg.To[0].Host); if (hostRes.IsError) { hostRes.errorTo(rtv, "发送邮件失败:无法解析收件服务器"); return(rtv); } SmtpHost = hostRes.Value; } smtp.Host = SmtpHost; smtp.Port = SmtpPort; smtp.EnableSsl = SmtpSSL; if (!String.IsNullOrEmpty(User)) { smtp.Credentials = new NetworkCredential(User, Password); } smtp.Timeout = timeout; //统一用7位,不然不支持的服务器没法统一进行签名 smtp.DeliveryFormat = SmtpDeliveryFormat.SevenBit; if (OnSendBefore != null) { if (!OnSendBefore(msg, smtp)) { rtv.error("邮件发送前被取消"); return(rtv); } } //不能用异步方法,.Net SendAsync方法有bug,本应通过IsUnicodeSupported=ServerSupportsEai&&DeliveryFormat来判断是否支持utf-8,然而异步方法手贱直接用ServerSupportsEai来判断,导致DeliveryFormat无法控制编码方式!!表现为:支持SMTPUTF8的服务器100%不编码,不支持的100%编码。 smtp.Send(msg); return(rtv); } catch (AggregateException ex) { var e = ex.InnerException; rtv.fail("邮件发送出错:" + e.Message, e.ToString()); return(rtv); } catch (Exception e) { rtv.fail("邮件发送异常:" + e.Message, e.ToString()); return(rtv); } finally { if (msg != null) { msg.Dispose(); } if (smtp != null) { smtp.Dispose(); } } }