Classe pour connexion à un serveur pop3 et charger les emails

Soyez le premier à donner votre avis sur cette source.

Vue 16 419 fois - Téléchargée 1 008 fois

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

Ajouter un commentaire

Commentaires

cs_boucherf
Messages postés
6
Date d'inscription
mercredi 16 avril 2008
Statut
Membre
Dernière intervention
22 février 2011
-
j'ai pas comprendre comment recuperer les fichiers joindre quelqu'un peut m'aider si urgent pls voila ma boit boucherfkhaled@gmail.com
chinois0013
Messages postés
33
Date d'inscription
jeudi 2 juin 2005
Statut
Membre
Dernière intervention
2 juin 2009
-
Bonjour,
Je n'arrive pas à récuperer le le body des message en texte brut...
J'aurais manqué quelques choses ? Même si j'arrive 4 après le code...
Merci
cs_AshenShugar
Messages postés
202
Date d'inscription
jeudi 24 juin 2004
Statut
Membre
Dernière intervention
22 janvier 2009
1 -
Tout d'abord, pour répondre à CIPOLI, en espérant que ce ne soit pas trop tard.
L'espace de nom System.Web.Mail existe bien dans les versions plus récentes du framework. Par conséquent, on peut en déduire qu'il te manque une référence.

Gregfriends, j'avoue que je n'ai jamais essayer sur les serveurs gmail et 1and1. A l'époque où j'ai développé ce code, je ne connaissais même pas leur existence (existait-il d'ailleurs ?).
Dans ce code, je ne prends en compte que 2 méthodes pour les pièces jointes : quoted-printable et base64. Peut-être en existe-t-il d'autre, j'avoue ne pas avoir creusé. Néanmoins, celà te laisse une bonne piste pour tes recherches.

Cordialement
gregfriends
Messages postés
1
Date d'inscription
mardi 15 mai 2007
Statut
Membre
Dernière intervention
4 juillet 2008
-
La récupération des pièces jointes ne fonctionne pas avec les serveurs gmail et 1and1. Je n'utilise pas les client mail outlook ou thunderbird. Est-ce normale ou aurais-je mal implémenté ton code ?
cs_AshenShugar
Messages postés
202
Date d'inscription
jeudi 24 juin 2004
Statut
Membre
Dernière intervention
22 janvier 2009
1 -
Bonjour,

C'était une vieille version du framework, la 1.1 il me semble. C'est possible qu'il y ait eu quelques modifications à ce niveau dans les dernières versions.
Je regarderais si j'ai le temps mais je t'avoue être un peu débordé en ce moment, donc ne m'en veux pas si je ne te donne pas de réponse.

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.