PowerShell.PowerLibrary.Mail.psm1

#region Variables

#region Mime Mappings
$MimeMappings = New-Object System.Collections.Specialized.StringDictionary;
$MimeMappings.Add('.323' , 'text/h323');
$MimeMappings.Add('.aaf' , 'application/octet-stream');
$MimeMappings.Add('.aca' , 'application/octet-stream');
$MimeMappings.Add('.accdb' , 'application/msaccess');
$MimeMappings.Add('.accde' , 'application/msaccess');
$MimeMappings.Add('.accdt' , 'application/msaccess');
$MimeMappings.Add('.acx' , 'application/internet-property-stream');
$MimeMappings.Add('.afm' , 'application/octet-stream');
$MimeMappings.Add('.ai' , 'application/postscript');
$MimeMappings.Add('.aif' , 'audio/x-aiff');
$MimeMappings.Add('.aifc' , 'audio/aiff');
$MimeMappings.Add('.aiff' , 'audio/aiff');
$MimeMappings.Add('.application' , 'application/x-ms-application');
$MimeMappings.Add('.art' , 'image/x-jg');
$MimeMappings.Add('.asd' , 'application/octet-stream');
$MimeMappings.Add('.asf' , 'video/x-ms-asf');
$MimeMappings.Add('.asi' , 'application/octet-stream');
$MimeMappings.Add('.asm' , 'text/plain');
$MimeMappings.Add('.asr' , 'video/x-ms-asf');
$MimeMappings.Add('.asx' , 'video/x-ms-asf');
$MimeMappings.Add('.atom' , 'application/atom+xml');
$MimeMappings.Add('.au' , 'audio/basic');
$MimeMappings.Add('.avi' , 'video/x-msvideo');
$MimeMappings.Add('.axs' , 'application/olescript');
$MimeMappings.Add('.bas' , 'text/plain');
$MimeMappings.Add('.bcpio' , 'application/x-bcpio');
$MimeMappings.Add('.bin' , 'application/octet-stream');
$MimeMappings.Add('.bmp' , 'image/bmp');
$MimeMappings.Add('.c' , 'text/plain');
$MimeMappings.Add('.cab' , 'application/octet-stream');
$MimeMappings.Add('.calx' , 'application/vnd.ms-office.calx');
$MimeMappings.Add('.cat' , 'application/vnd.ms-pki.seccat');
$MimeMappings.Add('.cdf' , 'application/x-cdf');
$MimeMappings.Add('.chm' , 'application/octet-stream');
$MimeMappings.Add('.class' , 'application/x-java-applet');
$MimeMappings.Add('.clp' , 'application/x-msclip');
$MimeMappings.Add('.cmx' , 'image/x-cmx');
$MimeMappings.Add('.cnf' , 'text/plain');
$MimeMappings.Add('.cod' , 'image/cis-cod');
$MimeMappings.Add('.cpio' , 'application/x-cpio');
$MimeMappings.Add('.cpp' , 'text/plain');
$MimeMappings.Add('.crd' , 'application/x-mscardfile');
$MimeMappings.Add('.crl' , 'application/pkix-crl');
$MimeMappings.Add('.crt' , 'application/x-x509-ca-cert');
$MimeMappings.Add('.csh' , 'application/x-csh');
$MimeMappings.Add('.css' , 'text/css');
$MimeMappings.Add('.csv' , 'application/octet-stream');
$MimeMappings.Add('.cur' , 'application/octet-stream');
$MimeMappings.Add('.dcr' , 'application/x-director');
$MimeMappings.Add('.deploy' , 'application/octet-stream');
$MimeMappings.Add('.der' , 'application/x-x509-ca-cert');
$MimeMappings.Add('.dib' , 'image/bmp');
$MimeMappings.Add('.dir' , 'application/x-director');
$MimeMappings.Add('.disco' , 'text/xml');
$MimeMappings.Add('.dll' , 'application/x-msdownload');
$MimeMappings.Add('.dll.config' , 'text/xml');
$MimeMappings.Add('.dlm' , 'text/dlm');
$MimeMappings.Add('.doc' , 'application/msword');
$MimeMappings.Add('.docm' , 'application/vnd.ms-word.document.macroEnabled.12');
$MimeMappings.Add('.docx' , 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');
$MimeMappings.Add('.dot' , 'application/msword');
$MimeMappings.Add('.dotm' , 'application/vnd.ms-word.template.macroEnabled.12');
$MimeMappings.Add('.dotx' , 'application/vnd.openxmlformats-officedocument.wordprocessingml.template');
$MimeMappings.Add('.dsp' , 'application/octet-stream');
$MimeMappings.Add('.dtd' , 'text/xml');
$MimeMappings.Add('.dvi' , 'application/x-dvi');
$MimeMappings.Add('.dwf' , 'drawing/x-dwf');
$MimeMappings.Add('.dwp' , 'application/octet-stream');
$MimeMappings.Add('.dxr' , 'application/x-director');
$MimeMappings.Add('.eml' , 'message/rfc822');
$MimeMappings.Add('.emz' , 'application/octet-stream');
$MimeMappings.Add('.eot' , 'application/octet-stream');
$MimeMappings.Add('.eps' , 'application/postscript');
$MimeMappings.Add('.etx' , 'text/x-setext');
$MimeMappings.Add('.evy' , 'application/envoy');
$MimeMappings.Add('.exe' , 'application/octet-stream');
$MimeMappings.Add('.exe.config' , 'text/xml');
$MimeMappings.Add('.fdf' , 'application/vnd.fdf');
$MimeMappings.Add('.fif' , 'application/fractals');
$MimeMappings.Add('.fla' , 'application/octet-stream');
$MimeMappings.Add('.flr' , 'x-world/x-vrml');
$MimeMappings.Add('.flv' , 'video/x-flv');
$MimeMappings.Add('.gif' , 'image/gif');
$MimeMappings.Add('.gtar' , 'application/x-gtar');
$MimeMappings.Add('.gz' , 'application/x-gzip');
$MimeMappings.Add('.h' , 'text/plain');
$MimeMappings.Add('.hdf' , 'application/x-hdf');
$MimeMappings.Add('.hdml' , 'text/x-hdml');
$MimeMappings.Add('.hhc' , 'application/x-oleobject');
$MimeMappings.Add('.hhk' , 'application/octet-stream');
$MimeMappings.Add('.hhp' , 'application/octet-stream');
$MimeMappings.Add('.hlp' , 'application/winhlp');
$MimeMappings.Add('.hqx' , 'application/mac-binhex40');
$MimeMappings.Add('.hta' , 'application/hta');
$MimeMappings.Add('.htc' , 'text/x-component');
$MimeMappings.Add('.htm' , 'text/html');
$MimeMappings.Add('.html' , 'text/html');
$MimeMappings.Add('.htt' , 'text/webviewhtml');
$MimeMappings.Add('.hxt' , 'text/html');
$MimeMappings.Add('.ico' , 'image/x-icon');
$MimeMappings.Add('.ics' , 'application/octet-stream');
$MimeMappings.Add('.ief' , 'image/ief');
$MimeMappings.Add('.iii' , 'application/x-iphone');
$MimeMappings.Add('.inf' , 'application/octet-stream');
$MimeMappings.Add('.ins' , 'application/x-internet-signup');
$MimeMappings.Add('.isp' , 'application/x-internet-signup');
$MimeMappings.Add('.IVF' , 'video/x-ivf');
$MimeMappings.Add('.jar' , 'application/java-archive');
$MimeMappings.Add('.java' , 'application/octet-stream');
$MimeMappings.Add('.jck' , 'application/liquidmotion');
$MimeMappings.Add('.jcz' , 'application/liquidmotion');
$MimeMappings.Add('.jfif' , 'image/pjpeg');
$MimeMappings.Add('.jpb' , 'application/octet-stream');
$MimeMappings.Add('.jpe' , 'image/jpeg');
$MimeMappings.Add('.jpeg' , 'image/jpeg');
$MimeMappings.Add('.jpg' , 'image/jpeg');
$MimeMappings.Add('.js' , 'application/x-javascript');
$MimeMappings.Add('.jsx' , 'text/jscript');
$MimeMappings.Add('.latex' , 'application/x-latex');
$MimeMappings.Add('.lit' , 'application/x-ms-reader');
$MimeMappings.Add('.lpk' , 'application/octet-stream');
$MimeMappings.Add('.lsf' , 'video/x-la-asf');
$MimeMappings.Add('.lsx' , 'video/x-la-asf');
$MimeMappings.Add('.lzh' , 'application/octet-stream');
$MimeMappings.Add('.m13' , 'application/x-msmediaview');
$MimeMappings.Add('.m14' , 'application/x-msmediaview');
$MimeMappings.Add('.m1v' , 'video/mpeg');
$MimeMappings.Add('.m3u' , 'audio/x-mpegurl');
$MimeMappings.Add('.man' , 'application/x-troff-man');
$MimeMappings.Add('.manifest' , 'application/x-ms-manifest');
$MimeMappings.Add('.map' , 'text/plain');
$MimeMappings.Add('.mdb' , 'application/x-msaccess');
$MimeMappings.Add('.mdp' , 'application/octet-stream');
$MimeMappings.Add('.me' , 'application/x-troff-me');
$MimeMappings.Add('.mht' , 'message/rfc822');
$MimeMappings.Add('.mhtml' , 'message/rfc822');
$MimeMappings.Add('.mid' , 'audio/mid');
$MimeMappings.Add('.midi' , 'audio/mid');
$MimeMappings.Add('.mix' , 'application/octet-stream');
$MimeMappings.Add('.mmf' , 'application/x-smaf');
$MimeMappings.Add('.mno' , 'text/xml');
$MimeMappings.Add('.mny' , 'application/x-msmoney');
$MimeMappings.Add('.mov' , 'video/quicktime');
$MimeMappings.Add('.movie' , 'video/x-sgi-movie');
$MimeMappings.Add('.mp2' , 'video/mpeg');
$MimeMappings.Add('.mp3' , 'audio/mpeg');
$MimeMappings.Add('.mpa' , 'video/mpeg');
$MimeMappings.Add('.mpe' , 'video/mpeg');
$MimeMappings.Add('.mpeg' , 'video/mpeg');
$MimeMappings.Add('.mpg' , 'video/mpeg');
$MimeMappings.Add('.mpp' , 'application/vnd.ms-project');
$MimeMappings.Add('.mpv2' , 'video/mpeg');
$MimeMappings.Add('.ms' , 'application/x-troff-ms');
$MimeMappings.Add('.msi' , 'application/octet-stream');
$MimeMappings.Add('.mso' , 'application/octet-stream');
$MimeMappings.Add('.mvb' , 'application/x-msmediaview');
$MimeMappings.Add('.mvc' , 'application/x-miva-compiled');
$MimeMappings.Add('.nc' , 'application/x-netcdf');
$MimeMappings.Add('.nsc' , 'video/x-ms-asf');
$MimeMappings.Add('.nws' , 'message/rfc822');
$MimeMappings.Add('.ocx' , 'application/octet-stream');
$MimeMappings.Add('.oda' , 'application/oda');
$MimeMappings.Add('.odc' , 'text/x-ms-odc');
$MimeMappings.Add('.ods' , 'application/oleobject');
$MimeMappings.Add('.one' , 'application/onenote');
$MimeMappings.Add('.onea' , 'application/onenote');
$MimeMappings.Add('.onetoc' , 'application/onenote');
$MimeMappings.Add('.onetoc2' , 'application/onenote');
$MimeMappings.Add('.onetmp' , 'application/onenote');
$MimeMappings.Add('.onepkg' , 'application/onenote');
$MimeMappings.Add('.osdx' , 'application/opensearchdescription+xml');
$MimeMappings.Add('.p10' , 'application/pkcs10');
$MimeMappings.Add('.p12' , 'application/x-pkcs12');
$MimeMappings.Add('.p7b' , 'application/x-pkcs7-certificates');
$MimeMappings.Add('.p7c' , 'application/pkcs7-mime');
$MimeMappings.Add('.p7m' , 'application/pkcs7-mime');
$MimeMappings.Add('.p7r' , 'application/x-pkcs7-certreqresp');
$MimeMappings.Add('.p7s' , 'application/pkcs7-signature');
$MimeMappings.Add('.pbm' , 'image/x-portable-bitmap');
$MimeMappings.Add('.pcx' , 'application/octet-stream');
$MimeMappings.Add('.pcz' , 'application/octet-stream');
$MimeMappings.Add('.pdf' , 'application/pdf');
$MimeMappings.Add('.pfb' , 'application/octet-stream');
$MimeMappings.Add('.pfm' , 'application/octet-stream');
$MimeMappings.Add('.pfx' , 'application/x-pkcs12');
$MimeMappings.Add('.pgm' , 'image/x-portable-graymap');
$MimeMappings.Add('.pko' , 'application/vnd.ms-pki.pko');
$MimeMappings.Add('.pma' , 'application/x-perfmon');
$MimeMappings.Add('.pmc' , 'application/x-perfmon');
$MimeMappings.Add('.pml' , 'application/x-perfmon');
$MimeMappings.Add('.pmr' , 'application/x-perfmon');
$MimeMappings.Add('.pmw' , 'application/x-perfmon');
$MimeMappings.Add('.png' , 'image/png');
$MimeMappings.Add('.pnm' , 'image/x-portable-anymap');
$MimeMappings.Add('.pnz' , 'image/png');
$MimeMappings.Add('.pot' , 'application/vnd.ms-powerpoint');
$MimeMappings.Add('.potm' , 'application/vnd.ms-powerpoint.template.macroEnabled.12');
$MimeMappings.Add('.potx' , 'application/vnd.openxmlformats-officedocument.presentationml.template');
$MimeMappings.Add('.ppam' , 'application/vnd.ms-powerpoint.addin.macroEnabled.12');
$MimeMappings.Add('.ppm' , 'image/x-portable-pixmap');
$MimeMappings.Add('.pps' , 'application/vnd.ms-powerpoint');
$MimeMappings.Add('.ppsm' , 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12');
$MimeMappings.Add('.ppsx' , 'application/vnd.openxmlformats-officedocument.presentationml.slideshow');
$MimeMappings.Add('.ppt' , 'application/vnd.ms-powerpoint');
$MimeMappings.Add('.pptm' , 'application/vnd.ms-powerpoint.presentation.macroEnabled.12');
$MimeMappings.Add('.pptx' , 'application/vnd.openxmlformats-officedocument.presentationml.presentation');
$MimeMappings.Add('.prf' , 'application/pics-rules');
$MimeMappings.Add('.prm' , 'application/octet-stream');
$MimeMappings.Add('.prx' , 'application/octet-stream');
$MimeMappings.Add('.ps' , 'application/postscript');
$MimeMappings.Add('.psd' , 'application/octet-stream');
$MimeMappings.Add('.psm' , 'application/octet-stream');
$MimeMappings.Add('.psp' , 'application/octet-stream');
$MimeMappings.Add('.pub' , 'application/x-mspublisher');
$MimeMappings.Add('.qt' , 'video/quicktime');
$MimeMappings.Add('.qtl' , 'application/x-quicktimeplayer');
$MimeMappings.Add('.qxd' , 'application/octet-stream');
$MimeMappings.Add('.ra' , 'audio/x-pn-realaudio');
$MimeMappings.Add('.ram' , 'audio/x-pn-realaudio');
$MimeMappings.Add('.rar' , 'application/octet-stream');
$MimeMappings.Add('.ras' , 'image/x-cmu-raster');
$MimeMappings.Add('.rf' , 'image/vnd.rn-realflash');
$MimeMappings.Add('.rgb' , 'image/x-rgb');
$MimeMappings.Add('.rm' , 'application/vnd.rn-realmedia');
$MimeMappings.Add('.rmi' , 'audio/mid');
$MimeMappings.Add('.roff' , 'application/x-troff');
$MimeMappings.Add('.rpm' , 'audio/x-pn-realaudio-plugin');
$MimeMappings.Add('.rtf' , 'application/rtf');
$MimeMappings.Add('.rtx' , 'text/richtext');
$MimeMappings.Add('.scd' , 'application/x-msschedule');
$MimeMappings.Add('.sct' , 'text/scriptlet');
$MimeMappings.Add('.sea' , 'application/octet-stream');
$MimeMappings.Add('.setpay' , 'application/set-payment-initiation');
$MimeMappings.Add('.setreg' , 'application/set-registration-initiation');
$MimeMappings.Add('.sgml' , 'text/sgml');
$MimeMappings.Add('.sh' , 'application/x-sh');
$MimeMappings.Add('.shar' , 'application/x-shar');
$MimeMappings.Add('.sit' , 'application/x-stuffit');
$MimeMappings.Add('.sldm' , 'application/vnd.ms-powerpoint.slide.macroEnabled.12');
$MimeMappings.Add('.sldx' , 'application/vnd.openxmlformats-officedocument.presentationml.slide');
$MimeMappings.Add('.smd' , 'audio/x-smd');
$MimeMappings.Add('.smi' , 'application/octet-stream');
$MimeMappings.Add('.smx' , 'audio/x-smd');
$MimeMappings.Add('.smz' , 'audio/x-smd');
$MimeMappings.Add('.snd' , 'audio/basic');
$MimeMappings.Add('.snp' , 'application/octet-stream');
$MimeMappings.Add('.spc' , 'application/x-pkcs7-certificates');
$MimeMappings.Add('.spl' , 'application/futuresplash');
$MimeMappings.Add('.src' , 'application/x-wais-source');
$MimeMappings.Add('.ssm' , 'application/streamingmedia');
$MimeMappings.Add('.sst' , 'application/vnd.ms-pki.certstore');
$MimeMappings.Add('.stl' , 'application/vnd.ms-pki.stl');
$MimeMappings.Add('.sv4cpio' , 'application/x-sv4cpio');
$MimeMappings.Add('.sv4crc' , 'application/x-sv4crc');
$MimeMappings.Add('.swf' , 'application/x-shockwave-flash');
$MimeMappings.Add('.t' , 'application/x-troff');
$MimeMappings.Add('.tar' , 'application/x-tar');
$MimeMappings.Add('.tcl' , 'application/x-tcl');
$MimeMappings.Add('.tex' , 'application/x-tex');
$MimeMappings.Add('.texi' , 'application/x-texinfo');
$MimeMappings.Add('.texinfo' , 'application/x-texinfo');
$MimeMappings.Add('.tgz' , 'application/x-compressed');
$MimeMappings.Add('.thmx' , 'application/vnd.ms-officetheme');
$MimeMappings.Add('.thn' , 'application/octet-stream');
$MimeMappings.Add('.tif' , 'image/tiff');
$MimeMappings.Add('.tiff' , 'image/tiff');
$MimeMappings.Add('.toc' , 'application/octet-stream');
$MimeMappings.Add('.tr' , 'application/x-troff');
$MimeMappings.Add('.trm' , 'application/x-msterminal');
$MimeMappings.Add('.tsv' , 'text/tab-separated-values');
$MimeMappings.Add('.ttf' , 'application/octet-stream');
$MimeMappings.Add('.txt' , 'text/plain');
$MimeMappings.Add('.u32' , 'application/octet-stream');
$MimeMappings.Add('.uls' , 'text/iuls');
$MimeMappings.Add('.ustar' , 'application/x-ustar');
$MimeMappings.Add('.vbs' , 'text/vbscript');
$MimeMappings.Add('.vcf' , 'text/x-vcard');
$MimeMappings.Add('.vcs' , 'text/plain');
$MimeMappings.Add('.vdx' , 'application/vnd.ms-visio.viewer');
$MimeMappings.Add('.vml' , 'text/xml');
$MimeMappings.Add('.vsd' , 'application/vnd.visio');
$MimeMappings.Add('.vss' , 'application/vnd.visio');
$MimeMappings.Add('.vst' , 'application/vnd.visio');
$MimeMappings.Add('.vsto' , 'application/x-ms-vsto');
$MimeMappings.Add('.vsw' , 'application/vnd.visio');
$MimeMappings.Add('.vsx' , 'application/vnd.visio');
$MimeMappings.Add('.vtx' , 'application/vnd.visio');
$MimeMappings.Add('.wav' , 'audio/wav');
$MimeMappings.Add('.wax' , 'audio/x-ms-wax');
$MimeMappings.Add('.wbmp' , 'image/vnd.wap.wbmp');
$MimeMappings.Add('.wcm' , 'application/vnd.ms-works');
$MimeMappings.Add('.wdb' , 'application/vnd.ms-works');
$MimeMappings.Add('.wks' , 'application/vnd.ms-works');
$MimeMappings.Add('.wm' , 'video/x-ms-wm');
$MimeMappings.Add('.wma' , 'audio/x-ms-wma');
$MimeMappings.Add('.wmd' , 'application/x-ms-wmd');
$MimeMappings.Add('.wmf' , 'application/x-msmetafile');
$MimeMappings.Add('.wml' , 'text/vnd.wap.wml');
$MimeMappings.Add('.wmlc' , 'application/vnd.wap.wmlc');
$MimeMappings.Add('.wmls' , 'text/vnd.wap.wmlscript');
$MimeMappings.Add('.wmlsc' , 'application/vnd.wap.wmlscriptc');
$MimeMappings.Add('.wmp' , 'video/x-ms-wmp');
$MimeMappings.Add('.wmv' , 'video/x-ms-wmv');
$MimeMappings.Add('.wmx' , 'video/x-ms-wmx');
$MimeMappings.Add('.wmz' , 'application/x-ms-wmz');
$MimeMappings.Add('.wps' , 'application/vnd.ms-works');
$MimeMappings.Add('.wri' , 'application/x-mswrite');
$MimeMappings.Add('.wrl' , 'x-world/x-vrml');
$MimeMappings.Add('.wrz' , 'x-world/x-vrml');
$MimeMappings.Add('.wsdl' , 'text/xml');
$MimeMappings.Add('.wvx' , 'video/x-ms-wvx');
$MimeMappings.Add('.x' , 'application/directx');
$MimeMappings.Add('.xaf' , 'x-world/x-vrml');
$MimeMappings.Add('.xaml' , 'application/xaml+xml');
$MimeMappings.Add('.xap' , 'application/x-silverlight-app');
$MimeMappings.Add('.xbap' , 'application/x-ms-xbap');
$MimeMappings.Add('.xbm' , 'image/x-xbitmap');
$MimeMappings.Add('.xdr' , 'text/plain');
$MimeMappings.Add('.xla' , 'application/vnd.ms-excel');
$MimeMappings.Add('.xlam' , 'application/vnd.ms-excel.addin.macroEnabled.12');
$MimeMappings.Add('.xlc' , 'application/vnd.ms-excel');
$MimeMappings.Add('.xlm' , 'application/vnd.ms-excel');
$MimeMappings.Add('.xls' , 'application/vnd.ms-excel');
$MimeMappings.Add('.xlsb' , 'application/vnd.ms-excel.sheet.binary.macroEnabled.12');
$MimeMappings.Add('.xlsm' , 'application/vnd.ms-excel.sheet.macroEnabled.12');
$MimeMappings.Add('.xlsx' , 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$MimeMappings.Add('.xlt' , 'application/vnd.ms-excel');
$MimeMappings.Add('.xltm' , 'application/vnd.ms-excel.template.macroEnabled.12');
$MimeMappings.Add('.xltx' , 'application/vnd.openxmlformats-officedocument.spreadsheetml.template');
$MimeMappings.Add('.xlw' , 'application/vnd.ms-excel');
$MimeMappings.Add('.xml' , 'text/xml');
$MimeMappings.Add('.xof' , 'x-world/x-vrml');
$MimeMappings.Add('.xpm' , 'image/x-xpixmap');
$MimeMappings.Add('.xps' , 'application/vnd.ms-xpsdocument');
$MimeMappings.Add('.xsd' , 'text/xml');
$MimeMappings.Add('.xsf' , 'text/xml');
$MimeMappings.Add('.xsl' , 'text/xml');
$MimeMappings.Add('.xslt' , 'text/xml');
$MimeMappings.Add('.xsn' , 'application/octet-stream');
$MimeMappings.Add('.xtp' , 'application/octet-stream');
$MimeMappings.Add('.xwd' , 'image/x-xwindowdump');
$MimeMappings.Add('.z' , 'application/x-compress');
$MimeMappings.Add('.zip' , 'application/x-zip-compressed');
#endregion

#endregion

#region Functions

#region Get File Content Type
FUNCTION Get-FileContentType
{
    [CmdletBinding()]
    param 
    (
        [Parameter(Mandatory = $true)]
        [string]
        $FileName
    )
    $extension = [System.IO.Path]::GetExtension($FileName)
    $contentType = $MimeMappings[$extension]

    if ([string]::IsNullOrEmpty($contentType))
    {
        return New-Object System.Net.Mime.ContentType
    }
    else
    {
        return New-Object System.Net.Mime.ContentType($contentType)
    }
}
#endregion

#region Send Mail Message
FUNCTION Send-MailMessageWithInlineAttachment
{
    <#
    .Synopsis
        Same as Send-MailMessage yet with inline attachments support.
    .DESCRIPTION
        This Function Sends an Email supporting inline attachments feature where you may include images in the body.
    .PARAMETER Attachments
        This is an array of attachments paths.
    .PARAMETER InlineAttachments
        This is a hashtable used to declare the inline attachments.
    .PARAMETER Bcc
        Array of Mail Addresses defining the BCC
    .PARAMETER Cc
        Array of Mail Addresses defining the CC
    .PARAMETER Body
        Text defining email body.
    .PARAMETER BodyAsHtml
        Switch to flag if Email Body is HTML or plain text.
    .PARAMETER DeliveryNotificationOption
        Delivery notification options
    .PARAMETER From
        Mail Address to define the sender.
    .PARAMETER Subject
        Text to define the Subject.
    .PARAMETER Priority
        Option to set email Priority
    .PARAMETER SmtpServer
        This can be DNS record or IP. Example: smtp.gmail.com
    .PARAMETER To
        Array of Mail Addresses defining the To
    .PARAMETER Credential
        User name and password to claim and identify the user.
    .PARAMETER UseSsl
        Switch to Enable/Disable SSL.
    .PARAMETER Port
        Text to define the Port.
    .EXAMPLE
        $Password = ConvertTo-SecureString -String 'zgedokjgsbkqacok' -AsPlainText -Force;
        $UserName = 'smtp.ακλლε♪@gmail.com';
        $Credentials = New-Object 'System.Management.Automation.PSCredential' -ArgumentList $UserName, $Password;
        $MailingList = @('a1@ακλლε♪.com', 'a2@ακλლε♪.com');
        $Subject = "Test Email";
        $Attachments = [Collections.HashTable]::new();
        $Attachments.Add("BG", "D:\Pictures\background\524299323109990.jpg");
        $Body = "<img alt'Deployment in Progress' src='cid:BG' />";
        Send-MailMessageWithInlineAttachment `
        -SmtpServer 'smtp.gmail.com' `
        -Port 587 `
        -UseSsl:$true `
        -Credential $Credentials `
        -From 'smtp.ακλლε♪@gmail.com' `
        -To $MailingList `
        -BodyAsHtml:$true `
        -Subject $Subject `
        -Body $Body `
        -InlineAttachments $Attachments `
        ;
    #>


    #region Parameters
    [CmdletBinding()]
    param
    (
        [Parameter(ValueFromPipeline=$true)]
        [Alias('PsPath')]
        [ValidateNotNullOrEmpty()]
        [string[]]
        ${Attachments},

        [ValidateNotNullOrEmpty()]
        [Collections.HashTable]
        ${InlineAttachments},
        
        [ValidateNotNullOrEmpty()]
        [Net.Mail.MailAddress[]]
        ${Bcc},
    
        [Parameter(Position=2)]
        [ValidateNotNullOrEmpty()]
        [string]
        ${Body},
        
        [Alias('BAH')]
        [switch]
        ${BodyAsHtml},
    
        [ValidateNotNullOrEmpty()]
        [Net.Mail.MailAddress[]]
        ${Cc},
    
        [Alias('DNO')]
        [ValidateNotNullOrEmpty()]
        [Net.Mail.DeliveryNotificationOptions]
        ${DeliveryNotificationOption},
    
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [Net.Mail.MailAddress]
        ${From},
    
        [Parameter(Mandatory = $true, Position = 3)]
        [Alias('ComputerName')]
        [string]
        ${SmtpServer},
    
        [ValidateNotNullOrEmpty()]
        [Net.Mail.MailPriority]
        ${Priority},
        
        [Parameter(Mandatory=$true, Position=1)]
        [Alias('sub')]
        [ValidateNotNullOrEmpty()]
        [string]
        ${Subject},
    
        [Parameter(Mandatory=$true, Position=0)]
        [Net.Mail.MailAddress[]]
        ${To},
    
        [ValidateNotNullOrEmpty()]
        [Management.Automation.PSCredential]
        ${Credential},
    
        [switch]
        ${UseSsl},
    
        [ValidateRange(0, 2147483647)]
        [int]
        ${Port} = 25
    )
    #endregion

    try
    {
        $_smtpClient = New-Object Net.Mail.SmtpClient;
        $_message = New-Object Net.Mail.MailMessage;
        
        $_smtpClient.Host = $SmtpServer;
        $_smtpClient.Port = $Port;
        $_smtpClient.EnableSsl = $UseSsl;

        if ($null -ne $Credential)
        {
            # In PowerShell 2.0, assigning the results of GetNetworkCredential() to the SMTP client sometimes fails (with gmail, in testing), but
            # building a new NetworkCredential object containing only the UserName and Password works okay.

            $_tempCred = $Credential.GetNetworkCredential();
            $_smtpClient.Credentials = New-Object Net.NetworkCredential($Credential.UserName, $_tempCred.Password);
        }
        else
        {
            $_smtpClient.UseDefaultCredentials = $true;
        }
    }
    catch
    {
        $_message.Dispose()
        throw
    }
    TRY
    {        
        $_message.From = $From;
        $_message.Subject = $Subject;
            
        if ($BodyAsHtml)
        {
            $_bodyPart = [Net.Mail.AlternateView]::CreateAlternateViewFromString($Body, 'text/html');
        }
        else
        {
            $_bodyPart = [Net.Mail.AlternateView]::CreateAlternateViewFromString($Body, 'text/plain');
        }   

        $_message.AlternateViews.Add($_bodyPart);

        if ($PSBoundParameters.ContainsKey('DeliveryNotificationOption')) { $_message.DeliveryNotificationOptions = $DeliveryNotificationOption; }
        if ($PSBoundParameters.ContainsKey('Priority')) { $_message.Priority = $Priority; }

        foreach ($_address in $To)
        {
            if (-not $_message.To.Contains($_address)) { $_message.To.Add($_address); }
        }

        if ($null -ne $Cc)
        {
            foreach ($_address in $Cc)
            {
                if (-not $_message.CC.Contains($_address)) { $_message.CC.Add($_address); }
            }
        }

        if ($null -ne $Bcc)
        {
            foreach ($_address in $Bcc)
            {
                if (-not $_message.Bcc.Contains($_address)) { $_message.Bcc.Add($_address); }
            }
        }
        if ($null -ne $Attachments)
        {
            foreach ($_file in $Attachments)
            {
                try
                {
                    $_contentType = FileNameToContentType -FileName $_file;
                    $_message.Attachments.Add((New-Object Net.Mail.Attachment($_file, $_contentType)));
                }
                catch
                {
                    $_message.Dispose();
                    throw;
                }
            }
        }
    }        
    CATCH
    {
        $_message.Dispose();
        throw;
    }

    if ($PSBoundParameters.ContainsKey('InlineAttachments'))
    {
        foreach ($_entry in $InlineAttachments.GetEnumerator())
        {
            $_file = $_entry.Value.ToString();
                
            if ([string]::IsNullOrEmpty($_file))
            {
                $_message.Dispose();
                throw "Send-MailMessage: Values in the InlineAttachments table cannot be null.";
            }

            try
            {
                $_contentType = Get-FileContentType -FileName $_file;
                $_attachment = New-Object Net.Mail.LinkedResource($_file, $_contentType);
                $_attachment.ContentId = $_entry.Key;

                $_bodyPart.LinkedResources.Add($_attachment);

                
            }
            catch
            {
                $_message.Dispose();
                throw;
            }
        }
    }
    try
    {
        $_smtpClient.Send($_message);
    }
    catch
    {
        throw;
    }
    finally
    {
        $_message.Dispose()
    }
}
#endregion

#endregion