Search code examples
phpemailyii2swiftmailer

How to pass multiple headers for swift mailer php


i am creating meeting in outlook by using php, i found few examples and tried to implement and its working but it is working with php mail() method, in php mail method i know how to pass headers but the project where i want to implement is using swift mailer and i don`t know how to define these header in swift mailer , the following is a working example using php mail()

$from_name = "Some One";        
$from_address = "def@abc.com";        
$to_name = "Soem Two";        
$to_address = "xyz@abc.com";        

$date               = '20190905';
$startTime          = '13:20:00';
$endTime            = '19:00:00';   

$subject = "Standup Meeting";        
$description = "The purpose of the meeting is to discuss works done and inprogress";        
$location = "ABCD EFGH";
$domain = 'mydomain.com';

//Create Email Headers
$mime_boundary = "----Meeting Booking----".MD5(TIME());

$headers = "From: ".$from_name." <".$from_address.">\n";
$headers .= "Reply-To: ".$from_name." <".$from_address.">\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/alternative; boundary=\"$mime_boundary\"\n";
$headers .= "Content-class: urn:content-classes:calendarmessage\n";

//Create Email Body (HTML)
$message = "--$mime_boundary\r\n";
$message .= "Content-Type: text/html; charset=UTF-8\n";
$message .= "Content-Transfer-Encoding: 8bit\n\n";
$message .= "<html>\n";
$message .= "<body>\n";
$message .= '<p>Dear '.$to_name.',</p>';
$message .= '<p>'.$description.'</p>';
$message .= "</body>\n";
$message .= "</html>\n";
$message .= "--$mime_boundary\r\n";

$ical = 'BEGIN:VCALENDAR' . "\r\n" .
'PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN' . "\r\n" .
'VERSION:2.0' . "\r\n" .
'METHOD:REQUEST' . "\r\n" .
'BEGIN:VTIMEZONE' . "\r\n" .
'TZID:Eastern Time' . "\r\n" .
'BEGIN:STANDARD' . "\r\n" .
'DTSTART:20091101T020000' . "\r\n" .
'RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11' . "\r\n" .
'TZOFFSETFROM:-0400' . "\r\n" .
'TZOFFSETTO:-0500' . "\r\n" .
'TZNAME:EST' . "\r\n" .
'END:STANDARD' . "\r\n" .
'BEGIN:DAYLIGHT' . "\r\n" .
'DTSTART:20090301T020000' . "\r\n" .
'RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3' . "\r\n" .
'TZOFFSETFROM:-0500' . "\r\n" .
'TZOFFSETTO:-0400' . "\r\n" .
'TZNAME:EDST' . "\r\n" .
'END:DAYLIGHT' . "\r\n" .
'END:VTIMEZONE' . "\r\n" .  
'BEGIN:VEVENT' . "\r\n" .
'ORGANIZER;CN="'.$from_name.'":MAILTO:'.$from_address. "\r\n" .
'ATTENDEE;CN="'.$to_name.'";ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:'.$to_address. "\r\n" .
'LAST-MODIFIED:' . date("Ymd\TGis") . "\r\n" .
'UID:'.date("Ymd\TGis", strtotime($startTime)).rand()."@".$domain."\r\n" .
'DTSTAMP:'.date("Ymd\TGis"). "\r\n" .
'DTSTART:'.$date."T".$startTime."00Z\r\n" .
'DTEND:'.$date."T".$endTime."00Z\r\n" .
'TRANSP:OPAQUE'. "\r\n" .
'SEQUENCE:1'. "\r\n" .
'SUMMARY:' . $subject . "\r\n" .
'LOCATION:' . $location . "\r\n" .
'CLASS:PUBLIC'. "\r\n" .
'PRIORITY:5'. "\r\n" .
'BEGIN:VALARM' . "\r\n" .
'TRIGGER:-PT15M' . "\r\n" .
'ACTION:DISPLAY' . "\r\n" .
'DESCRIPTION:Reminder' . "\r\n" .
'END:VALARM' . "\r\n" .
'END:VEVENT'. "\r\n" .
'END:VCALENDAR'. "\r\n";
$message .= 'Content-Type: text/calendar;name="meeting.ics";method=REQUEST'."\n";
$message .= "Content-Transfer-Encoding: 8bit\n\n";
$message .= $ical;

$mailsent = mail($to_address, $subject, $message, $headers);

if($mailsent)
{
    echo 'Meeting email sent';
}
else
{
    echo 'Problem in sending email';
}

But i want this in swift mailer i don`t know how to create headers for swift mailer and how to pass when composing email in swift can any one please help i want this.

 $from_name = "Some One";        
        $from_address = "def@abc.com";        
        $to_name = "Soem Two";        
        $to_address = "xyz@abc.com";       


        $date               = '20190905';
        $startTime          = '13:20:00';
        $endTime            = '19:00:00';   

        $subject = "Standup Meeting";        
        $description = "The purpose of the meeting is to discuss works done and inprogress";        
        $location = "abcfer ";
        $domain = 'mydomain.com';

        //Create Email Headers
        $mime_boundary = "----Meeting Booking----".MD5(TIME());

        $headers = "From: ".$from_name." <".$from_address.">\n";
        $headers .= "Reply-To: ".$from_name." <".$from_address.">\n";
        $headers .= "MIME-Version: 1.0\n";
        $headers .= "Content-Type: multipart/alternative; boundary=\"$mime_boundary\"\n";
        $headers .= "Content-class: urn:content-classes:calendarmessage\n";

        //Create Email Body (HTML)
        $message = "--$mime_boundary\r\n";
        $message .= "Content-Type: text/html; charset=UTF-8\n";
        $message .= "Content-Transfer-Encoding: 8bit\n\n";
        $message .= "<html>\n";
        $message .= "<body>\n";
        $message .= '<p>Dear '.$to_name.',</p>';
        $message .= '<p>'.$description.'</p>';
        $message .= "</body>\n";
        $message .= "</html>\n";
        $message .= "--$mime_boundary\r\n";

        $ical = 'BEGIN:VCALENDAR' . "\r\n" .
        'PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN' . "\r\n" .
        'VERSION:2.0' . "\r\n" .
        'METHOD:REQUEST' . "\r\n" .
        'BEGIN:VTIMEZONE' . "\r\n" .
        'TZID:Eastern Time' . "\r\n" .
        'BEGIN:STANDARD' . "\r\n" .
        'DTSTART:20091101T020000' . "\r\n" .
        'RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11' . "\r\n" .
        'TZOFFSETFROM:-0400' . "\r\n" .
        'TZOFFSETTO:-0500' . "\r\n" .
        'TZNAME:EST' . "\r\n" .
        'END:STANDARD' . "\r\n" .
        'BEGIN:DAYLIGHT' . "\r\n" .
        'DTSTART:20090301T020000' . "\r\n" .
        'RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3' . "\r\n" .
        'TZOFFSETFROM:-0500' . "\r\n" .
        'TZOFFSETTO:-0400' . "\r\n" .
        'TZNAME:EDST' . "\r\n" .
        'END:DAYLIGHT' . "\r\n" .
        'END:VTIMEZONE' . "\r\n" .  
        'BEGIN:VEVENT' . "\r\n" .
        'ORGANIZER;CN="'.$from_name.'":MAILTO:'.$from_address. "\r\n" .
        'ATTENDEE;CN="'.$to_name.'";ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:'.$to_address. "\r\n" .
        'LAST-MODIFIED:' . date("Ymd\TGis") . "\r\n" .
        'UID:'.date("Ymd\TGis", strtotime($startTime)).rand()."@".$domain."\r\n" .
        'DTSTAMP:'.date("Ymd\TGis"). "\r\n" .
        'DTSTART:'.$date."T".$startTime."00Z\r\n" .
        'DTEND:'.$date."T".$endTime."00Z\r\n" .
        'TRANSP:OPAQUE'. "\r\n" .
        'SEQUENCE:1'. "\r\n" .
        'SUMMARY:' . $subject . "\r\n" .
        'LOCATION:' . $location . "\r\n" .
        'CLASS:PUBLIC'. "\r\n" .
        'PRIORITY:5'. "\r\n" .
        'BEGIN:VALARM' . "\r\n" .
        'TRIGGER:-PT15M' . "\r\n" .
        'ACTION:DISPLAY' . "\r\n" .
        'DESCRIPTION:Reminder' . "\r\n" .
        'END:VALARM' . "\r\n" .
        'END:VEVENT'. "\r\n" .
        'END:VCALENDAR'. "\r\n";
        $message .= 'Content-Type: text/calendar;name="meeting.ics";method=REQUEST'."\n";
        $message .= "Content-Transfer-Encoding: 8bit\n\n";
        $message .= $ical;

         $message=Yii::$app->mailer->compose()
        ->setFrom($from_address)
        ->setTo($to_address)
        ->setSubject('This is subject') // ???? ??????
        ->addTextHeader($headers)
        ->setHtmlBody($message)
        ->send();
        var_dump($message);

Solution

  • You are using swiftmailer to avoid the need to set headers by yourself. You can send mail with headers that you need like this:

    $from_name = "Some One";
    $from_address = "def@abc.com";
    $to_name = "Soem Two";
    $to_address = "xyz@abc.com";
    
    
    $date               = '20190905';
    $startTime          = '13:20:00';
    $endTime            = '19:00:00';
    
    $subject = "Standup Meeting";
    $description = "The purpose of the meeting is to discuss works done and inprogress";
    $location = "acfr ffs";
    $domain = 'my.com';
    
    /**
     * @var \yii\swiftmailer\Message $mail
     */
    $mail=Yii::$app->mailer->compose()
        ->setFrom([$from_address => $from_name])
        ->setReplyTo([$from_address => $from_name])
        ->setSubject($subject)
        ->setTo([$to_address => $to_name]);
    
    $mail->addHeader('Content-class', 'urn:content-classes:calendarmessage');
    
    //Create Email Body (HTML)
    $message = "<html>\n";
    $message .= "<body>\n";
    $message .= '<p>Dear '.$to_name.',</p>';
    $message .= '<p>'.$description.'</p>';
    $message .= "</body>\n";
    $message .= "</html>\n";
    
    $ical = 'BEGIN:VCALENDAR' . "\r\n" .
        ... skipped the body for better readability ...
        'END:VCALENDAR'. "\r\n";
    
    $swiftMail = $mail->getSwiftMessage();
    $swiftMail->setContentType('multipart/alternative');
    $swiftMail->addPart($message, 'text/html');
    
    $swiftMail->addPart(
        $ical,
        'text/calendar;name="meeting.ics";method=REQUEST',
        null
    );
    
    
    $mail->send();
    

    If you don't need this specific headers and your goal is just to send calendar event you can make it even more simple

    $from_name = "Some One";
    $from_address = "def@abc.com";
    $to_name = "Soem Two";
    $to_address = "xyz@abc.com";
    
    
    $date               = '20190905';
    $startTime          = '13:20:00';
    $endTime            = '19:00:00';
    
    $subject = "Standup Meeting";
    $description = "The purpose of the meeting is to discuss works done and inprogress";
    $location = "cfrt hjd";
    $domain = 'my.com';
    
    $mail=Yii::$app->mailer->compose()
        ->setFrom([$from_address => $from_name])
        ->setReplyTo([$from_address => $from_name])
        ->setSubject($subject)
        ->setTo([$to_address => $to_name]);
    
    //Create Email Body (HTML)
    $message = "<html>\n";
    $message .= "<body>\n";
    $message .= '<p>Dear '.$to_name.',</p>';
    $message .= '<p>'.$description.'</p>';
    $message .= "</body>\n";
    $message .= "</html>\n";
    
    $ical = 'BEGIN:VCALENDAR' . "\r\n" .
        ... skipped the body for better readability ...
        'END:VCALENDAR'. "\r\n";
    
    $mail->setHtmlBody($message);
    $mail->attachContent(
        $ical,
        [
            'contentType' => 'text/calendar;name="meeting.ics";method=REQUEST'
        ]
    );
    
    $mail->send();