如何使用电子邮件发送HTML5画布图像

时间:2012-09-29 09:19:33

标签: php email canvas

首先我尝试使用Pear中的Mail_mime,但我无法从共享主机提供程序和cpanel加载该类。

接下来,我按照this post的说明进行操作 。它将图像写入“temp”文件夹,但写入零字节。 显然问题是,我错过了什么。 在某处,我读到了在编码字符串中转换+符号,但我不确定?

主要问题是如何使用电子邮件发送画布图像,我对此没有完全的了解。我关注了一些帖子,我认为我需要在服务器端创建一个临时图像文件,以便能够将其附加到具有内置邮件功能的电子邮件中。因为实际写入的0字节,首先解决该问题似乎是合乎逻辑的,并且邮件问题将自行解决。 从下面的评论来看,似乎首先创建一个图像不是必要的,但在我有一个可行的解决方案之前我还需要进行一些调查..

此外,如果有人有另一个解决方案或php类在邮件正文中发送图像 而不是附件

我用ajax

发送
var canvas = document.getElementById('doodle');
function serialize(canvas) {
    return canvas.toDataURL();
}

这是服务器端

case 'doodle':
    $image = $_POST['doodle'];
    $data ="doedeliedoe";

    $email ="from@msn.com";
    $headers="From:".$email."\r\n";
    $headers .= "MIME-Version: 1.0\r\n"; 
    $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
    list($settings, $encoded_string) = explode(',', $image);
    list($img_type, $encoding_method) = explode(';', substr($settings, 5));

    if($encoding_method == 'base64'){

        $file=fopen("/home/user/public_html/user/temp/newLego.png",'w+');

       fwrite($file,base64_decode($encoded_string)) ;
       fclose($file);
    }
    $my_file = "newLego.png";
    $my_path = "/home/user/public_html/user/temp/";
    $my_subject = "My Design";
    $my_message = "Designed by ".$email;
   $this-> mail_attachment($my_file, $my_path, "mymail@gmail.com", $email, $email, $email,  $my_subject, $my_message);  



function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $replyto, $subject, $message) {
    $file = $path.$filename;
    $file_size = filesize($file);
    $handle = fopen($file, "r");
    $content = fread($handle, $file_size);
    fclose($handle);
    $content = chunk_split(base64_encode($content));
    $uid = md5(uniqid(time()));
    $name = basename($file);
    $header = "From: ".$from_name." <".$from_mail.">\r\n";
    $header .= "Reply-To: ".$replyto."\r\n";
    $header .= "MIME-Version: 1.0\r\n";
    $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
    $header .= "This is a multi-part message in MIME format.\r\n";
    $header .= "--".$uid."\r\n";
    $header .= "Content-type:text/plain; charset=iso-8859-1\r\n";
    $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
    $header .= $message."\r\n\r\n";
    $header .= "--".$uid."\r\n";
    $header .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n"; // use different content types here
    $header .= "Content-Transfer-Encoding: base64\r\n";
    $header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
    $header .= $content."\r\n\r\n";
    $header .= "--".$uid."--";
    if (mail($mailto, $subject, "", $header)) {
        //echo "mail send ... OK"; // or use booleans here
    } else {
       // echo "mail send ... ERROR!";
    }
}   
谢谢,理查德

1 个答案:

答案 0 :(得分:2)

首先,你应该让自己更好地适应自己面临的问题。它是:

  1. 将画布转换为图像“文件” - 或 -
  2. 将图像“文件”附加到外发邮件
  3. 如果不做1,你将无法在你的场景中做到2.但是2.可以独立于1来解决..

    我建议你问问其中一个。整合两者实际上是非常直接的:

    • 如果您的邮件库只接受附件文件,则需要创建一个临时文件。您可以使用SplTempFileObject轻松地在PHP中创建临时文件。
    • 如果您的邮件库接受附件的二进制字符串,则只需传递二进制字符串。
    • 如果您需要调试是否从画布位图数据创建文件确实有效,您应该保存到文件并测试文件是否是图像(这最容易手动完成,但是这个也可以自动化)

    很抱歉,如果这个答案更像是一个评论,那就是我在实际提供代码方面没有太多用处,因为问题是分段很多。