private IEnumerable <Shared.MailAddress> ResolveDbMailAddresses(IEnumerable <Shared.MailAddress> pSource) { IEnumerable <Shared.MailAddress> mDbMailAddresses = pSource.Select(bMailAddress => this.iMailAddressRepository.Single(MailAddressSelector.ByMailAddress(bMailAddress.Value))) .Where(bMailAddress => bMailAddress != null) .ToList(); return(pSource .Where(bMailAddress => !mDbMailAddresses.Any(bexistingMailAddress => bexistingMailAddress.Value == bMailAddress.Value)) .Union(mDbMailAddresses)); }
/// <summary> /// registra una nueva cuenta de correo /// </summary> public void Register(string pAlias, string pMailAddress, string pPassword) { try { MailAccount mMailAccount; //Se obtiene la existencia de la cuenta que corresponde a los argumentos mMailAccount = this.iMailAccountRepository.Single(MailAccountSelector.ByMailAddress(pMailAddress)); if (mMailAccount != null) { throw new ExistentAccountException(); } //se encripta la contraseña string mPassword = this.iEncryptor.Encrypt(pPassword); //se crea la direccion de correo MailAddress mMailAddress = this.iMailAddressRepository.Single(MailAddressSelector.ByMailAddress(pMailAddress)) ?? new MailAddress { Value = pMailAddress }; //se crea la cuenta de correo mMailAccount = new MailAccount { Alias = pAlias, MailAddress = mMailAddress, Password = mPassword }; //se agrega la nueva cuenta al repositorio this.iMailAccountRepository.Create(mMailAccount); MCDAL.Instance.Save(); } catch (Exception bException) { throw new RegisterException(Resources.Exceptions.RegisterException, bException); } }
public void Execute(int pMailAccountId, string pProtocolName, int pRetrieveWindowSize) { try { //se obtiene la cuenta del usuario activo this.iMailAccount = this.iMailAccountRepository.Single(MailAccountSelector.ById(pMailAccountId)); this.iRetrieveWindowSize = pRetrieveWindowSize; //se obtienen los datos del protocolo this.iProtocol = this.iMailServiceRepository .Single(MailServiceSelector.ByName(this.iMailAccount.GetMailServiceHost())) .Protocols.Single(bProtocol => bProtocol.Name.ToLower() == pProtocolName); //se obtiene la cantidad de mensajes como base para obtener los siguientes int mLastMessageId = this.iMailAccount.MailAddress.FromMessages.Any() && this.iMailAccount.MailAddress.ToMessages.Any() ? this.iMailAccount.MailAddress.FromMessages.Union(this.iMailAccount.MailAddress.ToMessages).Count() : 0; //se obtienen los correos IEnumerable <MailMessage> mMailMessages = this.Retrieve(this.iMailAccount.GetMailServiceHost(), this.iMailAccount.MailAddress.Value, this.iEncryptor.Decrypt(this.iMailAccount.Password), mLastMessageId, this.iRetrieveWindowSize) .Select(bMailMessage => bMailMessage.ToMailClientMailMessage()) .ToList(); //para los mensajes que tienen como remitente el correo del usuario // y que no existan en la bbdd IEnumerable <MailMessage> mFromListMessage = mMailMessages .Where(bMessage => bMessage.From.Value.Equals(this.iMailAccount.MailAddress.Value)) .Where(bMessage => !this.iMailAccount.MailAddress.FromMessages.Any(bSendedMessage => bSendedMessage.ExternalId == bMessage.ExternalId)); //se agrega cada mensaje a la bbdd foreach (MailMessage bMailMessage in mFromListMessage) { bMailMessage.From = this.iMailAccount.MailAddress; bMailMessage.To = this.ResolveDbMailAddresses(bMailMessage.To).ToList(); this.iMailAccount.MailAddress.FromMessages.Add(bMailMessage); MCDAL.Instance.Save(); } //para los mensajes que no tienen como remitente el correo del usuario IEnumerable <MailMessage> mRecivedMailMessages = mMailMessages .Where(bMessage => !bMessage.From.Value.Equals(this.iMailAccount.MailAddress.Value)) .Where(bMessage => !this.iMailAccount.MailAddress.ToMessages.Any(bSendedMessage => bSendedMessage.ExternalId == bMessage.ExternalId)); //se agrega cada mensaje a la bbdd foreach (MailMessage bMailMessage in mRecivedMailMessages) { bMailMessage.From = this.iMailAddressRepository.Single(MailAddressSelector.ByMailAddress(bMailMessage.From.Value)) ?? bMailMessage.From; bMailMessage.To = this.ResolveDbMailAddresses(bMailMessage.To).ToList(); this.iMailAccount.MailAddress.ToMessages.Add(bMailMessage); MCDAL.Instance.Save(); } } catch { } }