示例#1
0
        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 : "已保存"));
            });
        }
示例#2
0
        /// <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();
                }
            }
        }
示例#3
0
        /// <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();
                }
            }
        }