Last Instinct

Check this out

Mailing function for PHP with UTF-8, HTML and attachments

by Klas Lundberg on Jun.13, 2010, under Check this out

I found a function a couple a years ago which I’ve been using for mailing in my projects. The function was rather basic from the start and then I’ve added functionality as needed. Nowadays it is changed into only having UTF8 support (since I almost always use UTF8 encoding) and also support for HTML. the HTML encoding is detected automatically if the <html> tag is present in the text. You can attach images and files by adding them into an array. Feel free to use it however you like.

To get UTF-8 to work correctly in your PHP pages, see my post about Setting up PHP for UTF8 and XHTML compatibility.

The nice mailman image is from The Invisible Agent.

////////////////////////////////////////////
// Function: send_mail()
// UTF-8 Mail sending with html and attachments
////////////////////////////////////////////
 
/** Sends a mail.
 * 
 * @code {
	# To Email Address
	$to_address = "to@address.com";
 
	# From Email Address
	$from_address = "from@address.com";
 
	# From Name
	$from_name = "Send Mail";
 
	# Message Subject
	$email_subject = "This is a test mail with some attachments";
 
	# Use relative paths to the attachments
	$attachments = Array(
	  Array("file"=>"../../test.doc", "content_type"=>"application/msword"), 
	  Array("file"=>"../../123.pdf", "content_type"=>"application/pdf")
	);
 
	# Message Body
	$email_body = "<html><head></head><body>This is a message with <b>".count($attachments)."</b> attachments and maybe some <i>HTML</i>!</body></html>";
 
	send_mail($to_address, $from_address, $from_name, $email_subject, $email_body, $attachments);
 } 
 */
function send_mail($to_address, $from_address, $from_name, $email_subject, $email_body, $attachments=false)
{
  $eol="\r\n";
  $mime_boundary = md5(time());
  $headers = '';
  $msg = '';
  $html = (mb_strpos($email_body, "<html>") !== false);
 
  $mail_site = "send_mail@" .$_SERVER['SERVER_NAME'];
 
  # Common Headers
  $headers .= 'Sender: ' . $mail_site . $eol;
  $headers .= 'From: ' . mb_encode_mimeheader($from_name) . " <" . $mail_site . ">" . $eol;
  $headers .= 'Reply-To: ' . mb_encode_mimeheader($from_name) . " <$from_address>" . $eol;
  $headers .= 'Return-Path: ' . mb_encode_mimeheader($from_name) . " <$from_address>" . $eol;    // these two to set reply address
  $headers .= "Message-ID: <".time().$mime_boundary."@".$_SERVER['SERVER_NAME'].">".$eol;
  $headers .= "X-Mailer: PHP v" . phpversion() . $eol;          // These two to help avoid spam-filters
 
  # Boundry for marking the split & Multitype Headers
  $headers .= 'MIME-Version: 1.0' . $eol;
 
  if ($attachments !== false) {
	$headers .= "Content-Type: multipart/mixed; boundary=\"1$mime_boundary\"" . $eol;
	$msg .= "--1".$mime_boundary.$eol;
	if($html) {
		$msg .= "Content-Type: multipart/alternative; boundary=\"2$mime_boundary\"" . $eol.$eol;
	}
  }	else {
	if($html) {
		$headers .= "Content-Type: multipart/alternative; boundary=\"2$mime_boundary\"" . $eol;
	}
  }
 
  # Setup for text OR html
  
  # Text Version
  if($html) {
	$msg .= "--2".$mime_boundary.$eol;
	$msg .= "Content-Type: text/plain; charset=UTF-8".$eol;
	$msg .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
  } else {
	$headers .= "Content-Type: text/plain; charset=UTF-8".$eol;
	$headers .= "Content-Transfer-Encoding: 8bit";
  }
  $msg .= strip_tags(str_replace("<br>", $eol, str_replace("<br />", $eol, $email_body))).$eol.$eol;
 
  if($html) {
	  # HTML Version
	  $msg .= "--2".$mime_boundary.$eol;
	  $msg .= "Content-Type: text/html; charset=UTF-8".$eol;
	  $msg .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
	  $msg .= $email_body.$eol.$eol;
 
	  # Finished
	  $msg .= "--2".$mime_boundary."--".$eol.$eol;  // finish with two eol's for better security. see Injection.
  }
 
  if ($attachments !== false) {
 
   for($i=0; $i < count($attachments); $i++) {
	 if (is_file($attachments[$i]["file"])) {  
	   # File for Attachment
	   $file_name = substr($attachments[$i]["file"], (strrpos($attachments[$i]["file"], "/")+1));
 
	   $handle=fopen($attachments[$i]["file"], 'rb');
	   $f_contents=fread($handle, filesize($attachments[$i]["file"]));
	   $f_contents=chunk_split(base64_encode($f_contents));    //Encode The Data For Transition using base64_encode();
	   fclose($handle);
 
	   # Attachment
	   $msg .= "--1".$mime_boundary.$eol;
	   $msg .= "Content-Type: ".$attachments[$i]["content_type"]."; name=\"".$file_name."\"".$eol;
	   $msg .= "Content-Transfer-Encoding: base64".$eol;
	   $msg .= "Content-Disposition: attachment; filename=\"".$file_name."\"".$eol.$eol; // !! This line needs TWO end of lines !! IMPORTANT !!
	   $msg .= $f_contents.$eol.$eol;
 
	 }
   }
   $msg .= "--1".$mime_boundary."--".$eol.$eol;  // finish with two eol's for better security. see Injection.
  }
 
  # SEND THE EMAIL
  ini_set('sendmail_from',$from_address);  // the INI lines are to force the From Address to be used !
  mail($to_address, mb_encode_mimeheader($email_subject), $msg, $headers);
  ini_restore('sendmail_from');
}
Leave a Comment :, more...

Setting up PHP for UTF8 and XHTML compatibility

by Klas Lundberg on Jun.13, 2010, under Check this out

PHP is usually not configured for working well with UTF8 multilingual support and XHTML from start. To get it working correctly, you need to adjust a few settings.

UTF-8

There are two things to think about. First, make sure your php files are saved using UTF8 encoding. Even notepad can achieve this in the file save dialog. Then you have to set the php.ini settings to UTF8. This can be done with the ini_set() function. The ini_set() have to be called before outputting any text or HTML/XHTML in the document.

// UTF8 settings
ini_set('mbstring.language', 			'Neutral');
ini_set('mbstring.internal_encoding', 		'UTF-8');
ini_set('mbstring.http_input', 			'UTF-8');
ini_set('mbstring.http_output', 		'UTF-8');
ini_set('mbstring.encoding_translation',	'On');
ini_set('mbstring.detect_order', 		'auto');
ini_set('mbstring.substitute_character', 	'long');

Normally, the server sets the content type correctly if the file is coded in UTF8, but sometimes you need to force the content-type to have UTF8 charset. The header() function also have to be called before outputting any text or HTML/XHTML in the document.

// Set XHTML content type and character encoding of the document
// You may also use text/html as mime type instead of application/xhtml+xml
header('Content-Type: application/xhtml+xml; charset=utf-8');

Sometimes you may have problems with getting data from MySQL encoded correctly as UTF8. Most of the time this isn’t a problem, but you can also force some UTF8 settings on the MySQL server. Use the mysql_set_charset if you have PHP version 5.2 or higher and SET NAMES/SET CHARACTER SET if you have an older version of PHP.

$conn = mysql_connect('localhost', 'user', 'password');
 
// PHP 5.2 and above
mysql_set_charset('utf8',$conn); 
 
// PHP below v 5.2
mysql_query("SET NAMES utf8");
mysql_query("SET CHARACTER SET utf8");

At last, do not forget to add the Content-Type <meta> tag in the <head> section of your HTML/XHTML. Otherwise the web browsers will display your page incorrectly anyway.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

XHTML

To get correct XHTML compatibility you need to adjust the session settings of PHP so that sessions is integrated the right way into your code. The server is often configured to insert session id:s into url:s on your PHP page.

// XHTML compatibility
ini_set('arg_separator.output', '&amp;');
ini_set('url_rewriter.tags', 'a=href,area=href,frame=src,input=src,form=action,fieldset=');

For security reasons, I recommend you to disable the url rewriting, since it makes it possible to hijack another user’s session under certain circumstances. This makes the previous XHTML settings unnecessary, but keep them if you intend to use sessions by URL.

// Disable session by URL
ini_set('session.use_only_cookies', '1');

Still having problems?

To see your PHP version and how the settings are affected, simply call php_info() after changing the settings. Master value is the original server setting and Local value is the value after changing it using ini_set().

php_info();

These UTF8 settings works most of the time, but many servers may have other configuration issues. If you still have issues with UTF8 check the php_info() output for any settings set to ISO-8859-1 and change them to UTF-8 using the ini_set() function. If you still have problems, check that your document files really are saved using correct UTF-8 character encoding.

1 Comment :, , , more...

My music project: Klassy

by Klas Lundberg on May.17, 2010, under Check this out, Portfolio

Klassy - Karnevalsmelodin 2010 | Right&Wrong remixesI’ve been busy producing music lately. I got my music computer up and running again after about a month of deadness. Just then I saw a remix competition for the Lundakarnevalen, which is a carnival for students in Lund every fourth year. I’m not really a student anymore (well technically I am), but my heart still beats a little for Lund, especially beacause I participated in the last two carnivals in 2002 and 2006.

So I decided to join the competition for remixing the official song of Lundakarnevalen – Karnevalsmelodin 2010. About two weeks later I actually managed to finish my remixing and I actually produced two remixes.

The theme of the carnival this time is Right & Wrong and I got inspired by the Karnevalsmelodin LIP UN-DUB video. So I made a right and a wrong mix. The other mix is actually the same as the first but with the beat in mixed order; instead of 1-2-3-4 it’s 1-3-2-4. This gives the other mix a whole different sound, which I almost like even more than my first mix. Naturally, the song gets totally screwed up, but that was my intention anyway. The cool thing is that if you mix the beat the same way once more, you get the original mix back! =)

You can check out my very basic music project page which will be extended further during my progress. You can also listen to my two first remixes below. Judge yourself which one is right and which is wrong. =)

Karnevalsmelodin – Rätt&Fel-remixar by Klassy

1 Comment :, more...

TMFAO

by Klas Lundberg on Apr.07, 2010, under Check this out

I joined Twitter yesterday. Follow me on http://twitter.com/KlasLundberg. For this post I also found some nice Follow me on Twitter badges by Ema Hoffmann.

Comments Off :, more...

Monkeys are for bananas?

by Klas Lundberg on Mar.19, 2010, under Check this out

I found this amazing remake of a very classic label, the Chiquita banana. The design is made by DJ Neff and it’s just so inspiring. Simple and beautiful. You can read all about it in an interview on design:related or in the article at Cap&Design (swedish) or make your own sticker and share it using facebook connect on the cool campaign site. The interface of the sticker designer also features the same techniques as used in the award-winning campaign I did for LdB in late 2008.

2 Comments :, , , , more...

Collaborative sketching

by Klas Lundberg on Mar.15, 2010, under Check this out, Graphics and effects

Feel like sketch, paint, tag or doing some graffiti? Try this cool onBoard collaborative painting and drawing application made by Jozef Chút’ka. It has a really powerful sketch tool that seems just magic. And yes, this sketchboard is shared by everyone. :-)

Comments Off :, , , , , more...

The bathing season is here

by Klas Lundberg on Mar.14, 2010, under Check this out

I went for a walk in the nice weather at Västra Hamnen in Malmö today. The air temperature was about 2°C and a bit sunny. Then I suddenly saw a couple of guys getting ready to bath in the cold water (apparently about 0°C). Unbelievable! So I took a couple of pictures and one of them got into the local newspaper. =) You can read about it at Sydsvenskan (in swedish).

2 Comments :, , more...

New logotype for Helsingkrona Gille

by Klas Lundberg on Feb.25, 2010, under Check this out, Portfolio

I’m part of the alumni for Helsingkrona Nation, called Helsingkrona Gille. I was asked to put up a decent website for them and start up some activity on the web. Since I was very active in Helsingkrona when I studied in Lund I naturally took this challenge. The first step was to just change the old Facebook group for a Helsingkrona Gille Fanpage to get something to work with while developing.

Secondly I started to work on a new logotype, to get a central point in the graphic identity to work around. This was stressed by an upcoming folder, which will go out to about 900 persons about now. As you might guess I was asked to do the layout for this folder also. I really wanted to get the new logo into this work, so I spent a few nights working on it.

A friend of mine had an idea to base it on a small pin that members of Helsingkrona wear while representing the nation in different activities. I thought it was a great idea, since I also have a redesign of the Helsingkrona Nation logo in progress. I thought that I then could make them match very well.

The original colors of Helsingkrona are red and blue, which are very hard to match unless you use some tricks. You should avoid putting red and blue in direct contact with each other, since it looks bad. However, if you put black or white between them, they look really good together. This is because it enhances the contrast between the two using a neutral color with maximum contrast to both of the other colors. This technique is used in many well known designs, including Pepsi, NBA and The Union Jack.

The second trick to make it look good is to have different brightness of the two colors. This is not necessary, but it enhances the contrast between the two colors even further. Both of these tricks enhances the contrast, making the colors work together. As with any colors, they have to match, which you can achieve using color picking techniques or just a good eye.

I wanted the logo to have an academic look to enhance the connection to Helsingkrona and Lund University, also giving it a serious look and maintain the distinguished heritage. At the same time I wanted the logo to have a modern look to not send signals of old and boring. As with most logos, it’s supposed to work with any media in any scale.

This is what I came up with and I’m really proud of my result. It works well in different scales and now it will have to prove itself in different medias. I will put up more about the folder and the website as soon as they are published.

Comments Off :, , , , , , more...

New style for the blog!

by Klas Lundberg on Feb.16, 2010, under Check this out

Pixel Theme by Sam07The blog has gotten a facelift to match this great year of 2010! The previous style was a bit boring and outdated. I think I will change it a bit more, but this will do for now. =)

The style is based on the Pixel theme by Sam and you can get it at his site 85 Ideas. I think it really captures many of the trends for webdesign this year and I really love it!

Comments Off :, , more...

Ex-Libris of Erik Sperber

by Klas Lundberg on Jan.21, 2010, under Check this out, Portfolio

In mid 2008, I was asked by my grandfather Erik Sperber to make him an Ex-Libris for his collection of books. I was very honored, especially since he is turning a hundred years old in April 2010. The purpose of an Ex-Libris is to put it in every book in a library collection, so that anyone can see which collection the book came from.

My grandfather Erik is a Ph.D in both Biochemistry and Archeology, so this has formed most of his life. He got his Ph.D in Biochemistry back in 1946 and his second Ph.D in Archeology 1996, when his was almost 86 years old. This got him into the Guinness World Records for a Ph.D at the highest age. You can read about it in an article from TT written in Swedish. The second dissertation was about Weight systems in ancient Sweden and the viking on the cover was actually drawn by my sister, Anna Lundberg. I contributed by making him a visual basic program for weight analysis using an algorithm for Holm’s Index. I might do a remake of it or post the original version if I get it to work. I have actually found the algorithm useful for beat detection a couple of years ago. Well, back to the subject!

He wanted the Ex-Libris to have symbols of Biochemistry and Archeology in it, so he handed me a couple of pictures from his dissertations. I took the challenge and this is what I came up with and also the images it was based on. He was very pleased and today it’s in the first page of every book in his collection! =)

Comments Off :, , , , , , more...

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Visit our friends!

A few highly recommended friends...