Over the past few months, I've been hearing more and more about the use of functional programming concepts and also languages like Haskell and F#. While some of the initial musings that I've read revolved around how the concepts have been around for decades and that it makes financial and scientific applications easier to read and write, I couldn't find a good reason to start learning it for my typical line-of-business application design and development job or even some of my basic hobby projects. Nonetheless, I kept getting drawn to the concept and have decided to focus on learning it.
This post marks the fourth entry of a series that I'll be writing to discuss how I'm going about learning F#. While I'm not saying that my method of learning is ideal and should be followed by others, I'm just reporting how I'm going about doing it. Over the course of this series, my goal is to provide other .Net developers a(nother) resource for learning the F# language as well as apply the language into some non-financial or scientific scenarios.
Series Table of Contents:
- Finding Resources
- Writing the First Application
- Interacting with the .Net Framework
- Working with .Net Objects and Properties
In this post, I'm going to interact with libraries in the .Net framework to illustrate how to you'll be able to apply F# to functionality that normally may do in another language. Unlike the last project in this series that just brushed on using some static methods of the System.IO.File class, this post will be focusing on the various steps it takes to send an email message and working with the properties of the System.Net.Mail.MailMessage class. In this example, we'll be doing the following:
- Instantiating a new MailMessage object.
- Set the To, From, Body, and Subject properties of the object
- Attach a text file to the message.
- Send the message via a SMTP server.
Throughout the course of this project, we'll be dealing with a large amount of F# syntax as well as a couple of assemblies from the .Net Framework. This post will hopefully be pretty straight forward in the steps outlined above.
Starting With The Values:
To keep this example simple, I'm going to be declaring our To Address, From Address, Subject, and SMTP Server values first thing. We will be using these values as we begin to set the object properties of our MailMessage object shortly; however, to allow for easier visibility, I'm setting these up prior.
let ToAddress = "MyToAddress@domain.com"
let FromAddress = "MyFromAddress@domain.com"
let Subject = "F# Email Example"
let SMTPServer = "127.0.0.1"
Instantiating Objects in F#:
Now that we have our values established, let's open up the System.Net.Mail namespace and instantiate our own MailMessage object. To do this, we do the following snippet of code:
let mm = new MailMessage()
mm.From <- new MailAddress(FromAddress)
mm.Subject <- Subject
mm.Body <- "Hello, F# Email"
Here we begin to see some new syntax in F#. The syntax to instantiating a new MailMessage object is very similar to that of C# or VB.Net in that we are setting a value using the new keyword. Next we are calling the MailMessage's To collection proptery's method of Add() to add our address we assigned initially. After that, we are assigning the MailMessage.From property to a new instance of a MailAddress Object. Since object properties that are not read-only are mutable (or can change), we use the <- operator to assign a value to the property. This action is repeated to assign the Subject and Body properties on the last lines of the snippet.
Attaching a File:
The last item we have to do with our MailMessage object is to add the attachment. The file we're going to use is a local text file. For simplicity sake, we'll use the relative path to the file and assign it to a value first. Then we'll add the file as a new attachment to our MailMessage object.
let filePath = @".\commadelimitedfile.txt"
Sending the Email:
We now have a perfectly good MailMessage object sitting in memory. The only thing that's left to do is to send it out.
let client = new SmtpClient()
client.Host <- SMTPServer
The Full Project Source:
This has been a very short and simple example on how to interact with the .Net framework objects and their properties. At this point, some basic and typical tasks that are used in applications could be transposed to F# if you so desired. With F# being a concise language, it has some benefits over traditional object-oriented languages.