8722 sujets

Développement web côté serveur, CMS

Bonjour,
Je poste ce message ce jour car j'éprouve des difficultés pour envoyer une pièce jointe dans un mail. Actuellement j'arrive à envoyer un mail au destinataire voulu avec toutes mes infos cependant sans la pièce jointe.
J'aimerai également envoyer un .ics aussi si possible mais lorsque j'initialise celui-ci le mail ne part même plus.

J'utilise actuellement Codeigniter et j'ai procédé de cette manière :

Controller Email

//Evenèment au format ICS
$ics = "BEGIN:VCALENDAR\n";
$ics .= "VERSION:2.0\n";
$ics .= "PRODID [ohwell]/hacksw/handcal//NONSGML v1.0//EN\n";
$ics .= "BEGIN:VEVENT\n";
$ics .= "X-WR-TIMEZONE:Europe/Paris\n";
$ics .= "DTSTART:".date('Ymd',"2020-11-17")."T".date('His',"08:30:00")."\n";
$ics .= "DTEND:".date('Ymd',"2020-11-17")."T".date('His',"17:30:00")."\n";
$ics .= "SUMMARY:"."title"."\n";
$ics .= "LOCATION:"."place"."\n";
$ics .= "DESCRIPTION:"."detail"."\n";
$ics .= "END:VEVENT\n";
$ics .= "END:VCALENDAR\n";

$this->email->attach($ics);

// FIchier pdf
$file_name = "test_un_doc.pdf";
$file = $_SERVER["DOCUMENT_ROOT"]."/uploads/".$file_name;

$this->email->attach($file);

$this->email->send();


Essai sans succès

$file = "pathfile\test_un_doc.pdf";
$this->email->attach($file);
$this->email->send();


View

<div class="row">
	<div class="col s3 right-align">Pièce jointe</div>
	     <div class="col s9">
                   <input type="file" id="url" name="url"  size="20"></div>
             </div>
</div>

Modifié par Jisiiss (17 Nov 2020 - 15:46)
Hello,
ta variable $ics contient une chaine de caractères. Hors comme dans toutes les librairies d'email la fonction "attach" attend un emplacement de fichier accessible en lecture.

Dans ton cas tu peu résoudre ça comme suit (attention code à la volé pas testé) :


//Création d'un contenu ICS
$ics_content = array();
$ics_content[] = "BEGIN:VCALENDAR";
$ics_content[] = "VERSION:2.0";
$ics_content[] = "PRODID [ohwell]/hacksw/handcal//NONSGML v1.0//EN";
$ics_content[] = "BEGIN:VEVENT";
$ics_content[] = "X-WR-TIMEZONE:Europe/Paris";
$ics_content[] = "DTSTART:".date('Ymd',"2020-11-17")."T".date('His',"08:30:00");
$ics_content[] = "DTEND:".date('Ymd',"2020-11-17")."T".date('His',"17:30:00");
$ics_content[] = "SUMMARY:title";
$ics_content[] = "LOCATION:place";
$ics_content[] = "DESCRIPTION:detail";
$ics_content[] = "END:VEVENT";
$ics_content[] = "END:VCALENDAR";

//Convertion du tableau en chaine de caractères avec retour à la ligne \n
$str_ics_content = implode('\n',$ics_content);

//Ecriture du contenu du fichier ICS
$ics_file_name = "pj_" . date("Y-m-d") . "_.ics";
$dir = "ics/";
if (!file_exists($dir)) mkdir($dir, 0600, true);
$handler = fopen($dir . $ics_file_name, "a+");
fputs($handler, $str_ics_content);
fclose($handler);

//Donner l'emplacement pour attacher la pièce jointe 
$icr_full_path = realpath($dir . $ics_file_name);
if($icr_full_path != false){
$this->email->attach($icr_full_path);
$this->email->send();
}


Après si ça marche pas, ça peut provenir de la configuration SMTP.
Ou de la librairie et tu peu toujours utiliser PHPMailer avec PHP
Modifié par gray_magic (30 Nov 2020 - 18:56)
Bonjour,
Je te remercie de m'avoir répondu cependant je n'avais pas vu ta réponse et je m'en excuse de te répondre si tardivement.
Par ailleurs j'ai testé ton code @gray_magic et rien ne se produit, j'envoie toujours mon mail sans pièce jointe.

J'ai fait comme cela :

// //Création d'un contenu ICS
		$dateFinSession = date('Ymd');
		$dateDebutSession = date('Ymd');
		$dateHeureFinSession = date('His');
		$dateHeureDebutSession = date('His');

		$ics_content = array();
		$ics_content[] = "BEGIN:VCALENDAR";
		$ics_content[] = "VERSION:2.0";
		$ics_content[] = "PRODID [ohwell]/hacksw/handcal//NONSGML v1.0//EN";
		$ics_content[] = "BEGIN:VEVENT";
		$ics_content[] = "X-WR-TIMEZONE:Europe/Paris";
		$ics_content[] = "DTSTART:".$dateDebutSession."T".$dateHeureDebutSession;
		$ics_content[] = "DTEND:".$dateFinSession."T".$dateHeureFinSession;
		$ics_content[] = "SUMMARY:".$title;
		$ics_content[] = "LOCATION:".$place;
		$ics_content[] = "DESCRIPTION:".$detail;
		$ics_content[] = "END:VEVENT";
		$ics_content[] = "END:VCALENDAR";

		//Convertion du tableau en chaine de caractères avec retour à la ligne \n
		$str_ics_content = implode('\n',$ics_content);

		//Ecriture du contenu du fichier ICS
		$ics_file_name = "pj_" . date("Y-m-d") . "_.ics";
		$dir = "ics/";
		if (!file_exists($dir)) mkdir($dir, 0600, true);
		$handler = fopen($dir . $ics_file_name, "a+");
		fputs($handler, $str_ics_content);
		fclose($handler);

		//Donner l'emplacement pour attacher la pièce jointe 
		$icr_full_path = realpath($dir . $ics_file_name);
		if($icr_full_path != false){
			$this->email->attach($icr_full_path);
		}
               $this->email->send();


Avec ce code le mail s'envoi toujours mais je constate que la variable $icr_full_path est vide.
Un dossier ics s'est bien créé à la racine de mon projet mais le fichier ics n'est pas à l'interieur.

Voici les logs que j'ai généré :
date du log : 2020_12_21 14:05:17
dateDebutSession : 20201221
dateFinSession : 20201221
dateHeureDebutSession : 140517
dateHeureFinSession : 140517
ics_content : 1
str_ics_content : BEGIN:VCALENDAR\nVERSION:2.0\nPRODID Smiley ohwell /hacksw/handcal//NONSGML v1.0//EN\nBEGIN:VEVENT\nX-WR-TIMEZONE:Europe/Paris\nDTSTART:20201221T140517\nDTEND:20201221T140517\nSUMMARY:Haut les coeurs\nLOCATION:Une salle parmi tant d'autre\nDESCRIPTION:la description est une description\nEND:VEVENT\nEND:VCALENDAR
ics_file_name: pj_2020-12-21_.ics
icr_full_path:
Modifié par Jisiiss (21 Dec 2020 - 14:21)
J'ai réussi à générer un ics dans mon dossier, le dossier créé ne disposait pas des droits suffisants j'ai donc changé directement cela dans les propriétés.
Pour le code j'ai fait cela à la place :

//Ecriture du contenu du fichier ICS
		$ics_file_name = "pj_" . date("Y-m-d") . "_.ics";
		$dir = "ics/";
		if (!file_exists($dir)) { 
			mkdir($dir, 0600, true); 
		}
               // getcwd récupère le chemin serveur du dossier 
		$pathICS = getcwd().'/'.$dir.$ics_file_name;
		file_put_contents($pathICS, $str_ics_content, FILE_APPEND);

		//Donner l'emplacement pour attacher la pièce jointe 
		$icr_full_path = realpath($dir . $ics_file_name);
		if($icr_full_path != false){
			$this->email->attach($icr_full_path);
		}
                $this->email->send();
Hi,
vérifie si ton fichier est bien créée déjà ^_^

Après la documentation de Code igniteur est clair sur le sujet :
Enables you to send an attachment. Put the file path/name in the first parameter.

A défaut test avec le handler du fichier certaine lib n'attendent que ça (zend).
Tu utilises qu'elle version de CI ?
Je réussi désormais à généré mon fichier .ics comme il faut cependant il est coupé au début. Voici le résultat :
SGML v1.0//EN
BEGIN:VEVENT
X-WR-TIMEZONE:Europe/Paris
DTSTART:20201116T073000
DTEND:20231129T163000
SUMMARY:mon titre est bien
LOCATION:ma location
DESCRIPTION:je test la description
END:VEVENT
END:VCALENDAR

Voici le code pourtant, pour infos il y a bien un tiret dans mon code après les "PRODID:"

 // //Création d'un contenu ICS
		$dtdeb = gmdate('Ymd', strtotime($dateDebutSession));
		$dtend = gmdate('Ymd', strtotime($dateFinSession));
		$dtHeuredeb = gmdate('His', strtotime($dateHeureDebutSession));
		$dtHeurefin = gmdate('His', strtotime($dateHeureFinSession));

		$ics_content = "BEGIN:VCALENDAR"."\n";
		$ics_content .= "VERSION:2.0"."\n";
		$ics_content .= "PRODID://hacksw/handcal//NONSGML v1.0//EN"."\n";
		$ics_content .= "BEGIN:VEVENT"."\n";
		$ics_content .= "X-WR-TIMEZONE:Europe/Paris"."\n";
		$ics_content .= "DTSTART:".$dtdeb."T".$dtHeuredeb."\n";
		$ics_content .= "DTEND:".$dtend."T".$dtHeurefin."\n";
		$ics_content .= "SUMMARY:".$title."\n";
		$ics_content .= "LOCATION:".$place."\n";
		$ics_content .= "DESCRIPTION:".$detail."\n";
		$ics_content .= "END:VEVENT"."\n";
		$ics_content .= "END:VCALENDAR";

		//Ecriture du contenu et Chemin du fichier ICS
		$ics_file_name = "pj_" . date("Y-m-d") . "_.ics";
		$dir = "ics/";
		if (!file_exists($dir)) { 
			mkdir($dir, 0600, true); 
		}
		$pathICS = getcwd().'/'.$dir.$ics_file_name;
		file_put_contents($pathICS, $ics_content );

		//pièce jointe ics : donner l'emplacement pour attacher la pièce jointe ics
		$icr_full_path = realpath($dir . $ics_file_name);
		if($icr_full_path != false){
			$this->email->attach($icr_full_path);
		}

Modifié par Jisiiss (23 Dec 2020 - 11:40)
Ok j'ai trouvé une solution qui rend la structure comme je l'attends.
Voici le code :


    $ics_content = 	"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<VCAL";
		$ics_content .= "BEGIN:VCALENDAR"."\n";
		$ics_content .=	"VERSION:2.0"."\n";
		$ics_content .=	"PRODID://hacksw/handcal//NONSGML v1.0//EN"."\n";
		$ics_content .=	"BEGIN:VEVENT"."\n";
		$ics_content .=	"X-WR-TIMEZONE:Europe/Paris"."\n";
		$ics_content .=	"DTSTART:".$dtdeb.T.$dtHeuredeb."\n";
		$ics_content .=	"DTEND:".$dtend.T.$dtHeurefin."\n";
		$ics_content .=	"SUMMARY:".$title."\n";
		$ics_content .=	"LOCATION:".$place."\n";
		$ics_content .=	"DESCRIPTION:".$detail."\n";
		$ics_content .=	"END:VEVENT"."\n";
		$ics_content .=	"END:VCALENDAR"."\n";
		$ics_content .=	"VCAL";

Modifié par Jisiiss (23 Dec 2020 - 16:12)
Meilleure solution