[PHP] Creare appuntamento ed inviarlo tramite mail (Outlook e Gmail)

Giulo77

Utente Attivo
15 Mar 2018
30
0
6
42
Ciao a tutti,
la mia applicazione web prevede un'agenda da cui si possono prendere appuntamenti ed inviarli ad un determinato indirizzo mail. Il risultato che voglio ottenere è quello di farlo riconoscere da tutte le app mail in modo da poterlo inserire in automatico nel calendario dell'utente.
Attualmente uso PHPMailer ed invio in allegato un file ics ma il risultato è che solo GMail è in grado di riconoscerlo automaticamente e quindi di propormi i classici tasti Si/No/Forse; di conseguenza per il momento ho incluso nel corpo mail il messaggio che se non viene riconosciuto automaticamente di cliccare sull'allegato. In questo modo ad esempio su outlook mi fa comparire la form con accetta/rifiuta.
Le prove che ho fatto sono le seguenti:
Creare un appuntamento da outlook ed inviarlo su windows live mail che non aggiorno da una vita e che quindi non lo riconosce sicuro in auto ed ho visto che arriva una mail con l'oggetto e con l'ics in allegato (Quindi non c'è dubbio che anche outlook persegue la via di allegare un file ics).
Creato ics identico ad uno fatto in outlook (Quindi stesse proprietà, orari, fusi, RSVP dei partecipanti, ecc...)
Sempre con Windows live mail posso vedere tutte le proprietà dalla mail e a parte qualcosina nell'header ho potuto verificare che entrambi hanno in coda tutto il file ics in formato base64
Non so più dove sbattere la testa, non mi piace è poco funzionale il fatto di dover cliccare sull'allegato. Ci deve essere qualche proprietà per cui la app mail leggono e riconoscono che è un appuntamento tipo outlook. Esempio l'app mail della samsung lo riconosce e quindi non stiamo parlando solo ed esclusivamente di outlook.
Qualcuno di voi ha mai sperimentato una cosa del genere? il 90% degli utilizzatori hanno outlook quindi preferirei che succedesse al contrario, cioè clicco per Gmail e va in auto per outlook.

So che outlook è un po' carente, ad esempio una volta inserito l'appuntamento non posso vedere i partecipanti (li ho inclusi nel testo delle note); questo avviene anche se si esporta un appuntamento inserito originariamente da outlook e lo si reimporta nello stesso calendario, quindi direi un bug strasegnalato e mai calcolato da microsoft (fino alla versione 2003 funzionava).

Allego in ogni caso la parte di codice dove creo mail ed allegato ics:

PHP:
        $mail = new PHPMailer();
        $mail->IsSMTP();
        $mail->SMTPDebug = 0;   
        $mail->SMTPSecure = $_SESSION['SMTPSecure'];
        $mail->Host       = $_SESSION['mailerServer'];
        $mail->Port       = $_SESSION['STMPPort'];
        $mail->SMTPAuth   = true;
        $mail->Username   = $_SESSION['mailerAddress'];
        $mail->Password   = $_SESSION['mailerPassword'];
        $mail->SMTPOptions = array(
            'ssl' => array(
                'verify_peer' => false,
                'verify_peer_name' => false,
                'allow_self_signed' => true
            )
        );
        $mail->IsHTML(true);     
        $mail->CharSet='utf-8';
    
        $mail->From = $_SESSION['mailerAddress'];
        $mail->FromName = $_SESSION['login_name'];
        $contaMail = 0;         
        if ($idutente != 0 && $flmailref == 1 && $mailReferente != '' && $mailReferente != $_SESSION['mailerAddress']) {$mail->addAddress($mailReferente); $contaMail++;}
        if ($flmailcontatto == 1 && $email1 != '')
        {
          $indirizziMail = explode(";", $email1);
          $numMail = count($indirizziMail);
          for ($i = 0; $i < $numMail; $i++)
          {
            $indirizzoMail = '';
            $lastChar = trim(substr($indirizziMail[$i], -1));
            if ($lastChar != ")") {$indirizzoMail = $indirizziMail[$i];}
            else
            {
              $firstChar = strpos($indirizziMail[$i], "(");
              if ($firstChar !== false) {$indirizzoMail = substr($indirizziMail[$i], $firstChar + 1, $lastChar - $firstChar - 1);}
            }
            if ($indirizzoMail != '' && $indirizzoMail != $_SESSION['mailerAddress']){$mail->addAddress($indirizzoMail); $contaMail++;}
          }
        }
        if ($flmailcontatto == 1 && $email2 != '')
        {
          $indirizziMail = explode(";", $email2);
          $numMail = count($indirizziMail);
          for ($i = 0; $i < $numMail; $i++)
          {
            $indirizzoMail = '';
            $lastChar = trim(substr($indirizziMail[$i], -1));
            if ($lastChar != ")") {$indirizzoMail = $indirizziMail[$i];}
            else
            {
              $firstChar = strpos($indirizziMail[$i], "(");
              if ($firstChar !== false) {$indirizzoMail = substr($indirizziMail[$i], $firstChar + 1, $lastChar - $firstChar - 1);}
            }         
            if ($indirizzoMail != '' && $indirizzoMail != $_SESSION['mailerAddress']){$mail->addAddress($indirizzoMail); $contaMail++;}
          }
        }
        if ($flmailutente == 1 && $_SESSION['login_email'] != '' && $_SESSION['login_email'] != $_SESSION['mailerAddress']) {$mail->addAddress($_SESSION['login_email']); $contaMail++;}
      
        $mail->AddCustomHeader("X-Confirm-Reading-To: " . $_SESSION['mailerAddress']);
        $mail->AddCustomHeader("Return-receipt-To: " . $_SESSION['mailerAddress']);
        $mail->AddCustomHeader("Disposition-Notification-To: " . $_SESSION['mailerAddress']);           

        $ical = "BEGIN:VCALENDAR\r\n";
        $ical .= "VERSION:2.0\r\n";
        $ical .= "PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN\r\n";
        $ical .= "METHOD:REQUEST\r\n";
        $ical .= "X-MS-OLK-FORCEINSPECTOROPEN:TRUE\r\n";
        $ical .= "BEGIN:VEVENT\r\n";
        $ical .= "ORGANIZER;CN=\"" . trim(str_replace(str_split('\\/:*?"<>|,;'), '', $_SESSION['login_name'])) . "\":mailto:" . $_SESSION['mailerAddress'] . "\r\n";
        $ical .= "ATTENDEE;CN=\"" . trim(str_replace(str_split('\\/:*?"<>|,;'), '', $referente)) . "\";ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE:mailto:" . $mailReferente . "\r\n";
        $elencoMail = '';
        if ($email1 != '')
        {
          if ($email2 != '')
          {
            if (substr($email2, -1) == ";") {$parz2 = substr($email2, 0, -1);}   
            else {$parz2 = $email2;}         
            if (substr($email1, -1) == ";") {$elencoMail = $email1 . $parz2;}   
            else {$elencoMail = $email1 . ";" . $parz2;}           
          }   
          else
          {
            if (substr($email1, -1) == ";") {$elencoMail = substr($email1, 0, -1);}   
            else {$elencoMail = $email1;}           
          }             
        }
        else
        {
          if ($email2 != '')
          {
            if (substr($email2, -1) == ";") {$elencoMail = substr($email2, 0, -1);}   
            else {$elencoMail = $email2;}           
          }         
        }
        if ($elencoMail != '')
        {
          $indirizziMail = explode(";", $elencoMail);
          $numMail = count($indirizziMail);     
          for ($i = 0; $i < $numMail; $i++)
          {
            $nominativo = '';
            $indirizzoMail = '';   
            $lastChar = trim(substr($indirizziMail[$i], -1));
            if ($lastChar != ")")
            {
              if ($i == 0)
              {
                $nominativo = $nome;
                $indirizzoMail = $indirizziMail[$i];
              }
              else
              {
                $nominativo = $indirizziMail[$i];
                $indirizzoMail = $indirizziMail[$i];
              }
            }
            else
            {
              $firstChar = strpos($indirizziMail[$i], "(");
              if ($firstChar !== false) {$indirizzoMail = substr($indirizziMail[$i], $firstChar + 1, $lastChar - $firstChar - 1);}
              if ($indirizzoMail != '') {$nominativo = substr($indirizziMail[$i], 0, $firstChar - 1);}
            }   
            if ($nominativo != '' && $indirizzoMail != ''){$ical .= "ATTENDEE;CN=\"" . trim(str_replace(str_split('\\/:*?"<>|,;'), '', $nominativo)) . "\";ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE:mailto:" . trim($indirizzoMail) . "\r\n";}
          }       
        }           
        $ical .= "X-WR-RELCALID:" . $meeting_id . "\r\n";
        $ical .= "X-MICROSOFT-CDO-BUSYSTATUS:FREE\r\n";
        $ical .= "UID:" . $meeting_id . "\r\n";
        $ical .= "DTSTAMP:" . date('Ymd').'T'.date('His') . "\r\n";
        $ical .= "SEQUENCE:" . $sequence . "\r\n";
        $ical .= "STATUS:" . $status . "\r\n";
        $ical .= "DTSTART:" . $startTime . "\r\n";
        $ical .= "DTEND:" . $endTime . "\r\n";
        $ical .= "DESCRIPTION:" . $description . "\r\n";
        $ical .= "LOCATION:" . $luogo . ($info ? " - " . trim($info) : '') . "\r\n";
        $ical .= "SUMMARY:" .$title . "\r\n";
        $ical .= "X-ALT-DESC;FMTTYPE=text/html:<html><body style='font-family:calibri; font-size:11pt'>" . str_replace("\\n", "<br>", $description) . "<body><html>\r\n";
        $ical .= "BEGIN:VALARM\r\n";
        $ical .= "TRIGGER:-PT15M\r\n";
        $ical .= "ACTION:DISPLAY\r\n";
        $ical .= "DESCRIPTION:Reminder\r\n";
        $ical .= "END:VALARM\r\n";
        $ical .= "END:VEVENT\r\n";
        $ical .= "END:VCALENDAR\r\n";
 
        $mail->Subject = $oggetto;
        if ($fllogo == 1) {$mail->AddEmbeddedImage ('../images/LogoMail.jpg', 'logoimg', 'LogoMail.jpg');}           
        $mail->Body = "<html><body style='font-family:calibri; font-size:11pt'>N.B. Se l'appuntamento non si apre automaticamente fare click sull'allegato.<br><br>" . $body . "</body></html>";
        $mail->Ical = $ical;
        $mail->addStringAttachment($ical, 'event.ics', 'base64', 'text/calendar');

if ($contaMail > 0){if(!$mail->Send()){die('Errore invio mail per nuovo appuntamento');}}