Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
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 : "已保存"));
            });
        }