How to send email from a Windows service?

Why would you not use the exact same concept as the MailDefinition uses? Load the body from your template file, replace some markers with the text from another list - mail merge style?

All you're doing is a foreach over a data set of information to be merged with the template. Load your merge data, loop over the merge data replacing the tokens in your template with the current merge record. Set the message body as the currently built message. Attach the message to the message queue or send it now, whichever you choose.

It's not rocket science. You've got the code to create the message, so it's just a case of loading your merge data and looping through it. I've simplified to demonstrate the concept and I've used a CSV for the merge data and assumed that no field contains any commas:

message.IsBodyHtml = true;
message.From = new MailAddress("[email protected]");
message.Subject = "My bogus email subject";

string[] lines = File.ReadAllLines(@"~\MergeData.csv");
string originalTemplate = File.ReadAllText(@"~\Template.htm");

foreach(string line in lines)
{
    /* Split out the merge data */
    string[] mergeData = line.Split(',');

    /* Reset the template - to revert changes made in previous loop */
    string currentTemplate = originalTemplate;

    /* Replace the merge tokens with actual data */
    currentTemplate = currentTemplate.Replace("[[FullNameToken]]", mergeData[0]); 
    currentTemplate = currentTemplate.Replace("[[FirstNameToken]]", mergeData[1]);
    currentTemplate = currentTemplate.Replace("[[OtherToken]]", mergeData[2]);

    /*... other token replacements as necessary.
     * tokens can be specified as necessary using whatever syntax you choose
     * just make sure that there's something denoting the token so you can
     * easily replace it */

    /* Transfer the merged template to the message body */
    message.Body = currentTemplate;

    /* Clear out the address from the previous loop before adding the current one */
    message.To.Clear();
    message.To.Add(new MailAddress(mergeData[3]));
    client.Send(message);
}