Arkiv för kategori ‘PHP’

php html mail

torsdag, 28 maj, 2009

Alla som har försökt använda funktionen mail() för att skicka html mail vet att det inte är helt självklart att få till det så att det fungerar bra. Istället har det funnits paket som Swiftmailer, för inte så länge sedan så släppts version 4 av systemet. Här tänkte jag visa hur vi använt det för att skapa ett html mail från ett formulär.

formulärkoden ser i detta fall ut såhär:

<form action="/email/intresseanmalan" method="post" name="intresseanmalan">
<input type="hidden" name="subject" value="rubrik på Mailet"/>
<input type="hidden" name="fromEmail" value="test@dindoman.se"/>
<input type="hidden" name="fromName" value="FrånNamn"/>
<input type="hidden" name="toEmail" value=""/>
<table cellpadding="0" cellspacing="4" border="0">
<tr><td>Namn</td>
<td><input type="text" size="20" name="Namn" /></td></tr>
<tr><td>E-post</td>
<td><input type="text" size="20" name="Email" /></td></tr>
<tr><td valign="top"></td>
<td><input type="submit" value="Skicka meddeland"/></td></tr>
</table></form>

och php koden såhär

require_once $wwwRoot.'/Simple/php/Swift-4.0.3/lib/swift_required.php';
$transport = Swift_SmtpTransport::newInstance('smtpServer', smtpPort)
  ->setUsername('username')
  ->setPassword('password')
  ;
//build message from post variable!
foreach ($_POST as $kat => $varde) {
	if($kat == 'subject' || $kat == 'fromEmail' || $kat == 'fromName' || $kat == 'toEmail'){}
	else{
		  //Html versionen av mailet byggs här.
		  $messageHtml = $messageHtml.''.$kat.' = '.$varde.'<br /><br />';

		  //Textversionen av mailet byggs här.
		  $messagePlain = $messagePlain.''.$kat.' = '.$varde.'  

';
	}
}
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance()
  ->setSubject($_POST['subject'])
  ->setFrom(array($_POST['fromEmail'] => $_POST['fromName']))
// Vi skickar meddelandet till adressen som är ifylld i fältet email
  ->setTo(array($_POST['Email']))
  ->setBody($messagePlain)
  ->addPart($messageHtml, 'text/html')
  ;
$result = $mailer->send($message);

Om vi sedan skall spara det i en databas och har multipla emailfromulär på en site så är det ganska smidigt att bara peta in hela $post variabeln i en databas med 2 kolumner. Genom att alltid hålla de fält som är satta som ”hidden” likadana så får vi ganksa snart en väldigt sökbar databas som är helt dynamisk. Ungefär såhär:

//En tabell med email som ger ett id och en timestamp när emailet är skickat. Koden är inte testad men borde fungera.

mysql_query("INSERT INTO email (id, date) VALUES ('','')");
$thisId = mysql_insert_id();
foreach ($_POST as $kat => $varde) {
	mysql_query("INSERT INTO emailComponents (cat, value, emailId)
        VALUES ('".$kat."', '".$varde."', '".$thisId."')");
';
header("Location: {$_SERVER['HTTP_REFERER']}/ok"); 

Logga MySQL-frågor med PHP och runkit

måndag, 9 mars, 2009

Allt eftersom en webbapplikation växer i storlek kan det vara svårt att hålla ordning på alla databasfrågor som körs vid exekveringen av applikationen. Genom att omdefiniera PHPs databasfunktioner med hjälp av php-modulen runkit kan man skapa en logger som hjälper till att hålla ordning på databasfrågorna i applikationen. Detta har två fördelar:

  1. Man får en överblick av MySQL-frågorna vilket gör utvecklingen av webbapplikationen lättare.
  2. Genom att omstrukturera databasfrågor och undvika redundanta frågor kan databasaktiviteten effektiviseras och minskas.

Så här gör man:


<?php

runkit_function_copy('mysql_query', 'mysql_query_original');

runkit_function_redefine('mysql_query', '$q', '$dump = debug_backtrace(); $a["query"] = $q; $a["file"] = basename($dump[0]["file"]); $a["line"] = $dump[0]["line"]; array_push($GLOBALS["queries"], $a); return mysql_query_original($q);'));

print_r($GLOBALS['queries']);

?>

I första steget kopieras originaldefinitionen av mysql_query till en annan funktion mysql_query_original. Därefter omdefinieras mysql_query till att logga all queries i en global variabel innan de utförs. Till sist är det bara att skriva ut den globala variabeln för att se samtliga frågor som har körts så långt i exekveringen.

Voila! Vi har en komplett mysql-logger som sparar alla dina queries, vilken fil de körs i och vilken rad i filen. Det är bara att börja optimera!

En problem med denna metod är att runkit normalt inte ingår i en PHP-installation. Modulen måste antingen kompileras med PHP eller laddas dynamisk vid runtime eller statiskt i php.ini, vilket förmodligen får de flesta webbhotelladministratörer att se rött. Dock är denna teknik främst användbar under utvecklingen av en applikation (p.g.a. den introducerade overheaden). Så om man sköter utvecklingen på en egen utvecklingsserver så är det inga problem att installera modulen.

Länk till runkit.