Exemplo n.º 1
0
        public async Task WhenLoadingFromRemoteServerThenItWillEmailDetail(EmailAccountType protocol)
        {
            using (var mailServer = new HMailServerManager())
            {
                mailServer.Connect();
                var receivedMessages = new List <MimeMessage>();
                SUT sut = TestBuilder.New.WithOnReceivedCallback(receivedMessages.Add);
                MailReaderRequest request = Request.New.WithAccount(EmailAccountBuilder.New
                                                                    .WithProtocol(protocol)
                                                                    .WithMailServer(mailServer));
                mailServer.AddAccount(request.Account);
                var email = MailMessageBuilder.New.WithToAddress(request.Account).Build();
                mailServer.AddMessage(email);

                await sut.LoadFromServerAsync(request, CancellationToken.None);

                var actualMessage = receivedMessages.FirstOrDefault();
                Assert.That(actualMessage, Is.Not.Null);
                Assert.That(actualMessage.Subject, Is.EqualTo(email.Subject));
                Assert.That(actualMessage.TextBody, Is.EqualTo(email.TextBody).Using(StringCompare.IgnoreLineBreak));
                Assert.That(actualMessage.To.Count, Is.GreaterThanOrEqualTo(1));
                Assert.That(actualMessage.To.First(), Is.EqualTo(email.To.FirstOrDefault()));
                Assert.That(actualMessage.From.FirstOrDefault(), Is.Not.Null.And.EqualTo(email.From.FirstOrDefault()));
            }
        }
Exemplo n.º 2
0
        public async Task WhenLimitDefinedThenItWillFetchElderEmailFirst(EmailAccountType protocol)
        {
            using (var mailServer = new HMailServerManager())
            {
                mailServer.Connect();
                var               receivedMessages = new List <MimeMessage>();
                SUT               sut        = TestBuilder.New.WithOnReceivedCallback(receivedMessages.Add);
                const int         totalEmail = 3;
                MailReaderRequest request    = Request.New
                                               .WithAccount(EmailAccountBuilder.New
                                                            .WithProtocol(protocol)
                                                            .WithMailServer(mailServer))
                                               .WithLimitation(totalEmail - 1);
                mailServer.AddAccount(request.Account);
                var emailSubjects = new List <string>();
                for (int i = 1; i <= totalEmail; i++)
                {
                    string subject = $"Subject for-{i}";
                    var    email   = MailMessageBuilder.New
                                     .WithToAddress(request.Account)
                                     .WithSubject(subject)
                                     .Build();
                    mailServer.AddMessage(email);
                    emailSubjects.Add(subject);
                }

                await sut.LoadFromServerAsync(request, CancellationToken.None);

                var expectedSubjects = emailSubjects.Take(request.LimitTotalFetching ?? default).ToArray();
                Assert.That(receivedMessages.Select(e => e.Subject), Is.EquivalentTo(expectedSubjects).And.Ordered);
            }
        }
Exemplo n.º 3
0
        public async Task WhenNoLimitDefinedThenItWillFetchAllEmails(EmailAccountType protocol)
        {
            using (var mailServer = new HMailServerManager())
            {
                mailServer.Connect();
                var               receivedMessages = new List <MimeMessage>();
                SUT               sut        = TestBuilder.New.WithOnReceivedCallback(receivedMessages.Add);
                const int         totalEmail = 3;
                MailReaderRequest request    = Request.New
                                               .WithAccount(EmailAccountBuilder.New
                                                            .WithProtocol(protocol)
                                                            .WithMailServer(mailServer))
                                               .WithoutLimitation();
                mailServer.AddAccount(request.Account);
                var emailSubjects = new List <string>();
                for (int i = 0; i < totalEmail; i++)
                {
                    string subject = Guid.NewGuid().ToString();
                    var    email   = MailMessageBuilder.New
                                     .WithToAddress(request.Account)
                                     .WithSubject(subject)
                                     .Build();
                    mailServer.AddMessage(email);
                    emailSubjects.Add(subject);
                }

                await sut.LoadFromServerAsync(request, CancellationToken.None);

                Assert.That(receivedMessages.Count, Is.EqualTo(totalEmail));
                Assert.That(receivedMessages.Select(e => e.Subject), Is.EquivalentTo(emailSubjects));
            }
        }
        public IEmailAccountScanner GetScanner(EmailAccountType emailAccountType)
        {
            switch (emailAccountType)
            {
            case EmailAccountType.Gmail:
                return(new GmailAccountScanner());

            default:
                return(null);
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// 获取Email账户信息
        /// </summary>
        /// <returns></returns>
        private EmailUser GetEmailUser(EmailAccountType emailUserType)
        {
            //emailUserType = emailUserType == EmailUserType.Default ? EmailUserType._163 : emailUserType;

            XmlDataContext xmlCtx        = new XmlDataContext();
            var            emailUserList = xmlCtx.GetXmlList <EmailUser>();
            var            emailUser     = emailUserList.FirstOrDefault(z => z.Name == emailUserType.ToString());

            if (emailUser == null)
            {
                LogUtility.EmailLogger.ErrorFormat("EmailUserType类型错误。传入类型:{0}", emailUserType.ToString());
            }
            return(emailUser);
        }
Exemplo n.º 6
0
        public async Task WhenAutoDeleteDisabledThenItWillKeepEmailAfterFetched(EmailAccountType protocol)
        {
            using (var mailServer = new HMailServerManager())
            {
                mailServer.Connect();
                SUT sut = TestBuilder.New;
                MailReaderRequest request = Request.New
                                            .WithAccount(EmailAccountBuilder.New
                                                         .WithProtocol(protocol)
                                                         .WithMailServer(mailServer))
                                            .WithAutoDeleteDisabled();
                mailServer.AddAccount(request.Account);
                var email = MailMessageBuilder.New
                            .WithToAddress(request.Account)
                            .WithSubject(Guid.NewGuid().ToString())
                            .Build();
                mailServer.AddMessage(email);

                await sut.LoadFromServerAsync(request, CancellationToken.None);

                var emails = mailServer.GetEmails(request.Account).ToArray();
                Assert.That(emails.Select(e => e.Subject), Does.Contain(email.Subject));
            }
        }
Exemplo n.º 7
0
        public bool DoSendEmail(string to, string subject, string body, string username, bool useEmailTemplate, EmailAccountType emailUserType, bool fromCache)
        {
            bool   sendSuccess      = false;
            string smtpEmailAddress = null;

            //if (emailUserType == EmailUserType.Default && to.ToUpper().EndsWith("@QQ.COM"))
            //{
            //    //useBackupEmail = !useBackupEmail;//如果是qq邮箱,则切换
            //    emailUserType = EmailUserType._163;
            //}

            //if (emailUserType == EmailUserType.Default)
            //{
            //    emailUserType = EmailUserType.KJH8;//默认使用KJH8发送
            //}

            try
            {
                body = this.GetEmailTemplate(body, useEmailTemplate);

                EmailUser targetEmailUser = this.GetEmailUser(emailUserType);
                smtpEmailAddress = targetEmailUser.EmailAddress;

                MailMessage m_message = new MailMessage();
                m_message.From = new MailAddress(targetEmailUser.EmailAddress, targetEmailUser.DisplayName);
                m_message.To.Add(new MailAddress(to));
                m_message.Subject    = subject;
                m_message.IsBodyHtml = true;//允许使用html格式
                m_message.Body       = body;

                SmtpClient m_smtpClient = new SmtpClient();
                m_smtpClient.Host = targetEmailUser.SmtpHost;
                m_smtpClient.Port = targetEmailUser.SmtpPort;
                if (targetEmailUser.NeedCredentials)
                {
                    m_smtpClient.Credentials = new System.Net.NetworkCredential(targetEmailUser.EmailAddress, targetEmailUser.Password);
                }

                m_smtpClient.Send(m_message);

                sendSuccess = true;
            }
            catch (Exception e)
            {
                LogUtility.EmailLogger.ErrorFormat($"TO:{to},Subject:{subject},Username:{username},Message:{e.Message}", e);
                sendSuccess = false;
            }
            finally
            {
                string cacheUsed = fromCache ? "缓存" : "直接发送";
                if (sendSuccess)
                {
                    //记录到AutoSendEmail中进行备份
                    XmlDataContext   xmlCtx   = new XmlDataContext();
                    AutoSendEmailBak emailBak = new AutoSendEmailBak()
                    {
                        Address  = to,
                        Body     = body,
                        Subject  = subject,
                        SendTime = DateTime.Now,
                        UserName = username
                    };
                    xmlCtx.Insert(emailBak);

                    LogUtility.EmailLogger.Info($"发送Email成功({cacheUsed})。To:{to},Subject:{subject},UserName:{username}。by:{smtpEmailAddress}");
                }
                else
                {
                    LogUtility.EmailLogger.Error($"发送Email失败({cacheUsed})。To:{to},Subject:{subject},UserName:{username}。by:{smtpEmailAddress}");
                }
            }
            return(sendSuccess);
        }
Exemplo n.º 8
0
        ///// <summary>
        ///// 发送Email,只要条件符合,立即发送(当处于缓存中时,只要轮询到,也立即尝试发送)
        ///// </summary>
        ///// <typeparam name="T"></typeparam>
        ///// <param name="sendEmailParameter"></param>
        ///// <param name="lineInCache"></param>
        ///// <param name="useBackupEmail">使用备用Email发送(如果lineInCache=True,则由缓存处理模块决定)</param>
        ///// <returns></returns>
        //public bool Send<T>(T sendEmailParameter, bool lineInCache, bool useBackupEmail) where T : SendEmailParameter
        //{
        //    return this.Send(sendEmailParameter, lineInCache, true, useBackupEmail);
        //}

        /// <summary>
        /// 发送Email
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sendEmailParameter"></param>
        /// <param name="lineInCache"></param>
        /// <param name="sendImmediately">是否立即发送(仅当lineInCache=true时有效)</param>
        /// <param name="useBackupEmail">使用备用Email发送</param>
        /// <returns></returns>
        public bool Send <T>(T sendEmailParameter, bool lineInCache, bool sendImmediately, EmailAccountType emailUserType) where T : SendEmailParameter
        {
            SentSubject = null;
            SentBody    = null;
            try
            {
                if (sendEmailParameter.ToEmail.IsNullOrEmpty() /*|| !sendEmailParameter.ToEmail.ValidateEmailFormat()*/)
                {
                    throw new Exception("ToEmail参数为空");
                }

                //替换
                SentSubject = ReplaceHolderValue(sendEmailParameter, Subject);
                SentBody    = ReplaceHolderValue(sendEmailParameter, Body);

                bool sendImmediatelySuccess = true;
                if (!lineInCache)
                {
                    //立即发送,发送失败的邮件会列入缓存发送
                    sendImmediatelySuccess = DoSendEmail(sendEmailParameter.ToEmail, SentSubject, SentBody, sendEmailParameter.UserName, true, emailUserType, lineInCache);
                }

                //直接放入缓存,或将发送失败的邮件内容放入缓存
                if (lineInCache || !sendImmediatelySuccess)
                {
                    //存入缓存
                    SendEmailCache cache = new SendEmailCache();
                    AutoSendEmail  email = new AutoSendEmail
                    {
                        UserName     = sendEmailParameter.UserName,
                        Address      = sendEmailParameter.ToEmail,
                        Subject      = SentSubject,
                        Body         = this.GetEmailTemplate(SentBody, this.UseEmailTemplate),     //内容 + 模板
                        SendCount    = sendImmediately ? 0 : (SiteConfig.MaxSendEmailTimes + 200), //如果不要求马上发送,则仅存于缓存中
                        LastSendTime = DateTime.Now
                    };
                    bool insertSuccess = cache.InsertEmail(email);
                    if (!insertSuccess)
                    {
                        LogUtility.EmailLogger.Error($"Email加入缓存失败!Email:{sendEmailParameter.ToEmail},Subject:{SentSubject}\r\n内容:\r\n{SentBody}");
                    }
                    return(insertSuccess);
                }
                else
                {
                    return(sendImmediatelySuccess);
                }
            }
            catch (Exception e)
            {
                LogUtility.EmailLogger.ErrorFormat(
                    $"发送Email出错:{e.Message},Email:{sendEmailParameter.ToEmail},Username:{sendEmailParameter.UserName}," +
                    $"Subject:{SentSubject}\r\n内容:\r\n{SentBody}", e);
                return(false);
            }
        }
 public EmailAccountBuilder WithProtocol(EmailAccountType protocol)
 {
     _inner.Type = protocol;
     return(this);
 }
Exemplo n.º 10
0
 internal int GetPort(EmailAccountType protocol) =>
 Connections
 .Where(conn => conn.Protocol.Equals(protocol.ToString().ToUpper()))
 .OrderBy(conn => conn.UseSecureMode).Select(conn => conn.Port).FirstOrDefault();