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())); } }
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); } }
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); } }
/// <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); }
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)); } }
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); }
///// <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); }
internal int GetPort(EmailAccountType protocol) => Connections .Where(conn => conn.Protocol.Equals(protocol.ToString().ToUpper())) .OrderBy(conn => conn.UseSecureMode).Select(conn => conn.Port).FirstOrDefault();