Add Picture In Email Body - php

i am not too good with PHP and programming but still i am trying to learn it in every possible way. I need help from experts. My code to send email is as below. i am able to send email, but the problem is, picture is not displaying in email body and it's showing a cross sign. any possible idea and suggestion is appreciated.
<?php
function send_email($from, $to, $subject, $message){
$headers = "From: ".$from."\r\n";
$headers .= "Return-Path: ".$from."\r\n";
$headers .= "CC: abc#gmail.com\r\n , xyz#gmail.com\r\n";
$headers .= "BCC: \r\n";
//set content type to HTML
$headers .= "Content-type: text/html\r\n";
if ( mail($to,$subject,$message,$headers) )
{
header("location:contact-us.php?msg=msgsent");
}
else
{
header("location:contact-us.php?msg=notsent");
}
}
//Function ends here
$from_email="";
$to_email="LMN#gmail.com";
$message.="<html><body background='images/bg11.jpg'>";
$message.="<p style=' color: #006789;'>Dear Team,</p> ";
$message.= "<p style=' color: #006789;'>You have received a feedback from $name & below are the details!!! </p>";
$message.= "<img src=images/c22.jpg>";
$message.="</body></html> ";
send_email(from_email,$to_email,$subject,$message);
?>

You are using a relative path:
<img src=images/c22.jpg>
When you open your mail, that path will mean nothing in a mail client and it is highly unlikely to exist on a webmail client. And if it does, it is not your image...
If you have that image stored on a web-server, you should use the absolute path to that image:
<img src="http://www.your-server.com/images/c22.jpg">

You're using a relative link, "images/c22.jpg", but you're sending this html in an email - there's no images/ directory relative to it to link to. If you wish to link to an image on the web, you can include a full url (http://someplace.com/images/bg11.jpg">). By default, those will usually not be displayed either - most email readers will filter them so as to not let you cause it to load remote content (tipping off that the email was opened, attempting funny business with malformated images, etc).
You can also attach an image to the email by setting the type to multipart/mixed and defining a boundary. Then send an image, defining a content-id in its headers, then your html linking to the content id as "cid:id-you-defined". Looks like this once in the email:
Content-Type: multipart/mixed; boundary="NOTUSEDINTEXT"
This text only shows if the reader can't deal with MIME
--NOTUSEDINTEXT
Content-Id: id_for_later
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcU
FhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgo
KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAABAAEDASIA
AhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAj/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFAEB
AAAAAAAAAAAAAAAAAAAAAP/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AJUAB//Z
--NOTUSEDINTEXT
Content-Type: text/html
<html><h1>Hi</h1><p>Here's an image <img src="cid:id_for_later"></html>
--NOTUSEDINTEXT--
.. but as you see it's slightly involved - might want to see if there's a php library that'll implement that (the mime headers and types) rather than pound them in yourself. But if you feel like dealing with it, inserting them yourself is ok too. And.. here too, some clients will filter them for safety unless you've clicked "Always show images" or something.

You have to upload your image on web server and give the absolute path to that image e.g:
<img src="http://www.yourwbesite.com/images/c22.jpg" alt="logo" />

Related

Send mail with embeded image without a library in php?

I'm sending mail with the mail() function of php. I embed image using base64 encoding inside the html code, but in gmail for example it doesn't show.
I read that a best way to do that is to use cid in the html code and attaching the image but I find only codes using phpmailer which I would like to avoid but the question is, is it possible with the php mail function or is there some simple classes to simplify the process ?
$message = $html_mail;
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
$headers .= 'To: '. $to . "\r\n";
$headers .= 'From: My website <'.$admin_mail.'>' . "\r\n";
$response = mail($to, $subject, $message, $headers);
Instead to using base64_encode image you should use html image tag with src path of your server, so it will download from your server.
<img src="http://www.yourserver.com/myimages/image1.jpg">
As your mail is having text/html header image will automatically parse via email client.
If you look at the "Original Source" in Gmail, you may find that gmail is editing the html to remove the image. idk if it does that or not though. I would try copying the html from the email in gmail and putting it in an html file and see if it loads in a browser correctly. Then you'll know for sure if gmail is messing it up or if it's a bug in another place.
FYI, sending html emails that work in all email clients can be a huge PAIN. The best guide I know of is this - https://www.sitepoint.com/how-to-code-html-email-newsletters/ . SitePoint also sells a book about it that is the gold standard IMO.
Good luck!

using PHP to return an image in a base64 encoded email

I'm working on an email send and tracking application, but I'm running into a problem that I just can't figure out. I want to us a tracking image in my emails but I'm getting some strange behavior. Currently, I'm sending out emails encoded in base64. In the body of the HTML message I'm using an HTML image tag with a link to a PHP file on my server. That file sends back an image using the following PHP code:
header("Content-Type: image/png");
readfile("full-server-path-to-image.png");
This is where it gets strange. If I view the message in the Outlook email client the image will not display (just shows red "X" image icon). Other normally linked images will display just fine though. If I view the same message in Gmail I am able to see all of the images. It's really weird that the image serves up just fine in some email clients but not all of them.
I noticed this problem started when I changed to encoding my messages in base64. Before I started encoding my messages I was able to view all images in any email client. My gut is telling me this has something to do with the content-encoding-type, but I have no idea how to fix it. Any help would be appreciated!
Here is the PHP code I'm using to send out messages:
$myHTMLmessage = chunk_split(base64_encode('
<html><head></head><body>
<img src="https://www.my-web-site.com/openTrack.php?t={trackerid}"></a>
</body></html>'));
$boundary = uniqid('np');
$to = "somebody-else#another-web-site.com"
$headers = "MIME-Version: 1.0\r\n";
$headers .= "From: somebody#my-web-site.com\r\n";
$headers .= "Content-Type: multipart/alternative;boundary=" . $boundary . "\r\n";
$message = "This is a MIME encoded message.";
$message .= "\r\n\r\n--" . $boundary . "\r\n";
$message .= "Content-Type: text/plain;charset=UTF-8\r\n";
$message .= "Content-Transfer-Encoding: base64\r\n\r\n";
//Plain text body
$message .= "some plain text";
$message .= "\r\n\r\n--" . $boundary . "\r\n";
$message .= "Content-Type: text/html;charset=UTF-8\r\n";
$message .= "Content-Transfer-Encoding: base64\r\n\r\n";
//Html body
$message .= $myHTMLmessage;
$message .= "\r\n\r\n--" . $boundary . "--";
mail($to,$subject,$message,$headers);
Just in case anyone runs into something like this I figured out it all boils down to how email clients encode urls. In my original code I am using a url with 2 parameters inside my image src attribute. Like this:
http://www.my-web-site.com/page.php?pram1=something&pram2=something
When Outlook processes this url it get changed to:
http://www.my-web-site.com/page.php?pram1=something&pram2=something
Other email clients are smart enough to leave the & symbol the way it is without converting it to &
In my live code I needed to $_GET both url parameters and process them. If my script couldn't process both parameters then it wouldn't even get to the line where it would send back an image. The best workaround I could come up with was adding this code in my page.php file:
$pram1 = $_GET['pram1'];
$pram2 = $_GET['pram2'];
if(!isset($pram2)){
$pram2 = $_GET['amp;pram2'];
}
// now regardless of the email client both parameters contain a value to process
if((isset($pram1)) && (isset($pram2))){
header("Content-Type: image/png");
readfile("full-server-path-to-image.png");
}
I know is sounds pretty simple, but I had been scratching my head over this for way too long. Originally, I was convinced it was something to do with how the message was encoded before it was sent out. Never thought it would be Outlook changing my code. On second though Microsoft never likes to make things easy.....never gets old...lol

Images from HTML email not displayed

I have an HTML mail sender function (code given below). It works, but when I include an image in the email HTML, the receiving inbox sometimes doesn't display it. I've tested and tested, and the rule is simple: Yahoo display the images, Gmail and Outlook don't.
Before you say anything, this is not an issue with the receiving Gmail/Outlook user not allowing images to be displayed. I've allowed images in both, and they both display a blank space (the size of the image) where the image is supposed to be (or ALT text if I set it). It's as if they think the image URL is wrong, but it can't be wrong because Yahoo loads it correctly. Also, I've viewed the message source in Outlook and the image source is correct there.
Here is the mail-sending code, pretty straight-forward:
$headers = "MIME-Version: 1.0\n";
$headers .= "Content-Type: text/html; charset=$charset\n";
$headers .= "Content-Transfer-Encoding: 8bit\n";
$headers .= "From: $from_address\n";
$headers .= "Reply-To: $from_address\n";
$headers .= "Return-Path: $from_address\n";
ini_set("sendmail_from",$CONST_MAIL);
mail($to_address,$subject,$message,$headers);
And $message might be something like the following:
<img alt="" src="http://www.domain.com/correctimagepath/img.jpg" id="newsletter_01" style="border: 0px none;" height="470" width="670">
<p>Hello world!</p>
Any ideas what might be wrong here?

generating PDF on the fly using TCPDF

i'm using TCPDF library to generate a PDF (bill) on the fly and send it via email. It all works but i have a weird problem. When i send the email to a gmail account everything is fine, but when i send it to my mail server i get the email with the pdf but when i open it it doesn't open and i get a message "Adobe reader could not open file.pdf because it's either not a supported format or because the file has been damaged." (the pdf in the email is blank).
I save the PDF into a string like so:
$attachment = $pdf->Output("mypdf.pdf","E");
$attachment = chunk_split($attachment);
and send it via email like so:
$header .= "--".$separator.$eol;
$header .= "Content-Type: application/pdf; name='mypdf.pdf'".$eol;
$header .= "Content-Transfer-Encoding: base64".$eol;
$header .= "Content-Disposition= attachment".$eol.$eol;
$header .= $attachment;
i'm sending the email with php mail function.
The funny thing is if i force the download of the pdf, like so:
$attachment = $pdf->Output("mypdf.pdf","D");
the file is OK and opens without a problem! But if i change it back to "E" it doesn't work.
The other weird thing is that some times i can open the pdf (that i got on my mail server) without a problem, but the next time it wont work (even if i send the exact same email).
Does any one have any idea what is going on? I would like to avoid saving the pdf on the local server.
Why you avoid saving pdf file? You can save it with "F" parameter. After mail has sent you can delete it with unlink function
I see some minor flaws:
Content-Disposition= should be Content-Disposition:
You should end your attachment with "--".$separator."--"
I'm not sure, if this fixes your problems. Anyway I think it's quite complicated to create all the headers manually. I use PEARs Mail_Mime for this task since years and you will find a lot of simple ready to use solutions.

php mail() link image

I am trying to send an e-mail using the following code:
$htmlHeaders="";
$htmlHeaders = "MIME-Version: 1.0 \r\n";
$htmlHeaders .= "Content-type: text/html; charset=iso-8859-1 \r\n";
$htmlHeaders .= "X-Mailer: PHP/" . phpversion(). "\r\n";
$htmlHeaders .= "From: System <test#test.com> \r\n";
mail("dest#example.com","Subject",'New test <img src="http://www.someserver/image.jpg">',$htmlHeaders);
what I noticed is that for some images (I always link the images through an http link) are working fine and the mail is delivered correctly, while for some other images I get problems; that is, the image is NOT delivered.
For example, trying to use this image wont work: http://img826.imageshack.us/img826/2601/gitaallago.png
I guess it is a problem of headers, but I really do not understand how to fix this.
Any hints?
Often times the problem is the mail client. Some mail clients by default will only download images under a certain size, some will not download any images at all.
Your best bet (though it can be quite a lot more work than what you're doing now) is to attach the image to the email with a CID and reference the image that way (<img src="cid:whatever">)
It will increase the size of your email because you have to transmit the image with each email, but it will display in far more mail clients that way.
Is the correct MIME type being served by the server for the images?
You didn't make it clear whether or not you're saving the image on your server, and linking to it from there, or linking to it straight from Imageshack (in this example.) If you're linking straight from Imageshack, then MIME types definitely aren't the problem. Worth looking into, however, if you're hosting the images on your server.

Categories