Script PHP permettant de se connecter à un serveur de messagerie via IMAP
- sudo apt-get install php-imap
- Editer le fichier php.ini et insérer la directive : extension=imap
- sudo service apache2 restart
Explications
Connexion au serveur IMAP :
- La fonction
imap_openétablit une connexion au serveur en utilisant vos informations d'identification.
- La fonction
Recherche d'emails :
- La fonction
imap_searchaccepte des critères pour rechercher des emails :ALL: Tous les emails.UNSEEN: Emails non lus.FROM "expediteur@example.com": Emails provenant d'une adresse spécifique.SINCE "01-Jan-2024": Emails reçus après une date spécifique.
- La fonction
Récupération des en-têtes :
- La fonction
imap_headerinforetourne des informations comme le sujet, l'expéditeur, la date, etc.
- La fonction
Lecture du corps de l'email :
- La fonction
imap_bodyrécupère le contenu du message. - L'option
FT_PEEKempêche de marquer l'email comme lu.
- La fonction
Décodage des sujets :
- Utilisez
imap_utf8pour décoder les sujets encodés dans des formats comme UTF-8 ou MIME.
- Utilisez
Gestion des erreurs :
- Vérifiez toujours les retours des fonctions IMAP et utilisez
imap_last_errorpour afficher les erreurs si nécessaire.
- Vérifiez toujours les retours des fonctions IMAP et utilisez
Critères IMAP courants pour imap_search
- Non lus :
'UNSEEN' - Depuis une date :
'SINCE "01-Jan-2024"' - Avant une date :
'BEFORE "01-Jan-2024"' - Par expéditeur :
'FROM "expediteur@example.com"' - Par destinataire :
'TO "destinataire@example.com"' - Avec mot-clé dans l'objet :
'SUBJECT "mot-clé"'
Améliorations possibles
- Gestion des pièces jointes : Vous pouvez utiliser
imap_fetchstructurepour analyser les parties MIME et récupérer les pièces jointes. - Pagination des emails : Si vous avez beaucoup de messages, il est utile de paginer les résultats.
- Marquer comme lu : Supprimez
FT_PEEKpour marquer les emails comme lus.
Explications
Analyser la structure MIME :
- La fonction
imap_fetchstructureretourne la structure complète du message, y compris les différentes parties MIME (texte, HTML, pièces jointes). - Les pièces jointes sont identifiables par leur disposition MIME (ex.
attachmentouinline).
- La fonction
Vérification des parties MIME :
- Chaque partie peut avoir des métadonnées comme
dparameterscontenant le nom du fichier. - La disposition
attachmentouinlineindique souvent une pièce jointe.
- Chaque partie peut avoir des métadonnées comme
Récupérer les données de la pièce jointe :
- Les données de la pièce jointe sont récupérées avec
imap_fetchbody. - Les encodages courants sont :
- Base64 (3) : Utilisez
base64_decodepour décoder. - Quoted-printable (4) : Utilisez
quoted_printable_decode.
- Base64 (3) : Utilisez
- Les données de la pièce jointe sont récupérées avec
Sauvegarde locale :
- Utilisez
file_put_contentspour enregistrer les pièces jointes dans un répertoire local.
- Utilisez
Cas spéciaux
Emails sans pièces jointes :
- Certains emails peuvent ne contenir que du texte ou des images intégrées sans disposition
attachment. Vous pouvez aussi vérifierinlinesi nécessaire.
- Certains emails peuvent ne contenir que du texte ou des images intégrées sans disposition
Structure complexe :
- Si un email a des sous-parties (comme des fichiers compressés), parcourez récursivement les sous-parties en vérifiant chaque niveau.
Améliorations possibles
- Créer un répertoire pour chaque email : Organisez les pièces jointes dans des sous-dossiers basés sur l'identifiant du message.
- Gérer les noms de fichiers en conflit : Ajoutez des horodatages ou des suffixes uniques aux noms de fichiers.
- Filtrer par type MIME : Récupérez uniquement certains types de fichiers (PDF, images, etc.).
Le code :
<?php
// Informations de connexion
$server = '{imap.exemple.com:993/imap/ssl}'; // Serveur IMAP avec SSL
$username = 'votre_adresse_email@example.com'; // Adresse email
$password = 'votre_mot_de_passe'; // Mot de passe du compte
// Connexion au serveur IMAP
$mailbox = imap_open($server, $username, $password);
if (!$mailbox) {
die("Connexion échouée : " . imap_last_error());
}
echo "Connexion réussie au serveur IMAP.\n";
// Récupérer les identifiants des emails non lus
$emails = imap_search($mailbox, 'UNSEEN');
if (!$emails) {
echo "Aucun message trouvé.\n";
} else {
// Trier les emails par ordre décroissant
rsort($emails);
foreach ($emails as $emailId) {
echo "\n--- Analyse de l'email ID : $emailId ---\n";
// Récupérer la structure du message
$structure = imap_fetchstructure($mailbox, $emailId);
if (isset($structure->parts) && count($structure->parts)) {
for ($i = 0; $i < count($structure->parts); $i++) {
$part = $structure->parts[$i];
// Vérifier si la partie est une pièce jointe
if (isset($part->disposition) && strtolower($part->disposition) === 'attachment') {
// Récupérer le nom du fichier
$filename = '';
if (!empty($part->dparameters)) {
foreach ($part->dparameters as $param) {
if (strtolower($param->attribute) === 'filename') {
$filename = imap_utf8($param->value);
}
}
}
// Si le fichier n'a pas de nom, ignorer
if (!$filename) {
continue;
}
// Récupérer le contenu de la pièce jointe
$attachment = imap_fetchbody($mailbox, $emailId, $i + 1); // Les parties sont indexées à partir de 1
if ($part->encoding == 3) { // Base64
$attachment = base64_decode($attachment);
} elseif ($part->encoding == 4) { // Quoted-printable
$attachment = quoted_printable_decode($attachment);
}
// Sauvegarder la pièce jointe localement
$savePath = __DIR__ . "/$filename";
file_put_contents($savePath, $attachment);
echo "Pièce jointe sauvegardée : $savePath\n";
}
}
} else {
echo "Pas de pièces jointes trouvées.\n";
}
}
}
// Fermer la connexion IMAP
imap_close($mailbox);
?>
