Outlook SendTo Extended: Tooltje voor Outlook

Ik heb de afgelopen 2 dagen aan een klein tooltje gewerkt om wat tekortkomingen van de normale SendTo Email Recipient weg te werken.

De reden dat de titel begint met Outlook is dat het alleen met de volledige Outlook werkt, en dan heb ik het nog niet (NOG NIET! Dat komt nog) met een versie < Office 12 (Office 2007) heb getest.

Als je de installatie uitvoert nestelt het zich in de Send To map (Kopiëren naar in een Nederlandse Windows).

En dan kan je dat gewoon op een map doen, en hij zal alle bestanden in die map kopieren naar een nieuwe mail (recursive, dus gij opent alle onderliggende mappen, en daar in ook weer alle onderliggende mappen…).

Ook maakt hij gewoon een HTML emailtje aan, ipv een stom tekst emailtje.

Ook vraagt hij niet om foto’s te verkleinen, want met het huidig internet is dat echt niet nodig.

Hieronder vind je de code (meer is het niet, buiten wat resources), het project vind je hier (rar), en de gecompileerde installer vind je hier:

using System;
using System.Collections.Generic;
using System.IO;
using Outlook = Microsoft.Office.Interop.Outlook;

namespace OutlookSendToExtended
{
	///

	/// This class creates the mail, adds the files,
	/// and provides a function to display the emailwindow
	///
	/// Main method defined below
	/// 

	class OutlookSendToExtendedMain
	{
		#region Private vars

		///

		/// Holder for the Application entity
		/// 

		private Outlook.Application outlook;

		///

		/// Holder for the mail entity
		/// 

		private Outlook.MailItem mailItem;

		#endregion

		#region Constructor(s)

		///

		/// Constructor
		/// 

		///
array of files/folders
		public OutlookSendToExtendedMain(string[] args)
		{
			//create a new application
			this.outlook = new Outlook.Application();

			//create new emailitem
			this.mailItem = (Outlook.MailItem)outlook.CreateItem(Outlook.OlItemType.olMailItem);

			//loop over the fixed args
			foreach (string fixedArg in this.FixArgs(args))
			{
				//add the attachment
				mailItem.Attachments.Add(fixedArg, Outlook.OlAttachmentType.olOLE, 1, fixedArg);
			}

			//to be implemented
			//mailItem.SendUsingAccount
		}

		#endregion

		#region Methods

		///

		/// Enumerates over the args, expanding the folders in it
		/// 

		///
array of files/folders
		/// array of files
		private string[] FixArgs(string[] args)
		{
			List fixedArgs = new List();

			//loop
			foreach (string arg in args)
			{
				//if it is a directory
				if (Directory.Exists(arg))
				{
					try
					{
						//join the dirs and files
						List listOfAll = new List();

						listOfAll.AddRange(Directory.GetFiles(arg));
						listOfAll.AddRange(Directory.GetDirectories(arg));

						//recursive call
						fixedArgs.AddRange(this.FixArgs(listOfAll.ToArray()));
					}
					catch (Exception)
					{
						//to much exceptions to catch, catch the base.
						//what can we do? maybe talk to user.
						//thinking about this
					}
				}
				else
				{
					//it is a file, add it
					fixedArgs.Add(arg);
				}
			}

			//return the array
			return fixedArgs.ToArray();
		}

		public void DisplayEmail()
		{
			//display the email
			this.mailItem.Display(false);
		}

		#endregion

		#region Static methods

		///

		/// Entrypoint
		/// 

		///
array of files/folders to be attached
		static void Main(string[] args)
		{
			if (args.Length != 0)
				(new OutlookSendToExtendedMain(args)).DisplayEmail();

			return;
		}

		#endregion
	}
}

Even een toelichting bij de Setup: er is een PostBuildEvent gedefinieerd, die wat doet met WiRunSQL.vbs (tooltje om de database van een MSI aan te passen).

Hij voegt DISABLEADVTSHORTCUTS toe met value 1 in de Property tabel.

Waarom? Omdat ik een shortcut maak in de SendTo folder, en aangezien Advertised Shortcuts daar niet werken, moeten we dit afzetten. Dit is de enige manier hiervoor, Visual Studio bied hier geen interface voor aan.

Meer info over Advertised shortcuts vind je hier.

Commentaar? Betere manieren? Laat het me weten bij de comments :)

LINQ to SQL voor SQL Compact Edition

Als je een project maakt, en je wilt een kleinere database hebben in de plaats van een MSSQL database (mdf) kan je altijd overwegen een sdf (Compact edition).

Helaas kan je niet standaard LINQ to SQL klassen gebruiken dan (dbml).

Daarvoor kan je wel dit tooltje gebruiken, en de klassen genereren.
linq to sql

Hier volgt wat je in de verschillende textboxen moet invullen, kan je even gemakkelijk copy/pasten.

Title: Make &Linq classes for Database
Command: %vsspv_windows_sdk_dir%\bin\SqlMetal.exe
Arguments: $(ItemPath) /dbml:DataClasses$(ItemFileName).dbml /pluralize /context:DataContext$(ItemFileName)
InitialDirectory: $(ItemDir)

Dan ga je in je project op een .sdf staan, doe je tools > beneden ‘Make Linq classes for Database’, en dan doe je rechtermuisknop op je project > add extisting item > (alle files laten weergeven) > dubbelklik op de dbml.

That’s it, nu kan je eender waar in je project dit doen:

DataContextFuel dataContextFuel = new DataContextFuel(DataLayer.Properties.Settings.Default.FuelConnectionString);

Natuurlijk wel aanpassen voor jouw context he :)