Classe pour connexion à un serveur pop3 et charger les emails

Description

Voici une classe qui permet de se connecter à un serveur POP3 défini par l'utilisateur. Cette classe va charger les e-mails en attente sur le serveur ainsi que les pièces jointes. Bon, il n'est pas parfait, mais comme j'ai vu qu'il y avait pas mal de post sur le forum au sujet de la réception des mails, j'espère que ce début pourra vous aider. Je vous invite d'ailleurs à le modifier selon vos besoins...

Source / Exemple :


using System;
using System.IO;
using System.Web.Mail;
using System.Collections;
using System.Windows.Forms;
using System.Net.Sockets;

namespace PopMail
{

public class PopMailsCollections
{
private System.Net.Sockets.TcpClient co;
private System.Net.Sockets.NetworkStream ns;
private System.IO.StreamReader sr;
private string Server;
private string User;
private string PassWord;
public PopMail [] MailCollections;

public PopMailsCollections(string ServerName, string UserName, string PassWord)
{
this.Server = ServerName;
this.User = UserName;
this.PassWord = PassWord;
this.Connection();
}

public PopMail GetMail(int i)
{
return MailCollections[i];
}

public int Count()
{
return this.MailCollections.Length;
}

private void Connection()
{

int NbMail = 0;
string sOut = "user " + this.User + "\r\n";

try
{
co = new TcpClient(this.Server ,110);
ns = co.GetStream();
sr = new StreamReader(ns);
SendStream(sOut);
sr.ReadLine();
sr.ReadLine();
sOut = "pass " + this.PassWord + "\r\n";
SendStream(sOut);
if((sr.ReadLine().ToString()).Substring(0,4) != "-ERR" )
{
NbMail = RecupMsgInfo(1);
this.MailCollections = new PopMail[NbMail];
RecevoirMessage(NbMail);
}
else
MessageBox.Show("Identification refusée !", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch(ArgumentNullException e) 
{
MessageBox.Show("Erreur lors de la connexion au serveur.\n"+ e.ToString(), "Erreur de connexion", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (SocketException e) 
{
MessageBox.Show("Erreur lors de la connexion au serveur.\n"+ e.ToString(), "Erreur de connexion", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
this.sr.Close();
this.ns.Close();
this.co.Close();
}

private void SendStream(string s)
{
byte[] FluxSortant;
ns.Write(FluxSortant=EncodeByte(s),0,FluxSortant.Length);
}

private byte[] EncodeByte(string s)
{
return System.Text.ASCIIEncoding.ASCII.GetBytes(s);
}

private int RecupMsgInfo(int iMode, params int[] i)
{
string FluxSortant = "";
string sTempLigne = "+OK ";

switch(iMode)
{
case 1:
FluxSortant="stat\r\n";
break;

case 2:
FluxSortant="list " + i[0].ToString() +"\r\n";
break;
}

string[] sTemp={"0"};
try
{
do
{
SendStream(FluxSortant);
sTempLigne = sr.ReadLine();
sTemp = sTempLigne.Split(' ');
} while((sTempLigne == "+OK "));
}
catch(SocketException e) 
{
MessageBox.Show("Erreur lors du chargement des messages.\n"+ e.ToString(), "Erreur de connexion", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch(ArgumentNullException e)
{
MessageBox.Show("Erreur lors du chargement des messages.\n"+ e.ToString(), "Erreur de connexion", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

try
{
return int.Parse(sTemp[1]);
}
catch
{
return 0;
}
}

private void RecevoirMessage(int Nombre)
{
try
{
for(int i = Nombre; i>0; i--)
{
int iTailleMsg = RecupMsgInfo(2, i);
SendStream("retr " + i.ToString() + "\r\n");
this.InfoParMail(iTailleMsg, i-1);
}
}
catch(SocketException e) 
{
MessageBox.Show("Erreur lors du chargement des messages.\n"+ e.ToString(), "Erreur de connexion", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch(ArgumentNullException e)
{
MessageBox.Show("Erreur lors du chargement des messages.\n"+ e.ToString(), "Erreur de connexion", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

private void InfoParMail(int iTaille, int IdMessage)
{
string BodyString;
BodyMessage BodyTemp = new BodyMessage();
Attachements CurrentFile;
PopMail CurrentMail = new PopMail(IdMessage);
CurrentMail.Size = iTaille;
bool Base64Code = false;
string FileName="";
ArrayList FileCode = new ArrayList();
string sTemp = sr.ReadLine();
string sTemp2;
string sTemp3;
try
{
if(sTemp != "-")
{
sTemp = sr.ReadLine();

while(sTemp != ".")
{
if(sTemp.Length != 0)
{
if(sTemp.Length >= 3)
{
if(sTemp.Substring(0, 3) ==  "To:")
CurrentMail.To = sTemp.Substring(3,sTemp.Length-3);
if(sTemp.Substring(0, 3) ==  "Cc:")
CurrentMail.Cc = sTemp.Substring(3,sTemp.Length-3);
}
if(sTemp.Length >= 5)
{
if(sTemp.Substring(0, 5) == "From:")
CurrentMail.From = sTemp.Substring(5,sTemp.Length-5);
if(sTemp.Substring(0, 5) == "Date:")
CurrentMail.Date = sTemp.Substring(5,sTemp.Length-5);
}
if(sTemp.Length >= 8)
{
if(sTemp.Substring(0, 8) ==  "Subject:")
CurrentMail.Subject = sTemp.Substring(8,sTemp.Length-8);
}
if(sTemp.IndexOf("Content-Type:") != -1) 
{
sr.ReadLine();
if((sTemp2 = sr.ReadLine()).IndexOf("Content-Transfer-Encoding:") != -1)
{
sTemp3 = sr.ReadLine();
if(sTemp3 == "")
{
BodyString = "";
if(sTemp.Substring(13,sTemp.Length-13) == "text/plain;")
BodyTemp.BodyFormat = System.Web.Mail.MailFormat.Text;
else if(sTemp.Substring(13,sTemp.Length-13) == "text/html;")
BodyTemp.BodyFormat = System.Web.Mail.MailFormat.Html;

while((sTemp2 = sr.ReadLine()).IndexOf("------=_NextPart") == -1)
{
BodyString += sTemp2 + "\n";
}
BodyTemp.Body = BodyString;
CurrentMail.Bodies.Add(BodyTemp);
}
else if(sTemp3 == "Content-Disposition: attachment;")
{
if(sTemp2.Substring(27, sTemp2.Length - 27) == "quoted-printable")
{
Base64Code = false;
}
else if(sTemp2.Substring(27, sTemp2.Length-27) == "base64")
{
Base64Code = true;
}
sTemp = sr.ReadLine();
FileName = sTemp.Substring(13, sTemp.Length - 14);

sr.ReadLine();
while((sTemp = sr.ReadLine()) != "")
FileCode.Add(sTemp);
CurrentFile = new Attachements(FileName, FileCode, Base64Code);
CurrentMail.Enjoigned.Add(CurrentFile);
}
}
}
}
sTemp = sr.ReadLine();
}
this.MailCollections[IdMessage] = CurrentMail;
}
}
catch(SocketException e) 
{
MessageBox.Show("Erreur lors du chargement des messages.\n"+ e.ToString(), "Erreur de connexion", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch(ArgumentNullException e)
{
MessageBox.Show("Erreur lors du chargement des messages.\n"+ e.ToString(), "Erreur de connexion", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

}

public class PopMail
{
private int IdMail;
public ArrayList Bodies;
public string Cc;
public string Date;
public string From;
public int Size;
public string Subject;
public string To;
public ArrayList Enjoigned;

public PopMail(int ID)
{
this.Bodies = new ArrayList();
this.Enjoigned = new ArrayList();
this.IdMail = ID;
}

public PopMail()
{}

}

public class Attachements
{
private string FileName;
private System.Collections.ArrayList CodeFile;
private bool Base64Coding;
private System.Windows.Forms.SaveFileDialog SaveDialog;
/// <summary>
/// public Attachements(string FileName, ArrayList Code, bool Base64)
/// </summary>
public Attachements(string FileName, ArrayList Code, bool Base64)
{
this.CodeFile = Code;
this.FileName = FileName;
this.Base64Coding = Base64;
this.SaveDialog = new System.Windows.Forms.SaveFileDialog();
this.SaveDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.SaveDialogOk);
this.SaveDialog.FileName = this.FileName;
}

public void SaveFile()
{
this.SaveDialog.ShowDialog();
}

private void Base64Decode(string sChemin)
{
try
{
FileStream fFichier = new FileStream(sChemin, FileMode.CreateNew);
BinaryWriter w = new BinaryWriter(fFichier);
for(int i=0; i < this.CodeFile.Count; i++)
w.Write(System.Convert.FromBase64String(this.CodeFile[i].ToString()));
w.Close();
fFichier.Close();
}
catch
{
if(MessageBox.Show("Une erreur s'est produite lors de l'enregistrement de la pièce jointe.", "Erreur d'enregistrement", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) == DialogResult.Retry)
this.Base64Decode(sChemin);
}
}		

void SaveDialogOk(object sender, System.ComponentModel.CancelEventArgs e)
{
if(this.Base64Coding)
this.Base64Decode(this.SaveDialog.FileName);
else
{
try
{
FileStream fFichier = new FileStream(this.SaveDialog.FileName, FileMode.CreateNew);
BinaryWriter w = new BinaryWriter(fFichier);
for(int i=0; i < this.CodeFile.Count; i++)
w.Write(System.Convert.FromBase64String(this.CodeFile[i].ToString()));
w.Close();
fFichier.Close();
}
catch
{
if(MessageBox.Show("Une erreur s'est produite lors de l'enregistrement de la pièce jointe.", "Erreur d'enregistrement", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) == DialogResult.Retry)
this.SaveDialogOk(sender, e);
}
}
}

public string GetName()
{
return this.FileName;
}

}

public struct BodyMessage
{
public string Body;
public System.Web.Mail.MailFormat BodyFormat;		
};

}

Conclusion :


Euh... Je crois qu'il y a un petit bug au niveau du corps du message. Je m'en occupe rapidement et je mets ceci a jour.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.