Search code examples
phpsymfonyswiftmailer

Generate and Send CSV file in attachment with symfony


I need to send CSV file to every user with their transaction detail while run cron in symfony

My code is as below to generate csv data and send in email

array of user :

$array = array('name','ticket','history','date','flag','created by','transition');
   $f = fopen('php://temp', 'w');
  $line = $array;
  fputcsv($f, $line, ',');
  rewind($f);
 $stream_get_contents = stream_get_contents($f);
$sentmail = $this->sendEmail($stream_get_contents);
if($sentmail){
return true;
}else{
return false;
}
fclose($f);
unset($f);


public function sendEmail($csvData){
UserId='1';
    $em = $this->getContainer()->get('doctrine')->getManager();
        $getstaffuser = $em->getRepository('AdminBundle:User')->find($UserId);
        if ($getstaffuser) {
            if ($getstaffuser->getEmail()) {
                $objEmailTemplate = $em->getRepository('BviTemplateBundle:Emailtemplate')->findOneBy(array('emailkey' => 'KEYFIND', 'status' => 'Active'));
                if (!$objEmailTemplate) {
                    $output->writeln("\n####### Email template not present #######\n");
                    $logger->info("\n####### Email template not present #######\n");
                    return "NoEmailTemplate";
                }
                $attachment = chunk_split($csvData);
                $multipartSep = '-----' . md5(time()) . '-----';
                $bodydata = $objEmailTemplate->getBody();
                $body = "--$multipartSep\r\n"
                        . "Content-Type: text/plain; charset=ISO-8859-1; format=flowed\r\n"
                        . "Content-Transfer-Encoding: 7bit\r\n"
                        . "\r\n"
                        . "$bodydata\r\n"
                        . "--$multipartSep\r\n"
                        . "Content-Type: text/csv\r\n"
                        . "Content-Transfer-Encoding: base64\r\n"
                        . "Content-Disposition: attachment; filename=\"Website-Report-" . date("F-j-Y") . ".csv\"\r\n"
                        . "\r\n"
                        . "$attachment\r\n"
                        . "--$multipartSep--";

                $to = $getstaffuser->getEmail();
                $subject = $objEmailTemplate->getSubject();
                $mail = \Swift_Message::newInstance()
                        ->setSubject($subject)
                        ->setFrom($this->getContainer()->getParameter('fos_user.registration.confirmation.from_email'))
                        ->setTo($to);

                $mail->setBody($body)
                        ->setContentType('multipart/mixed');

                $issent = $this->getContainer()->get('mailer')->send($mail);
                if ($issent) {
                    return 'EmailSent';
                } else {
                    return 'EmailNotSent';
                }
            } else {
                return "NoEmailAddress";
            }
        } else {
            return "NoUser";
        }
}

But it is not working , I receive email as only file with noname as filename in attachment ,which is not csv file and not get body content.

Please any body can help me for this.I will appreciate best answer


Solution

  • Try attaching the files to the message directly with Swift as example:

    $mail = \Swift_Message::newInstance()
                ->setSubject($subject)
                ->setFrom($from)
                ->setTo($recipient)
                ->setBody($bodyText)
                ->attach(\Swift_Attachment::fromPath($absolutePathOfTheAttachedFile));
    

    EDIT:

    Or you can attach by generated data as example:

    ->attach(
             \Swift_Attachment::newInstance($csvData)
               ->setFilename('filename.csv')
               ->setContentType('application/csv') 
            );
    

    Hope this help