使用php邮件嵌入图像

时间:2017-12-27 01:42:18

标签: php phpmailer sugarcrm

我正在制作邮件并嵌入图片。因此,当我为图像设置一个特定目录(./upload/tmp_logo_company_upload/company_logo_resized.jpg)时,它会成功发送到我的电子邮件,并显示我嵌入的图像。

但我想要获取上传目录中的所有图像,所以每当我运行脚本时,上传文件夹中的所有图像都会发送给我。有人可以帮我解决这个问题,下面你会看到我的代码。感谢。

if( !defined('sugarEntry') ) define( 'sugarEntry',true );
    // Set required classes
    require_once('include/entryPoint.php');
    // Get access to globals
    global $db, $current_user, $timedate;

        $arRecipientsId = array();
        $objDefaultMail = new Email();
        $objDefault = $objDefaultMail->getSystemDefaultEmail();
        $objMail = new SugarPHPMailer();
        $objMail->setMailerForSystem();
        $objMail->From = $objDefault['email'];
        $objMail->FromName = $objDefault['name'];
        $objMail->Subject = "";
        // Set the Location of photo
        $strLocation = './upload/tmp_logo_company_upload/company_logo_resized.jpg';
        // Add image
        $objMail->AddEmbeddedImage($strLocation, 'company_logo_resized.jpg');
        //
        $objMail->Body = "Here. <img src='cid:company_logo_resized.jpg'>";
        // Send as HTML
        $objMail->IsHTML(true);
        // Clear previous email data
        $objMail->ClearAllRecipients();
        $objMail->ClearReplyTos();
        $objMail->prepForOutbound();
        // Store recipients
        $arRecipientsId[] = "1"; //crmonline
        // Add as BCC
        $objMail->AddBCC('email@gmail.com');
        // Mail sent? 
        if( $objMail->send() ) {
        // echo "Email Has Been Sent";
        $GLOBALS['log']->fatal("WORKING");
        }
    // }

2 个答案:

答案 0 :(得分:1)

无需拨打ClearAllRecipientsClearReplyTos - 因为你有新的实例,所以那些已经清空的东西已经空了。

要迭代文件夹中的所有文件,请使用DirectoryIterator - 这将获得您需要的所有文件名,因此您只需为每个文件调用addEmbeddedImage并添加<img src="cid:xxx">要嵌入的每个图像的标签。

$dir = './upload/tmp_logo_company_upload';
$cidn = 0;
foreach (new DirectoryIterator($dir) as $fileInfo) {
    if($fileInfo->isDot() or $fileInfo->isDir()) continue;
    $objMail->addEmbeddedImage($dir . DIRECTORY_SEPARATOR . $fileInfo->getFilename(), "img_$cidn");
    $mailObj->Body .= "<img src=\"cid:img_$cidn\">";
    ++$cidn;
}

也就是说,这是在电子邮件中使用图像的低效方式 - 使用HTTP链接到图像要好得多 - 这样只有当收件人要求它们时才加载它们,而不是无论发送它们。

答案 1 :(得分:0)

非常简单,你缺少完整的图像公共路径

将此更改为以下

$objMail->Body = "Here. <img src='cid:company_logo_resized.jpg'>";

到(图像公共路径包括http)

$objMail->Body = "Here. <img src='http://example.com/publicppath /company_logo_resized.jpg'>";

添加从dir读取图像的代码

//path to the dir
$dir    = '/upload';
$files = scandir($dir);


foreach ($files as $image) {
    $all_img .= " <img src='http://example.com/imagepath/".$image."'><br>";
}

//for embeding image
foreach ($files as $image) {
    $im = file_get_contents($image);
    $em_img .="<img src='data:image/jpg;base64,".base64_encode($im)."'> <br>"
}

//via public path
$objMail->Body = "Here ".$all_img;

//or embed sending
$objMail->Body = "Here ".$em_img;

它应该有用