Jump to content

Attach on-the-fly JPG to email.


atomique

Recommended Posts

Hello all -

 

I'm trying to export an image from flash and send that image through email using PHP. The jpg is exporting just fine, but I am uncertain as to how to attach it to an email. I'm using sephiroth's print class to export the jpg. Here is the code that renders the image in a browser:

 

<?php

error_reporting(0);
/**
* Get the width and height of the destination image
* from the POST variables and convert them into
* integer values
*/
$w = (int)$_POST['width'];
$h = (int)$_POST['height'];

// create the image with desired width and height
$img = imagecreatetruecolor($w, $h);

// now fill the image with blank color
// do you remember i wont pass the 0xFFFFFF pixels
// from flash?
imagefill($img, 0, 0, 0xFFFFFF);

$rows = 0;
$cols = 0;

// now process every POST variable which
// contains a pixel color
for($rows = 0; $rows < $h; $rows++){
    // convert the string into an array of n elements
    $c_row = explode(",", $_POST['px' . $rows]);
    for($cols = 0; $cols < $w; $cols++){
        // get the single pixel color value
        $value = $c_row[$cols];
        // if value is not empty (empty values are the blank pixels)
        if($value != ""){
            // get the hexadecimal string (must be 6 chars length)
            // so add the missing chars if needed
            $hex = $value;
            while(strlen($hex) < 6){
                $hex = "0" . $hex;
            }
            // convert value from HEX to RGB
            $r = hexdec(substr($hex, 0, 2));
            $g = hexdec(substr($hex, 2, 2));
            $b = hexdec(substr($hex, 4, 2));
            // allocate the new color
            // N.B. teorically if a color was already allocated
            // we dont need to allocate another time
            // but this is only an example
            $test = imagecolorallocate($img, $r, $g, $b);
            // and paste that color into the image
            // at the correct position
            imagesetpixel($img, $cols, $rows, $test);
        }
    }
}

// print out the correct header to the browser
header("Content-type:image/jpeg");
// display the image
imagejpeg($img, "", 90);
?>

Here is the mailform I am using. It is currently working in flash without trying to attach the image:

<?
include("proc_form_vars.php");
//standard form values
$toMail     = procformvar("post","toEmail","");
$toName     = procformvar("post","toName","");
$fromMail     = procformvar("post","fromEmail","");
$fromName     = procformvar("post","fromName","");
$dl         = procformvar("post","dl","");

//mailformvars("[email protected]","");

$subject = "$emailSubject";
$headers = "From: $fromMail\n";
$headers = $headers . "MIME-Version: 1.0\nContent-type: text/html; charset=iso-8859-1";
$scriptpath = str_replace("send_email.php","/",$_SERVER["SCRIPT_NAME"]);
$serverPath = "http://". $_SERVER["HTTP_HOST"].$scriptpath;
$linkUrl = $serverPath."test.html";
$emailSubject     = "You've received a customized wallpaper!";
//$linkUrl = $siteURL.$dl;

//$linkUrl = $serverPath;
$mailText = "<font face=\"Arial\"> $toName - <br>
$fromName has sent you a customized wallpaper!
</font>";
mailformvars("[email protected]");
if (mail($toMail,$fromName." "."$emailSubject",$mailText,$headers)) {
    echo "&script_message=ok";
} else {
    echo "&script_message=failed";
}
?>

Any suggestions on how I go about combining the two?

 

Thanks for any help you can give!

Link to comment
https://forums.phpfreaks.com/topic/106983-attach-on-the-fly-jpg-to-email/
Share on other sites

Doing attachments on an email can get a little tricky. There is some information here on how to do attachments: http://www.zend.com/zend/spotlight/sendmimeemailpart1.php

 

But, it's a lot easier to use this script, which will do all the grunt work for you:

http://phpmailer.codeworxtech.com/

Looking at that zend link rhodesa gave you basically explains the deal by the looks of it. Basically you'll have to set the 'Content-Type' to 'multipart/mixed', and add a boundary delimiter, say 'boundary="ZEND-12345";'.

 

Then you handle each part of the email seperately, the normal part of the email then the image part, e.g.

Content-Type: image/jpeg; name="zendlogo.jpg";

Content-Transfer-Encoding: base64

 

Content-Disposition: attachment

 

<base64 encoded data for the zendlogo.jpg image>

 

--ZEND-12345--

 

Where it says about base64, thats where you need to dump your image. This is the binary of the image encoded into base64. To do this you'll probably want to save the image to file (not send to browser), afterwards delete it from file...

 

It's simpler that you think.

<?
error_reporting(0);
include("proc_form_vars.php");

$toMail 	= procformvar("post","toEmail","");
$toName 	= procformvar("post","toName","");
$fromMail 	= procformvar("post","fromEmail","");
$fromName 	= procformvar("post","fromName","");
$dl 		= procformvar("post","dl","");
$subject = "You've received a Custom Wallpaper!";
$headers = "From: $fromMail\n";
$headers = $headers . "MIME-Version: 1.0\nContent-type: multipart/mixed; boundary=\"BOUNDARY\"; \n";
$headers = $headers . "Content-Transfer-Encoding: 7bit\n";
$headers = $headers . "This part of the E-mail should never be seen.\n--BOUNDARY\n";
$scriptpath = str_replace("send_email.php","/",$_SERVER["SCRIPT_NAME"]);
$serverPath = "http://". $_SERVER["HTTP_HOST"].$scriptpath;
$linkUrl = $serverPath."test.html";
$mailText = "<font face=\"Arial\"> $toName - <br>
$fromName has sent you a customized wallpaper!
</font>";


$w = (int)$_POST['width'];
$h = (int)$_POST['height'];

$img = imagecreatetruecolor($w, $h);
imagefill($img, 0, 0, 0xFFFFFF);

$rows = 0;
$cols = 0;
for($rows = 0; $rows < $h; $rows++){
$c_row = explode(",", $_POST['px' . $rows]);
for($cols = 0; $cols < $w; $cols++){
	$value = $c_row[$cols];
	if($value != ""){
		$hex = $value;
		while(strlen($hex) < 6){
			$hex = "0" . $hex;
		}
		$r = hexdec(substr($hex, 0, 2));
		$g = hexdec(substr($hex, 2, 2));
		$b = hexdec(substr($hex, 4, 2));
		$test = imagecolorallocate($img, $r, $g, $b);
		imagesetpixel($img, $cols, $rows, $test);
	}
}
}

//$headers .= "Content-type:image/jpeg; filename=\"wallpaper.jpg\";");
//imagejpeg($img, "", 100);
$fileatt = $img;
$fileatttype = "image/jpg"; 
$fileattname = "wallpaper.jpg";
$file = fopen( $fileatt, 'rb' ); 
$data = fread( $file, filesize( $fileatt ) ); 
fclose( $file );

$semi_rand = md5( time() ); 
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 
$headers .= "\nMIME-Version: 1.0\n" . 
		"Content-Type: multipart/mixed;\n" . 
		" boundary=\"{$mime_boundary}\"";
$message = "This is a multi-part message in MIME format.\n\n" . 
		"--{$mime_boundary}\n" . 
		"Content-Type: text/plain; charset=\"iso-8859-1\"\n" . 
		 "Content-Transfer-Encoding: 7bit\n\n" . 
		$message . "\n\n";
		$data = chunk_split( base64_encode( $data ) );
?>

 

Okay, now I have this, and it isn't working. Am I close?

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.