使用symfony生成并发送附件中的CSV文件

时间:2017-02-06 11:07:57

标签: php symfony swiftmailer

我需要在symfony

中运行cron时向每个用户发送CSV文件及其交易详情

我的代码如下生成csv数据并通过电子邮件发送

用户数组:

$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";
        }
}

但它不起作用,我收到的电子邮件只是附件中的noname as filename,这不是csv文件,也不是获取正文内容。

请任何机构都可以帮助我。我会很感激最好的答案

2 个答案:

答案 0 :(得分:0)

尝试使用Swift直接将文件附加到消息中,例如:

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

修改

或者您可以按生成的数据附加例如:

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

希望这个帮助

答案 1 :(得分:0)

自symfony 3.4起,请使用以下代码:

$message = (new \Swift_Message($subject))
        ->setFrom($from)
        ->setTo($recipient)
        ->setBody($bodyText)
        ->attach(
            (new \Swift_Attachment($csvData))
                ->setFilename('filename.csv')
                ->setContentType('application/csv')
        );