Skip to content

Instantly share code, notes, and snippets.

@meboz
Created April 11, 2012 02:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save meboz/2356475 to your computer and use it in GitHub Desktop.
Save meboz/2356475 to your computer and use it in GitHub Desktop.
C# Pop3 CLient
public interface IPop3Client : IDisposable {
void Connect();
List<string> GetMessageUids();
MessageHeader GetMessageHeaders(int messageNumber);
Message GetMessage(int messageNumber);
IEnumerable<Message> FetchMessagesLike(string emailedToRegex);
IEnumerable<Message> FetchMessagesFrom(string[] to);
void DeleteMessage(int messageNumber);
void DeleteMessages(IList<Message> messages);
}
public class CustomPop3Client : IPop3Client
{
private readonly string _hostname;
private readonly string _email;
private readonly string _password;
private Pop3Client _client;
public CustomPop3Client(string hostname, string email, string password)
{
_hostname = hostname;
_email = email;
_password = password;
_client = new Pop3Client();
}
public void Connect()
{
_client.Connect(_hostname, 110, false);
_client.Authenticate(_email, _password);
}
public List<string> GetMessageUids()
{
return _client.GetMessageUids();
}
public MessageHeader GetMessageHeaders(int messageNumber)
{
return _client.GetMessageHeaders(messageNumber);
}
public Message GetMessage(int messageNumber)
{
return _client.GetMessage(messageNumber);
}
public IEnumerable<Message> FetchMessagesLike(string pattern)
{
var hdrs = FetchAllMessageHeaders();
var matchingMessages = new List<Message>();
var toRegex = new Regex(pattern, RegexOptions.IgnoreCase);
for (var i = 0; i < hdrs.Count(); i++)
{
var to = hdrs.ElementAt(i).To.First().MailAddress.Address;
if (toRegex.IsMatch(to))
{
var matchingMessage = _client.GetMessage(i + 1);
matchingMessages.Add(matchingMessage);
}
}
return matchingMessages;
}
public IEnumerable<Message> FetchMessagesFrom(string[] toAddresses)
{
var hdrs = FetchAllMessageHeaders();
var matchingMessages = new List<Message>();
for (var i = 0; i < hdrs.Count(); i++) {
var to = hdrs.ElementAt(i).To.First().MailAddress.Address;
if (toAddresses.Contains(to,StringComparer.InvariantCultureIgnoreCase)) {
var matchingMessage = _client.GetMessage(i + 1);
matchingMessages.Add(matchingMessage);
DeleteMessage(i + 1);
}
}
return matchingMessages;
}
public IEnumerable<MessageHeader> FetchAllMessageHeaders()
{
var uids = _client.GetMessageUids();
var msgHeaders = new List<MessageHeader>();
for (var i = 0; i < uids.Count; i++) {
var hdrs = _client.GetMessageHeaders(i + 1);
msgHeaders.Add(hdrs);
}
return msgHeaders;
}
public void DeleteMessage(int messageNumber)
{
_client.DeleteMessage(messageNumber);
}
public void DeleteMessages(IList<Message> messages)
{
var uids = _client.GetMessageUids();
for (var i = 0; i < uids.Count; i++)
{
var hdrs = _client.GetMessageHeaders(i + 1);
var messageToDelete = messages.SingleOrDefault(m => m.Headers.MessageId == hdrs.MessageId);
if(messageToDelete != null)
_client.DeleteMessage(i);
}
}
public void Dispose()
{
_client.Disconnect();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment