 |
 |
problem displaying html e-mails with attached images from PHP mail system
|
 |
|
 |
|
Junior Member
Join Date: May 2002
Location: Australia
Status:
Offline
|
|
I have built a mailing list in PHP, that is full operational and works exactly as it should for sending e-mails.
The problem is related to images in HTML e-mails, I preview the html in a web-browser, and it is fine, displays exactly as it should. However, when I send out the test html email the images used repeat them self's at the bottom of the e-mail. I am using the img tag to like up the images in the html page.
The images and the html are processes fine by the PHP mailing list system however, the e-mail fails to display correctly in a mail clients
Is their some kind of special html tags or header types that must me used to make it work. Or could their be something wrong with my PHP, that is causing it to mess up.
#####################
HERE IS MY HTML - I have replaced all <> with []
#####################
[!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd"]
[html]
[head]
[title]dalcrossTemplate[/title]
[/head]
[body bgcolor="#ffffff" marginwidth="20" marginheight="20" leftmargin="20" topmargin="20"]
[table width="100%" height="100%" border="0" cellspacing="0" cellpadding="0"]
[tr]
[td align="center" valign="middle"]
[table border="0" width="0" cellspacing="0" cellpadding="0"]
[tr]
[td bgcolor="#e6e6e6"]
[table border="0" cellspacing="10" cellpadding="0"]
[tr]
[td valign="left"][font face="verdana, arial, sans-serif" size="3" color="#660000"]Dalcross Mailing List[/font][/td]
[td][img src="navbar.gif" alt="" width="100" height="100" border="0"][/td]
[/tr]
[/table]
[/td]
[/tr]
[tr]
[td valign="top"]
[table width="500" border="0" width="0" cellspacing="0" cellpadding="0"]
[tr]
[td bgcolor="#cccccc"][img src="spacer.gif" alt="" width="1" height="1" border="0"][/td]
[td valign="top"]
[table width="100%" border="0" cellspacing="0" cellpadding="0"]
[tr]
[td align="center" valign="top"]
[table width="200" border="0" cellspacing="5" cellpadding="0"]
[tr]
[td valign="top"][font face="verdana, arial, sans-serif" size="2" color="#000000"]
[ul]
[li]This is a links to a page[/li]
[li]This is a links to a page[/li]
[li]This is a links to a page[/li]
[li]This is a links to a page[/li]
[li]This is a links to a page[/li]
[li]This is a links to a page[/li]
[li]This is a links to a page[/li]
[/ul]
[/font][/td]
[/tr]
[/table]
[/td]
[td bgcolor="#cccccc"][img src="spacer.gif" alt="" width="1" height="1" border="0"][/td]
[td align="center" valign="top"]
[table width="280" border="0" cellspacing="5" cellpadding="0"]
[tr]
[td valign="left"][font face="verdana, arial, sans-serif" size="3" color="#660000"]Dalcross Mailing List[/font][/td]
[/tr]
[tr]
[td valign="top"][font face="verdana, arial, sans-serif" size="2" color="#000000"]
[p]This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.[/p]
[/font][/td]
[/tr]
[/table]
[/td]
[/tr]
[tr]
[td colspan="3" bgcolor="#cccccc"][img src="spacer.gif" alt="" width="1" height="1" border="0"][/td]
[tr]
[/table]
[table border="0" width="100%" cellspacing="0" cellpadding="0"]
[tr]
[td valign="top"]
[table border="0" cellspacing="10" cellpadding="0"]
[tr]
[td colspan="2" valign="middle"][font face="verdana, arial, sans-serif" size="3" color="#660000"]Title of this article summery[/font][/td]
[/tr]
[tr]
[td valign="top"][font face="verdana, arial, sans-serif" size="2" color="#000000"]
[p]This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.[/p]
[/font][/td]
[td valign="middle"][img src="#.gif" alt="" width="150" height="150" border="0"][/td]
[/tr]
[/table]
[/td]
[/tr]
[tr]
[td bgcolor="#cccccc"][img src="spacer.gif" alt="" width="1" height="1" border="0"][/td]
[/tr]
[/table]
[table border="0" width="100%" cellspacing="0" cellpadding="0"]
[tr]
[td valign="top"]
[table border="0" cellspacing="10" cellpadding="0"]
[tr]
[td colspan="2" valign="middle"][font face="verdana, arial, sans-serif" size="3" color="#660000"]Title of this article summery[/font][/td]
[/tr]
[tr]
[td valign="top"][font face="verdana, arial, sans-serif" size="2" color="#000000"]
[p]This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.[/p]
[/font][/td]
[td valign="middle"][img src="#.gif" alt="" width="150" height="150" border="0"][/td]
[/tr]
[/table]
[/td]
[/tr]
[tr]
[td bgcolor="#cccccc"][img src="spacer.gif" alt="" width="1" height="1" border="0"][/td]
[/tr]
[/table]
[table border="0" width="100%" cellspacing="0" cellpadding="0"]
[tr]
[td valign="top"]
[table border="0" cellspacing="10" cellpadding="0"]
[tr]
[td colspan="2" valign="middle"][font face="verdana, arial, sans-serif" size="3" color="#660000"]Title of this article summery[/font][/td]
[/tr]
[tr]
[td valign="top"][font face="verdana, arial, sans-serif" size="2" color="#000000"]
[p]This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.
This is a piece of text that explains everything you need to know about this email.[/p]
[/font][/td]
[td valign="middle"][img src="#.gif" alt="" width="150" height="150" border="0"][/td]
[/tr]
[/table]
[/td]
[/tr]
[tr]
[td bgcolor="#cccccc"][img src="spacer.gif" alt="" width="1" height="1" border="0"][/td]
[/tr]
[/table]
[/td]
[td bgcolor="#cccccc"][img src="spacer.gif" alt="" width="1" height="1" border="0"][/td]
[/tr]
[/table]
[/td]
[/tr]
[tr]
[td bgcolor="#e6e6e6"]
[table border="0" width="100%" cellspacing="0" cellpadding="0"]
[tr]
[td align="center" valign="middle"][font face="verdana, arial, sans-serif" size="1" color="#00000"]
[p]
[p][a href="http://www.dalcross.com/contactus/index.php4"]Contact Dalcross[/a] | [a href="http://www.dalcross.com/database/search.php4"]Search Dalcross[/a][/p]
[p]For information about Dalcross Private Hospital Services. visit [a href="http://www.dalcross.com"]Dalcross.com[/a][/p]
[p]28 Stanhope Road Killara NSW 2071 Australia[/p]
[p]Main reception: (02) 9932 6600[/p]
[p]Copyright © 2002 Dalcross Private Hospital. All Rights Reserved[/p]
[p]
[/font][/td]
[/tr]
[/table]
[/td]
[/tr]
[/table]
[/td]
[/tr]
[/table]
[/body]
[/html]
################################################## #
THIS IS THE PHP CODE THAT DOES THE EMAIL
################################################## #
[?php
/***************************************
** Title.........: HTML Mime Mail class
** Version.......: 1.31
** Author........: Richard Heyes [richard.heyes@heyes-computing.net]
** Filename......: html_mime_mail.class
** Last changed..: 31/08/2000
** Notes.........: Based upon mime_mail.class
** by Tobias Ratschiller [tobias@dnet.it]
** and Sascha Schumann [sascha@schumann.cx].
** See <a href="http://www.heyes-computing.net/scripts/" target="_blank">http://www.heyes-computing.net/scripts/</a>
** for full tar/zip if you haven't got one.
***************************************/
class html_mime_mail{
var $mime;
var $html;
var $body;
var $do_html;
var $multipart;
var $html_text;
var $html_images = array();
var $headers = array();
var $parts = array();
/***************************************
** Constructor function. Sets the headers
** if supplied.
***************************************/
function html_mime_mail($headers = ''){
if($headers == '') return TRUE;
if(is_string($headers)) $headers = explode("\r\n", trim($headers));
for($i=0; $i[count($headers); $i++){
if(is_array($headers[$i])) for($j=0; $j[count($headers[$i]); $j++) if($headers[$i][$j] != '') $this-]headers[] = $headers[$i][$j];
if($headers[$i] != '') $this-]headers[] = $headers[$i];
}
}
/***************************************
** Accessor function to set the body text.
** Body text is used if it's not an html
** mail being sent.
***************************************/
function set_body($text = ''){
if(is_string($text)){
$this-]body = $text;
return TRUE;
}
return FALSE;
}
/***************************************
** Accessor function to return the mime
** class variable. Purely for debug, and
** to fall inline with OOP "rulez".
***************************************/
function get_mime(){
if(!isset($this-]mime)) $this-]mime = '';
return $this-]mime;
}
/***************************************
** Function to set a header. Shouldn't
** really be necessary as you could use
** the constructor and send functions,
** it's here nonetheless. Takes any number
** of arguments, which can be either
** strings or arrays full of strings.
** This function is php4 only and will
** return false otherwise. Will return
** true upon finishing.
***************************************/
function add_header(){
if((int)phpversion() [ 4) return FALSE;
$args = func_get_args();
for($i=0; $i[count($args); $i++){
if(is_array($args[$i])) for($j=0; $j[count($args[$i]); $j++) if($args[$i][$j] != '') $this-]headers[] = $args[$i][$j];
if($args[$i] != '') $this-]headers[] = $args[$i];
}
return TRUE;
}
/***************************************
** Adds a html part to the mail.
** Also replaces image names with
** content-id's.
***************************************/
function add_html($html, $text){
$this-]do_html = 1;
$this-]html = $html;
$this-]html_text = $text;
if(is_array($this-]html_images) AND count($this-]html_images) ] 0){
for($i=0; $i[count($this-]html_images); $i++) $this-]html = ereg_replace($this-]html_images[$i]['name'], 'cid:'.$this-]html_images[$i]['cid'], $this-]html);
}
}
/***************************************
** Builds html part of email.
***************************************/
function build_html($orig_boundary){
$sec_boundary = '=_'.md5(uniqid(time()));
$thr_boundary = '=_'.md5(uniqid(time()));
if(count($this-]html_images) == 0){
$this-]multipart.= '--'.$orig_boundary."\r\n";
$this-]multipart.= 'Content-Type: multipart/alternative;'.chr(13).chr(10).chr(9).'boundary="'. $sec_boundary."\"\r\n\r\n\r\n";
$this-]multipart.= '--'.$sec_boundary."\r\n";
$this-]multipart.= 'Content-Type: text/plain'."\r\n";
$this-]multipart.= 'Content-Transfer-Encoding: base64'."\r\n\r\n";
$this-]multipart.= chunk_split(base64_encode($this-]html_text))."\r\n\r\n";
$this-]multipart.= '--'.$sec_boundary."\r\n";
$this-]multipart.= 'Content-Type: text/html'."\r\n";
$this-]multipart.= 'Content-Transfer-Encoding: base64'."\r\n\r\n";
$this-]multipart.= chunk_split(base64_encode($this-]html))."\r\n\r\n";
$this-]multipart.= '--'.$sec_boundary."--\r\n\r\n";
}else{
$this-]multipart.= '--'.$orig_boundary."\r\n";
$this-]multipart.= 'Content-Type: multipart/related;'.chr(13).chr(10).chr(9).'boundary="'.$sec _boundary."\"\r\n\r\n\r\n";
$this-]multipart.= '--'.$sec_boundary."\r\n";
$this-]multipart.= 'Content-Type: multipart/alternative;'.chr(13).chr(10).chr(9).'boundary="'. $thr_boundary."\"\r\n\r\n\r\n";
$this-]multipart.= '--'.$thr_boundary."\r\n";
$this-]multipart.= 'Content-Type: text/plain'."\r\n";
$this-]multipart.= 'Content-Transfer-Encoding: base64'."\r\n\r\n";
$this-]multipart.= chunk_split(base64_encode($this-]html_text))."\r\n\r\n";
$this-]multipart.= '--'.$thr_boundary."\r\n";
$this-]multipart.= 'Content-Type: text/html'."\r\n";
$this-]multipart.= 'Content-Transfer-Encoding: base64'."\r\n\r\n";
$this-]multipart.= chunk_split(base64_encode($this-]html))."\r\n\r\n";
$this-]multipart.= '--'.$thr_boundary."--\r\n\r\n";
for($i=0; $i[count($this-]html_images); $i++){
$this-]multipart.= '--'.$sec_boundary."\r\n";
$this-]build_html_image($i);
}
$this-]multipart.= "--".$sec_boundary."--\r\n\r\n";
}
}
/***************************************
** Adds an image to the list of embedded
** images.
***************************************/
function add_html_image($file, $name = '', $c_type='application/octet-stream'){
$this-]html_images[] = array( 'body' =] $file,
'name' =] $name,
'c_type' =] $c_type,
'cid' =] md5(uniqid(time())) );
}
/***************************************
** Adds a file to the list of attachments.
***************************************/
function add_attachment($file, $name = '', $c_type='application/octet-stream'){
$this-]parts[] = array( 'body' =] $file,
'name' =] $name,
'c_type' =] $c_type );
}
/***************************************
** Builds an embedded image part of an
** html mail.
***************************************/
function build_html_image($i){
$this-]multipart.= 'Content-Type: '.$this-]html_images[$i]['c_type'];
if($this-]html_images[$i]['name'] != '') $this-]multipart .= '; name="'.$this-]html_images[$i]['name']."\"\r\n";
else $this-]multipart .= "\r\n";
$this-]multipart.= 'Content-Transfer-Encoding: base64'."\r\n";
$this-]multipart.= 'Content-ID: ['.$this-]html_images[$i]['cid']."]\r\n\r\n";
$this-]multipart.= chunk_split(base64_encode($this-]html_images[$i]['body']))."\r\n";
}
/***************************************
** Builds a single part of a multipart
** message.
***************************************/
function build_part($i){
$message_part = '';
$message_part.= 'Content-Type: '.$this-]parts[$i]['c_type'];
if($this-]parts[$i]['name'] != '')
$message_part .= '; name="'.$this-]parts[$i]['name']."\"\r\n";
else
$message_part .= "\r\n";
// Determine content encoding.
if($this-]parts[$i]['c_type'] == 'text/plain'){
$message_part.= 'Content-Transfer-Encoding: base64'."\r\n\r\n";
$message_part.= chunk_split(base64_encode($this-]parts[$i]['body']))."\r\n";
}elseif($this-]parts[$i]['c_type'] == 'message/rfc822'){
$message_part.= 'Content-Transfer-Encoding: 7bit'."\r\n\r\n";
$message_part.= $this-]parts[$i]['body']."\r\n";
}else{
$message_part.= 'Content-Transfer-Encoding: base64'."\r\n";
$message_part.= 'Content-Disposition: attachment; filename="'.$this-]parts[$i]['name']."\"\r\n\r\n";
$message_part.= chunk_split(base64_encode($this-]parts[$i]['body']))."\r\n";
}
return $message_part;
}
/***************************************
** Builds the multipart message from the
** list ($this-]_parts).
***************************************/
function build_message(){
$boundary = '=_'.md5(uniqid(time()));
$this-]headers[] = 'MIME-Version: 1.0';
$this-]headers[] = 'Content-Type: multipart/mixed;'.chr(13).chr(10).chr(9).'boundary="'.$bound ary.'"';
$this-]multipart = "This is a MIME encoded message.\r\n\r\n";
if(isset($this-]do_html) AND $this-]do_html == 1) $this-]build_html($boundary);
if(isset($this-]body) AND $this-]body != '') $this-]parts[] = array('body' =] $this-]body, 'name' =] '', 'c_type' =] 'text/plain');
for($i=(count($this-]parts)-1); $i]=0; $i--){
$this-]multipart.= '--'.$boundary."\r\n".$this-]build_part($i);
}
$this-]mime = $this-]multipart."--".$boundary."--\r\n";
}
/***************************************
** Sends the mail.
***************************************/
function send($to_name, $to_addr, $from_name, $from_addr, $subject = '', $headers = ''){
if($to_name != '') $to = '"'.$to_name.'" ['.$to_addr.']';
else $to = $to_addr;
if($from_name != '') $from = '"'.$from_name.'" ['.$from_addr.']';
else $from = $from_addr;
if(is_string($headers)) $headers = explode("\r\n", trim($headers));
for($i=0; $i[count($headers); $i++){
if(is_array($headers[$i])) for($j=0; $j[count($headers[$i]); $j++) if($headers[$i][$j] != '') $xtra_headers[] = $headers[$i][$j];
if($headers[$i] != '') $xtra_headers[] = $headers[$i];
}
if(!isset($xtra_headers)) $xtra_headers = array();
mail($to, $subject, $this-]mime, 'From: '.$from."\r\n".implode("\r\n", $this-]headers)."\r\n".implode("\r\n", $xtra_headers));
}
/***************************************
** Use this method to deliver using direct
** smtp connection. Relies upon Manuel Lemos'
** smtp mail delivery class available at:
** <a href="http://phpclasses.upperdesign.com" target="_blank">http://phpclasses.upperdesign.com</a>
**
** void smtp_send( string *Name* of smtp object,
** string From address,
** array To addresses,
** string Subject,
** array Extra headers)
***************************************/
function smtp_send($smtp_obj, $from_addr, $to_addr, $subject, $xtra_headers = ''){
global $$smtp_obj;
$smtp_obj = $$smtp_obj;
$headers = $this-]headers;
$headers[] = 'From: '.$from_addr;
$headers[] = 'Subject: '.$subject;
if(is_array($xtra_headers)) for(reset($xtra_headers); list(,$header) = each($xtra_headers); ) $headers[] = $header;
// The following: sendmessage(string from address, array to addresses, array headers, string body)
$smtp_obj-]sendmessage($from_addr, $to_addr, $headers, $this-]mime);
}
/***************************************
** Use this method to return the email
** in message/rfc822 format. Useful for
** adding an email to another email as
** an attachment. There's a commented
** out example in example.php.
**
** string get_rfc822(string To name,
** string To email,
** string From name,
** string From email,
** [string Subject,
** string Extra headers])
***************************************/
function get_rfc822($to_name, $to_addr, $from_name, $from_addr, $subject = '', $headers = ''){
// Make up the date header as according to RFC822
$date = 'Date: '.date('D, d M y H:i:s');
if($to_name != '') $to = 'To: "'.$to_name.'" ['.$to_addr.']';
else $to = $to_addr;
if($from_name != '') $from = 'From: "'.$from_name.'" ['.$from_addr.']';
else $from = $from_addr;
if(is_string($subject)) $subject = 'Subject: '.$subject;
if(is_string($headers)) $headers = explode("\r\n", trim($headers));
for($i=0; $i[count($headers); $i++){
if(is_array($headers[$i])) for($j=0; $j[count($headers[$i]); $j++) if($headers[$i][$j] != '') $xtra_headers[] = $headers[$i][$j];
if($headers[$i] != '') $xtra_headers[] = $headers[$i];
}
if(!isset($xtra_headers)) $xtra_headers = array();
return $date."\r\n".$from."\r\n".$to."\r\n".$subject."\r\ n".implode("\r\n", $this-]headers)."\r\n".implode("\r\n", $xtra_headers)."\r\n\r\n".$this-]mime;
}
} // End of class.
?]
|
|
|
| |
|
|
|
 |
|
 |
|
Junior Member
Join Date: May 2002
Location: Australia
Status:
Offline
|
|
please - please help, there must be some php gurus here.
|
|
|
| |
|
|
|
 |
|
 |
|
Fresh-Faced Recruit
Join Date: Oct 2001
Status:
Offline
|
|
Never mind, I actually read the code, and you were using CID:s...
<small>[ 08-01-2002, 04:32 PM: Message edited by: Hvdvrk ]</small>
|
|
|
| |
|
|
|
 |
|
 |
|
Fresh-Faced Recruit
Join Date: Oct 2001
Status:
Offline
|
|
Some Java code for it. I have never touched PHP, but maybe you can translate it somehow.
Properties props = System.getProperties();
props.put("mail.smtp.host", "mail.host.com");
props.put("mail.smtp.port", "25");
Session session = Session.getDefaultInstance(props, null);
Message msg = new MimeMessage(session);
msg.setHeader("X-Mailer", "Some Mailer");
msg.setSentDate(new Date());
InternetAddress to = new InternetAddress("Someone","someone@someplace.com") ;
InternetAddress from = new InternetAddress("Someone Else","someoneelse@someplace.com"):
msg.setFrom(from);
msg.setRecipient(Message.RecipientType.TO,to);
msg.setSubject("A Subject");
File pic = new java.io.File("/pic.gif");
String cid = "12345";
StringBuffer sb = new StringBuffer();
sb.append("[HTML][BODY]");
sb.append("[IMG SRC=\"cid:" + cid + "\" BORDER=\"0\"]");
sb.append("[BR>");
sb.append("A pic above");
sb.append("[/BODY][/HTML]");
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setContent(sb.toString(), "text/html");
MimeMultipart multipart = new MimeMultipart("related");
multipart.addBodyPart(messageBodyPart);
messageBodyPart = new MimeBodyPart();
DataSource fds = new FileDataSource(pic);
messageBodyPart.setDataHandler(new DataHandler(fds));
messageBodyPart.setHeader("Content-ID",cid);
multipart.addBodyPart(messageBodyPart);
msg.setContent(multipart);
Transport.send(msg);
|
|
|
| |
|
|
|
 |
|
 |
|
Mac Enthusiast
Join Date: Jan 2001
Status:
Offline
|
|
Yup... i've seen the code you're using before... (I've used some of it myself)
Anyway - i didn't bother reading every line... but the problem is in your PHP. You are sending it as a mime-multipart: when you view it in a web browser, it's only displaying one part. however (a more sophisticated mail-client) cycles through all the parts and your image appears multiple times.
Unfortunately, the server that holds the code to my mail client is down  but ill post it as soon as it comes back up (a few days)
Hopefully i can help...
|
|
|
| |
|
|
|
 |
|
 |
|
Junior Member
Join Date: May 2002
Location: Australia
Status:
Offline
|
|
00101001 are you still here. I still need help with this PHP code, if not has anyone else have any some help for me.
|
|
|
| |
|
|
|
 |
|
 |
|
Forum Regular
Join Date: Apr 2001
Location: NY, NY, USA
Status:
Offline
|
|
I was gonna give this a shot, but I soon realized I could not find and replace your brackets because there are many places where the brackets need to remain for arrays... Can you replace your code with some we can use easily?
|
|
- Sahara
|
| |
|
|
|
 |
|
 |
|
Junior Member
Join Date: May 2002
Location: Australia
Status:
Offline
|
|
|
|
|
|
| |
|
|
|
 |
|
 |
|
Mac Enthusiast
Join Date: Jan 2001
Status:
Offline
|
|
Originally posted by dogwood:
00101001 are you still here. I still need help with this PHP code, if not has anyone else have any some help for me.
yeah, sorry -- i actually wrote the email client for my school and it's being hosted on our server... im not sure what's going on (our t1 may have gone down again), but tomorrow I may be able to run into school and get a copy straight from the server -- no promises though... but hopefully I can help. In the meantime, ill try and remember what I did and compare it to your code.
-get back to you in a bit
|
|
|
| |
|
|
|
 |
 |
|
 |
|
|
|
|
|

|
|
 |
Forum Rules
|
 |
 |
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
|
HTML code is Off
|
|
|
|
|
|
 |
 |
 |
 |
|
 |
|