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