如何使用PHP和图像内容而不是路径

时间:2016-06-10 15:23:45

标签: php html-email mailgun

我正在尝试使用 mailgun api仅使用图像文件的内容向已发送的电子邮件添加内嵌图像。

据我所知,mailgun-php只允许在内联元素中指定路径。

有没有办法在不修改 mailgun-php 库的情况下使用内容添加图片?

我已经尝试在html img标签中内嵌整个内容,但这并不适用于所有电子邮件客户端(例如gmail):

<img src="data:image/png;base64,BASE64CONTENTSHERE==" />

1 个答案:

答案 0 :(得分:0)

我没有找到办法在不修改mailgun-php代码的情况下这样做,所以我使用以下内容将文件存储在临时文件夹中。

        $prefix = 'someprefix'; // Used to easily identify the file if needed
        $filename = uniqid($prefix, true).'.png';
        $path = sys_get_temp_dir().DIRECTORY_SEPARATOR.$filename;
        $f = fopen($path, 'w');
        fwrite($f, $binaryImageContent);   
        fclose($f); 

然后发送电子邮件并删除临时文件

        $mailgun = new \MailgunClient();
        $response = $mailgun->sendEmail(
            $fromEmail,
            $replyTo,
            array($toEmail), 
            $subject,
            $html,
            array(
              'inline' => $path
            )                    
        );

        unlink($path);

下面是MailgunClient类的样子,我必须显式设置Guzzle http客户端,因为默认情况下失败了。注意MAILGUN_API_KEYMAILGUN_DOMAIN必须使用define('MAILGUN_API_KEY', 'key_here');define('MAILGUN_DOMAIN', 'domain.com');

在代码中的其他位置设置为常量
<?php

use Mailgun\Mailgun;

class MailgunClient {

    public function sendEmail($from, $replyTo, $to, $subject, $html, $inline = null) {
        $client = new \Http\Adapter\Guzzle6\Client();
        $mailgun = new \Mailgun\Mailgun(MAILGUN_API_KEY, $client);        
        $domain = MAILGUN_DOMAIN;

        $params = array();
        $params['from'] = $from;
        $params['h:Reply-To'] = $replyTo;
        $params['subject'] = $subject;
        $params['text'] = $html;
        $params['html'] = $html;
        $params['inline'] = $inline;
        $params['to'] = $to;

        $mailgun->sendMessage($domain, $params, $inline);     
    }

}

最后在电子邮件中使用以下标记来引用内联图像。 src属性必须为cid:the_filename_created才能匹配电子邮件中的库输出。

 <img src="cid:'.$filename.'.png" alt="logo" style="width:auto;height:150px;max-height:150px;"/>