Sunday, 17 February 2013

Send a Pre-Formatted .EML File in PHP


image

I’m not going to go into any magical back-story about how the “.EML” text-file format for email works or how it’s a good choice in preparing an email template for PHP scripts. I’m just going to get straight to the point:

Easiest way to send an “.EML” file in PHP

$emailpath = 'email.eml'; 
$sendmail = sprintf("cat $emailpath | %s -oi -f %s -t", escapeshellcmd("/usr/sbin/sendmail"), escapeshellarg(something@wrong.com)); //Message that address if any errors that may occur 
@$mail = popen($sendmail, 'w'); 
$raw = pclose($mail);


Note:
Make sure your “email.eml” file contains all the email headers you may need, particularly:
  1. To:
  2. From:
  3. Subject:
I would strongly advice you review my use of “escapeshellcmd” and “escapeshellarg” to prepare the variables to be interpreted by the shell.

Parsing “.EML” files and sending them in PHP:

Since the “.EML” is a text based format, they provide versatility to serve as templates. In this example I supply email header data through pre-set variables. I later use regular expressions to change existing text in the .EML file (in this case [$FirstName] [$LastName] [$EmailAddress] and [$Greeting]) with their corresponding variable as supplied.

I choose to keep the file stream open rather than send the whole of the parsed content into a single command. No particular reason, just thought I should…

Here is the example:

    $sendmailpath = '/usr/sbin/sendmail'; 
    $emailpath = 'emailTemplate.eml'; 
    $messagecontent = file_get_contents($emailpath);
 
    //Variables for the email 
    $FirstName = "Alex"; 
    $LastName = "Casamassima"; 
    $EmailAddress = "somebody@somewhere.com"; 
    $Greeting = "Good day kind sir,"; 
 
    $parsed_message = preg_replace('/\[\$([01-9A-Za-z_]+)\]/e', "$$1", $messagecontent); 
    $sendmail = sprintf("%s -oi -f %s -t", escapeshellcmd($sendmailpath), escapeshellarg("admin@yoursite.com")); 
    if(!@$mail = popen($sendmail, 'w')) { 
        throw new Exception("Couldn't open the sendmail program!"); 
    } 
    fputs($mail, $parsed_message); 
    $result = pclose($mail); 
    if($result != 0) { 
      throw new Exception("Couldn't send email!"); 
    }
 


.EML files are useful as they offer great facility to provide MulitPart content, including text versions of an email and embedded attachments. As well, modifying them is as simple as opening them up in your text editor of choice.

Easiest way to make a beautiful .EML file

image
This may be a personal preference of mine. But, Creating a new draft in “Windows Live Mail” often suffices for me. The menu inside the email client allows you to “Save as file” that defaults to an “.EML” file.

Using a client such as “Windows Live Mail” or “Outlook” allows for quick and easy use of embedded pictures, fonts, colours, and special features.


Alternative resources on PHP and .EML:
  1. http://www.linuxquestions.org/questions/linux-server-73/postfix-send-eml-file-737328/
  2. http://stackoverflow.com/questions/5044194/send-mail-from-raw-body-for-testing-purposes
  3. http://www.php.net/manual/en/function.mail.php search for (EML file) on page
  4. http://forums.devshed.com/php-development-5/sending-a-eml-file-through-php-possible-354690.html
  5. http://stackoverflow.com/questions/5903525/sending-mail-using-php-mail-function-local-mail-server
  6. http://www.manpagez.com/man/1/sendmail/

Monday, 4 February 2013

Basic Bitwise made easy for VB.NET


If you are searching BitWise in VB.Net on the web, you will come across a billion references telling you every little detail about the math in how they work. I won’t do that….

All I will give you is the synopsis:

'Define your flags: (FlagsAttribute warns the compiler)
<Flags()> _
Enum SettingFlags AS Integer 
    SettingA = 1
    SettingB = 2
    SettingC = 4
    SettingD = 8
    SettingE = 16
    SettingF = 32
    SettingG = 64
    SettingH = 128
    SettingI = 256
    SettingJ = 512
    SettingK = 1024
    SettingL = 2048
    SettingM = 4096
    SettingN = 8192
    SettingO = 16384
    SettingP = 32728 
    CominationAtoD = SettingA or SettingB or SettingC or SettingD ' = 15
End Enum
 
'Define your settings (all flags are off)
Dim YourSettings AS SettingFlags = 0
 
'Turn some flags on (using OR):
YourSettings = YourSettings OR SettingsFlags.SettingE
YourSettings = YourSettings OR SettingsFlags.CombinationAtoD
YourSettings = YourSettings OR 32
 
'Now YourSetting=63 meaning SettingA,B,C,D,E,F are all "on"
 
'Turning a flag off (using AND NOT)
YourSettings = YourSettings AND NOT SettingsFlags.SettingB
 
'Now YourSettings=61 meaning SettingsA,C,D,E,F are all "on"
 
'Toggle a flag (using XOR)
YourSettings = YourSettings XOR SettingsFlags.SettingsG
YourSettings = YourSettings XOR SettingsFlags.CombinationAtoD
 
'Now YourSettings=114 meaning SettingsB,E,F,G are "on" 
 
'Determine if a flag is on (using AND MASK = MASK)
IF (YourSettings AND SettingsFlags.SettingsB) = SettingsFlags.SettingsB THEN
    'In this case true, because SettingsB is "on"
END IF


In the end, all you have is a integer variable definition (make it ulong if you need more bits) that can act as a grouping of Boolean variables via the binary representation of the integer, where 1 is true, and 0 is false. I avoid demonstrating “Bit Shifting” because different programming languages handle it differently.

Now the above is self-explanatory, and my comments give examples and explanations. If you want more information or education you can sift through a million references I found on the subject below.

References:
http://www.codeproject.com/Articles/6792/Masks-and-flags-using-bit-fields-in-NET
http://www.nerdymusings.com/LPMArticle.asp?ID=17
http://blogs.msdn.com/b/ericlippert/archive/2004/07/15/184431.aspx
http://msdn.microsoft.com/en-us/library/wz3k228a%28v=VS.100%29.aspx
http://rosettacode.org/wiki/Bitwise_operations#Visual_Basic_.NET
http://stackoverflow.com/questions/387424/what-is-the-tilde-in-a-c-sharp-enumeration
http://www.codeguru.com/csharp/sample_chapter/article.php/c12963/Flags-Enumerations.htm
http://msdn.microsoft.com/en-ca/library/system.flagsattribute.aspx
http://weblogs.asp.net/wim/archive/2004/04/07/109095.aspx

Other than that, copy and paste my code. And use it. It’s useful for calling functions, combining similar variables/settings, or simplifying your database.

Feel free to leave your comments or suggestions!

Regards,

Twitter

Page Hits