HTML in mail() - stylesheet / plaatjes laden niet.

Status
Niet open voor verdere reacties.

Simolokid

Gebruiker
Lid geworden
25 apr 2009
Berichten
92
Hey mensen,

Ben bezig om voor 't eerst een xhtml 1.0 strict validated webbased programma te maken.. tot dus ver 2/2 gelukt.

Helaas werkt de mail functie van de contact pagina wél, alleen de html krijg ik niet binnen.

Ook heb ik meerdere afzenders ingesteld, maar ik krijg het mailtje maar 1x binnen ( ik vul altijd mn 2e email adress in als ik 'm test. )

Kan iemand even kijken waarom het zootje niet werkt?

Alvast bedankt ;D

(Beetje wall of text idee.. maargoed.. : ) )
PHP:
<?php
session_start();
/* Email address where the messages should be delivered */
$to = 'mailadress1';

/* From email address, in case your server prohibits sending emails from addresses other than those of your 
own domain (e.g. email@yourdomain.com). If this is used then all email messages from your contact form will appear 
from this address instead of actual sender. */
$from = 'noreply@......';

/* This will be appended to the subject of contact form message */
$subject_prefix = 'some_prefix';
/* Empty/Invalid fields will be highlighted in this color */
$field_error_color = '#FF0000';

/* URL to be redirected to after the form is submitted. If this is specified, then the above message will 
not be shown and user will be redirected to this page after the form is submitted */
/* Example: $thank_you_url = 'http://www.yourwebsite.com/thank_you.html'; */

$thank_you_url = 'some_url_here';

/*******************************************************************************
 *	Do not change anything below, unless of course you know very well 
 *	what you are doing :)
*******************************************************************************/

$name = array('Name','name',NULL,NULL);
$email = array('Email','email',NULL,NULL,NULL);
$subject = array('Subject','subject',NULL,NULL);
$message = array('Message','message',NULL,NULL);
$code = array('Code','captcha_code',NULL,NULL,NULL);

$error_message = '';

if (!isset($_POST['submit'])) {

  showForm();

} else { //form submitted

  $error = 0;
  
  if(!empty($_POST['name'])) {
  	$name[2] = clean_var($_POST['name']);
  	if (function_exists('htmlspecialchars')) $name[2] = htmlspecialchars($name[2], ENT_QUOTES);
  }
  else {
    $error = 1;
    $name[3] = 'color:#FF0000;';
  }
  
  if(!empty($_POST['email'])) {
  	$email[2] = clean_var($_POST['email']);
  	if (!validEmail($email[2])) {
  	  $error = 1;
  	  $email[3] = 'color:#FF0000;';
  	  $email[4] = '<strong><span style="color:#FF0000;">Email is not valid.</span></strong>';
	  }
  }
  else {
    $error = 1;
    $email[3] = 'color:#FF0000;';
  }
  
  if(!empty($_POST['subject'])) {
  	$subject[2] = clean_var($_POST['subject']);
  	if (function_exists('htmlspecialchars')) $subject[2] = htmlspecialchars($subject[2], ENT_QUOTES);  	
  }
  else {
  	$error = 1;
    $subject[3] = 'color:#FF0000;';
  }  

  if(!empty($_POST['message'])) {
  	$message[2] = clean_var($_POST['message']);
	$length = strlen($message[2]);
	if($length < 300){
		if (function_exists('htmlspecialchars')){
			$message[2] = htmlspecialchars($message[2], ENT_QUOTES);
  		}
		else{
			$error = 1;
    		$message[3] = 'color:#FF0000;';
		}
	}
  	else {
    $error = 1;
	$message[4] = '<strong><span style="color:#FF0000;">The message may only contain 300 characters.</span></strong>';
	$message[3] = 'color:#FF0000;';
	}
	if($length > 10){
		if (function_exists('htmlspecialchars')){
			$message[2] = htmlspecialchars($message[2], ENT_QUOTES);
  		}
		else{
			$error = 1;
    		$message[3] = 'color:#FF0000;';
		}
	}
  	else {
    $error = 1;
	$message[4] = '<strong><span style="color:#FF0000;">The message has to contain atleast 10 characters.</span></strong>';
	$message[3] = 'color:#FF0000;';
	}
  }
  else{
	  $error = 1;
	$message[4] = '<strong><span style="color:#FF0000;">You have not filled in a message.</span></strong>';
	$message[3] = 'color:#FF0000;';
  }

  if(empty($_POST['captcha_code'])) {
    $error = 1;
    $code[3] = 'color:#FF0000;';
  } else {
  	include_once "securimage.php";
		$securimage = new Securimage();
    $valid = $securimage->check($_POST['captcha_code']);

    if(!$valid) {
      $error = 1;
      $code[3] = 'color:#FF0000;';   
      $code[4] = '<strong><span style="color:#FF0000;">Code is incorrect.</span></strong>';
    }
  }

  if ($error == 1) {
    $error_message = '<span style="font-weight:bold;font-size:90%;">Please fill in or correct the fields in red.</span>';

    showForm();

  } else {
  	
  	if (function_exists('htmlspecialchars_decode')) $name[2] = htmlspecialchars_decode($name[2], ENT_QUOTES);
  	if (function_exists('htmlspecialchars_decode')) $subject[2] = htmlspecialchars_decode($subject[2], ENT_QUOTES);
  	if (function_exists('htmlspecialchars_decode')) $message[2] = htmlspecialchars_decode($message[2], ENT_QUOTES);  	
  	
    $message = "$name[0]: $name[2]\r\n$email[0]: $email[2]\r\n\r\n$message[0]:\r\n$message[2]\r\n";
    
    if (!$from) $from_value = $email[2];
    else $from_value = $from;
    
    $headers = "From: $from_value" . "\r\n" . "Reply-To: $email[2]";
// multiple recipients
$to  = 'mailadress_1' . ', '; // note the comma
$to .= $_POST['email']; //second email

// subject
$subject = 'Contact-form';
$msg = $_POST['message'];
// message
$message = '
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>some_title</title>
<link rel="stylesheet" type="text/css" href="admin_style.css" />
</head>
<body>
<div id="_bk_"><img class="background" src="admin_media/admin_images/bk.png" alt="" /></div>
<div id="site">
<div id="header"><img src="admin_media/admin_images/header.png" alt="" title="" /></div>
<div id="exit">
<div id="log_out">Quit</div>
</div>
<div id="fc"></div>
<div id="menu">
<div class="menu_item"><strong>Welcome</strong></div>
<div class="menu_item">Question-Tour</div>
<div class="menu_item">Conclusion</div>
<div class="menu_item">Walktrough<br />
<em>Your back-end system</em></div>
<div class="menu_item"></div>
<div class="menu_item"></div>
<div class="menu_item"></div>
<div class="menu_item"></div>
<div class="menu_item_time">Estimated time:<br />
15 minutes</div>
<div class="menu_item"></div>
</div>
<div id="content">
<div id="title_welcome">Contact-message</div>
<br />
<br />
$msg
</div>
</div>
</body>
</html>
';

// To send HTML mail, the Content-type header must be set
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$email_sender = $_POST['email'];
// Additional headers
$headers .= 'To: '.$email_sender.'' . "\r\n";
$headers .= 'From: mail_1' . "\r\n";
$headers .= 'Cc: mail_2' . "\r\n";

// Mail it
mail($to, $subject, $message, $headers);

    if (!$thank_you_url) {
	  }
	  else {
	  	header("Location: $thank_you_url");
	  }
       	
  }

} //else submitted



function showForm()

{
global $name, $email, $subject, $message, $code;
$something = $GLOBALS['error_message'];?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>- Contact</title>
<link rel="stylesheet" type="text/css" href="admin_style.css" />
</head>
<body>
<div id="_bk_"><img class="background" src="admin_media/admin_images/bk.png" alt="" /></div>
<div id="site">
<div id="header"><img src="admin_media/admin_images/header.png" alt="" title="" /></div>
<div id="exit">
<div id="log_out">Quit</div>
</div>
<div id="fc"></div>
<div id="menu">
<div class="menu_item"><strong>Welcome</strong></div>
<div class="menu_item">Question-Tour</div>
<div class="menu_item">Conclusion</div>
<div class="menu_item">Walktrough<br />
<em>Your back-end system</em></div>
<div class="menu_item"></div>
<div class="menu_item"></div>
<div class="menu_item"></div>
<div class="menu_item"></div>
<div class="menu_item_time">Estimated time:<br />
15 minutes</div>
<div class="menu_item"></div>
</div>
<div id="content"><div id="title_welcome">Contact Me.</div><br />
<?php echo "<form action=\"\" method=\"post\" class=\"cForm\">
<table>
<tr>
<td style=\"$name[3]\">$name[0]</td>
<td><input type=\"text\" name=\"$name[1]\" value=\"$name[2]\" /></td>
</tr>
<tr>
<td style=\"$email[3]\">$email[0]</td>
<td><input type=\"text\" name=\"$email[1]\" value=\"$email[2]\" /> $email[4]</td>
</tr>
<tr>
<td style=\"$subject[3]\">$subject[0]</td>
<td><input type=\"text\" name=\"$subject[1]\" value=\"$subject[2]\" size=\"40\" /></td>
</tr>
<tr>
<td style=\"$message[3]\">$message[0]</td>
<td><textarea name=\"$message[1]\" cols=\"40\" rows=\"6\">$message[2]</textarea><br />$message[4]</td>
</tr>
<tr>
<td>&nbsp;</td>
<td><img id=\"captcha\" src=\"securimage_show.php\" alt=\"CAPTCHA Image\" /></td>
</tr>
<tr>
<td style=\"$code[3]\">$code[0]</td><td><input type=\"text\" name=\"$code[1]\" size=\"10\" maxlength=\"5\" /> $code[4]</td>
</tr>
<tr>
<td></td><td style=\"text-align: right;\"><input type=\"submit\" name=\"submit\" value=\"Send\" /></td>
</tr>
</table>
</form>
<div id=\"next_button\">Next Step &gt;&gt;</div>
</div>
</div>
</body>
</html>
";

}

function clean_var($variable) {
    $variable = strip_tags(stripslashes(trim(rtrim($variable))));
  return $variable;
}

/**
Email validation function. Thanks to http://www.linuxjournal.com/article/9585
*/
function validEmail($email)
{
   $isValid = true;
   $atIndex = strrpos($email, "@");
   if (is_bool($atIndex) && !$atIndex)
   {
      $isValid = false;
   }
   else
   {
      $domain = substr($email, $atIndex+1);
      $local = substr($email, 0, $atIndex);
      $localLen = strlen($local);
      $domainLen = strlen($domain);
      if ($localLen < 1 || $localLen > 64)
      {
         // local part length exceeded
         $isValid = false;
      }
      else if ($domainLen < 1 || $domainLen > 255)
      {
         // domain part length exceeded
         $isValid = false;
      }
      else if ($local[0] == '.' || $local[$localLen-1] == '.')
      {
         // local part starts or ends with '.'
         $isValid = false;
      }
      else if (preg_match('/\\.\\./', $local))
      {
         // local part has two consecutive dots
         $isValid = false;
      }
      else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain))
      {
         // character not valid in domain part
         $isValid = false;
      }
      else if (preg_match('/\\.\\./', $domain))
      {
         // domain part has two consecutive dots
         $isValid = false;
      }
      else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\","",$local)))
      {
         // character not valid in local part unless 
         // local part is quoted
         if (!preg_match('/^"(\\\\"|[^"])+"$/',
             str_replace("\\\\","",$local)))
         {
            $isValid = false;
         }
      }
      if ($isValid && function_exists('checkdnsrr'))
      {
      	if (!(checkdnsrr($domain,"MX") || checkdnsrr($domain,"A"))) {
         // domain not found in DNS
         $isValid = false;
       }
      }
   }
   return $isValid;
}
?>

Hier en daar wat gecensored, vooral website links en email adressen.

Tips zijn enorm welkom!

Groetjes,

Simolokid
 
Wat is nu precies het probleem? Komen je plaatjes niet binnen of komt er helemaal geen HTML? Ben nu ff het script aan het bekijken zal zo meer zeggen.
 
Wat is nu precies het probleem? Komen je plaatjes niet binnen of komt er helemaal geen HTML? Ben nu ff het script aan het bekijken zal zo meer zeggen.

Het probleem is het volgende:

1. Ik krijg géén 2 mails binnen als ik mn eigen email adres invul ( contact form gaat immers naar mn andere email adress)
2. Er komt wel html binnen... alleen het menu komt binnen, dus 'question-tour' en 'welcome.. of intro.. of hoe noemde ik da= P ')
Verder komen er 0 plaatjes binnen, dus ik krijg van die mooie witte kleine vakjes met een rood kruisje.

Verder print de mail '$message' letterlijk uit, en krijg ik dus geen inhoud van $message te zien. Wat gek is want volgens mij had ik dat $msg genoemd ( de inhoud van het ingevulde veld in het contact-formulier )

Ik neem aan zo van je te horen of je iets ontdekt hebt..

Groetjes!
 
Ik snap het, Ben nu je hele code aan het hetschrijven op voorwaarde dat ik het niet voor niets doe! De code is echt bagger, wie heeft dit geschreven?
 
Ik snap het, Ben nu je hele code aan het hetschrijven op voorwaarde dat ik het niet voor niets doe! De code is echt bagger, wie heeft dit geschreven?

Heb ik toch een paar vragen voor je.

1. Waarom bagger? :O Kvond et eigenlijk wel slim =P
2. Ikke
3. Niet voor niets doe? Wil je een beloning in natura?(A) Ik kan vast wel íets in deze aardkloot doen wat jij niet kan, maar veel verder ga ik toch niet heur =P
4. Iig bedankt, maar ik snap nog steeds niet wáárom het bagger is.

Groetjes
 
Niet voor niets is natuurlijk het idee dat je er niet naar kijkt en zegt: O ja leuk, maar er ook echt iets mee doet. Ja bagger, de inhoud is aardig maar het paradigma slaat nergens op. Jou keuze: moet ik stoppen of doorgaan?
 
Niet voor niets is natuurlijk het idee dat je er niet naar kijkt en zegt: O ja leuk, maar er ook echt iets mee doet. Ja bagger, de inhoud is aardig maar het paradigma slaat nergens op. Jou keuze: moet ik stoppen of doorgaan?

Ik sta nu zeg maar in de 1e 5% van mijn project.. ik ga echt nog wel even door.. een imba contactformulier met html / markup zoals je dat bv. bij professionele bedrijven ziet zou helemaal geweldig zijn ;D

K ga nu googlen op paradigma, al gok ik dat t de volgorde is van de code.

Ga alsjeblieft door, ik ben stik benieuwd wát er nou fout is, maar nóg beniewderderder naar wáárom.

Ik wacht op je volgende antwoord ! :)

Alvast enorm bedankt joh,

Simolokid
 
De plaatjes worden niet weergegeven omdat je geen volledige links meestuurt (een emailapplicatie snapt niet waar admin_media/admin_images/header.png is); ook de stylesheet kan hierdoor niet gevonden worden.

verder kloppen de "from" en "cc" headers niet, maar dat heb je misschien met opzet gedaan ivm privacy)
 
De plaatjes worden niet weergegeven omdat je geen volledige links meestuurt (een emailapplicatie snapt niet waar admin_media/admin_images/header.png is); ook de stylesheet kan hierdoor niet gevonden worden.

verder kloppen de "from" en "cc" headers niet, maar dat heb je misschien met opzet gedaan ivm privacy)

Kun je me dan 1 voorbeeld geven van een volledige link? Of bedoel je simpelweg:

http://www.website.com/directory_iets/plaatje.png ?

from / cc heb ik de adressen i.d.d. gecensureerd, geen zin in spam =)

Groetjes!
 
Ik heb heel wat code verbeterd, maar de code is niet getest. Het zou goed kunnen dat ik een fout heb gemaakt. Ik heb ook niet alles helemaal nagekeken dat kost me gwoon te veel tijd.

1. getalen zijn '2' en letters zijn "hallo"
2. functies altijd bovenaan zetten of importeren
3. gebruik tabs, anders is het gewoon niet leesbaar
4. als je een if else statement maakt open deze dan ook: if(statement){ blabla }. Helaas is het in php toegstaan maar eigenlijk is het gewoon fout
5. maak niet onnodig veel variabele
6 ik heb de form() functie eruit geschopt want die hoort hier gewoon niet thuis. Ik heb het vervangen door header("location: ") kijk zelf even wat je hiermee doet.
7. een mailfunctie geeft een bool terug, gerbuik deze ook
8. gebruikt isset($_GLOBAL) omdat niet alle server automatisch declareren.
9. nooit css gebruiken in mail, het kan wel maar werkt gewoon niet goed. werk alleen met html in eem mail. plaatjes idd helemaal overnemen, dus met website
10. voor meerdere geadreseerde gebruik je ; ipv , zoals jij deed

Your a lucky boy dat ik zoveel tijd in je gestoken heb. bestand zit in de txt file die bij dit bericht zit.
 
Ik heb heel wat code verbeterd, maar de code is niet getest. Het zou goed kunnen dat ik een fout heb gemaakt. Ik heb ook niet alles helemaal nagekeken dat kost me gwoon te veel tijd.

Your a lucky boy dat ik zoveel tijd in je gestoken heb. bestand zit in de txt file die bij dit bericht zit.


Eej, enorm bedankt!;

1. getalen zijn '2' en letters zijn "hallo"
2. functies altijd bovenaan zetten of importeren
3. gebruik tabs, anders is het gewoon niet leesbaar
4. als je een if else statement maakt open deze dan ook: if(statement){ blabla }. Helaas is het in php toegstaan maar eigenlijk is het gewoon fout
5. maak niet onnodig veel variabele
6 ik heb de form() functie eruit geschopt want die hoort hier gewoon niet thuis. Ik heb het vervangen door header("location: ") kijk zelf even wat je hiermee doet.
7. een mailfunctie geeft een bool terug, gerbuik deze ook
8. gebruikt isset($_GLOBAL) omdat niet alle server automatisch declareren.
9. nooit css gebruiken in mail, het kan wel maar werkt gewoon niet goed. werk alleen met html in eem mail. plaatjes idd helemaal overnemen, dus met website
10. voor meerdere geadreseerde gebruik je ; ipv , zoals jij deed
1. Getallen zijn lijkt me gewoon zonder 'of ". Anders geef je volgens mij een String aan met waarde 2.
2. Dat heb ik een keer gedaan, maar toen werkte 't zootje niet, maar dan zal ik ergens anders wel een fout hebben gemaakt.
3. Tabs had ik gebruikt als ik een if in een if had. Nu zitten ze allemaal op 'hetzelfde niveau', en dan vind ik tabs minder nodig. Gezien ik de ene sluit voordat ik de ander open.
5. Onnodig veel variabele? Ik dacht dat ik zuing was =P
6. Ik neem aan dat ik deze pagina dan dus moet hernoemen, of de code moet aanpassen van header("location: ").
7. Ik heb een keer geprobeert iets als:
$mail = mail(hiervanalles);
if($mail == TRUE){
...
}
maar dat werkte niet. alleen als ik if($mail) doe krijg ik iets terug.
Kan zijn dat je dit ook bedoeld, maar dan vraag ik me af wat ik heb gemist.
9. Hoe moet ik dan het declareren? Interne stylesheet ofzo? Ik moet toch ook de maten van mijn divjes etc. kunnen meegeven?
10. De multi-mail opties stonden zo letterlijk bij php.net (google op mail() php.. =p ), ik heb jou manier nog niet getest, maar ik ga er vanuit dat 't wel werkt.

Verder;

Ga ik nu even kijken hoe jou versie werkt..

In iedergeval bedankt, we hebben weer een avondje wat te doen ! =P

Groetjes,

Simolokid! :)
 
Als je later nog eens complexe sql query's bouwd zie je vanzelf het verschil tussen:
$var = 1;
of
$var = '1';
maar de praktijk zal het je leren.
Over de css: wat niet werken zonder css? Natuurlijk kan dat! web 1.0 bestond alleen uit html. Bijna alles van de css is over te brengen in html of eigenlijk andersom. En dus ga je ook niet een css header maken met de tag <style>. Gebruik zo min mogelijk div in mail, het kan wel en het kan ook goed werken, maar uit ervaring blijkt dat table makkelijker is. Wat dat betreft zijn email clients nog erg web 1.0.
 
Een getal hoort zonder ' of ", heeft verder niets met SQL te maken. Wat je er binnen een query mee doet is irrelevant; zeker als je prepared statements gebruikt.

Verder is dit natuurlijk funest voor je applicatie:

PHP:
if(!isset($_POST['submit'])){

Checken of een formulier verzonden is doe je zo:

PHP:
if($_SERVER['REQUEST_METHOD'] == 'POST'){

Volgende punt:
PHP:
function clean_var($variable) {
    $variable = strip_tags(stripslashes(trim(rtrim($variable))));
  return $variable;
}

???

Dat is niet het cleanen van een variabele, maar het slopen van de inhoud ervan. Slashes hoor je niet te strippen, magic_quotes moet uitstaan.

PHP:
if(!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)){

Ereg is verouderd en komt te vervallen, gebruik preg_*. Daarnaast is het allemaal nogal overdreven, al die regexen. Deze is compleet:
Code:
^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,6})^

En dan dit:

PHP:
if(!empty($_POST['name'])){

Gebruik nooit 'empty' om te controleren, gebruik dit:

PHP:
if(isset($_POST['name']) && trim($_POST['name']) != ''){

}

Dit klopt ook niet:

PHP:
header("Location: forum.php?errormessage=");

Je moet altijd een hele URL gebruiken.


Nog een dingetje:

PHP:
header("Location: $thank_you_url");

Variabelen horen buiten quotes.



En als het gaat over code-conventies: je code is tamelijk onoverzichtelijk wat betreft tabs en enters. Beetje jammer om zoveel commentaar op de TS te hebben terwijl je eigen code ook niet echt top is.
 
Dit klopt ook niet:

PHP:
header("Location: forum.php?errormessage=");

Waarom zou dit fout zijn? Dit is gewoon goede code hoor. Als het commentaar op mij gericht is: bijna alle dingen die je aanhaald zijn niet van mij en heb ik ook niet verbeterd. Zelf had ik het script heel anders gemaakt inc classes enzo maar ik weet niet hoe dat in de site van de TS moet worden ingebouwd omdat ik de rest van de code niet ken. Als dit commentaar in het algemeen was: ja ik ben het met je eens voor een groot gedeelte.
 
Staat erbij:

Je moet altijd een hele URL gebruiken.
 
Hee verrek :) Dat wist ik helemaal niet, maar op php.net staat idd dat je officieel hele URI's moet gebruiken:

Code:
Note: HTTP/1.1 requires an absolute URI as argument to » Location: including the scheme, hostname and absolute path, but some clients accept relative URIs. You can usually use $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] and dirname() to make an absolute URI from a relative one yourself

Moet ik in het vervolg ook eens op gaan letten...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan