Передача редактируемого файла по протоколу SMTP

Для чего нужна аctivity TransferEditedFile? Представьте, что Вы редактируете какой либо файл, при сохранении этого файла на диске он будет автоматически отослан одному или нескольким адресатам по протоколу SMTP. Передача будет выполнена без участия человека в момент записи на диск.
Однако о каких типах файлов идет речь? Ниже приведен перечень типов, с которыми проверялась работа программы: docx, xlsx, rtf, txt, phg, html. Редакторами для этих, вполне узнаваемых файлов являются Microsoft Word 2010, Excel 2010, WordPad, Блокнот, Paint и DreamWeaver соответственно. Правда у двух первых позиций такая функция уже встроена в программу. Можно ли продожить это список? Да, можно. Однако, не исключено, что-то потребуется дописать.
Однако, если файлы формируются операционной системой или пользовательскими программами. Будет ли работать activity в этом случае? Да, будет. С целью проверки написан небольшой тестовый клиент, входящий в состав проекта и сохраняющий *.txt файлы.
Может ли быть использован протокол FTP или SMS, вместо SMTP? Может, после доработки программы.
Видит ли пользователь компьютера факт передачи данных? В данной версии программы для каждого передаваемого файла на экран выводится диагностическое сообщение.
Возможно, что в некоторых случаях вместо класса NativeActivity лучше использовать класс ServiceBase, который позволит оформить эту программу как службу Windows.
Программа очень не требовательна к ресурсам компьютера, при отсутствии событий использует Bookmark и ресурсы компьютера практически не потребляет.
Проект MS Visual Studio 2012, содержащий Activity TransferEditedFile можно свободно загрузить.
1. Интерфейс Activity.
Определим входные параметры программы: Path - путь, куда будем записывать редактируемый файл, IncludeSubdirectories- признак включения вложенных папок, Filter - фильтр для указания типа файлов, Host - почтовый сервер, через который будем отправлять почту, Sender - e-mail адрес передающего абонета на сервере, Name - имя передающего абонента, Password - пароль передающего абонента, To - e-mail принимающего абонента, Subject - тема почтового сообщения.
Code

// File System data

[RequiredArgument]

public InArgument<string>   Path        { get; set; }

 

[RequiredArgument]

public InArgument<bool>     IncludeSubdirectories { get; set; }

 

[RequiredArgument]

public InArgument<string>   Filter      { get; set; }

 

// SMTP Data

[RequiredArgument]

public InArgument<string>   Host        { get; set; }

 

[RequiredArgument]

public InArgument<string>   Sender      { get; set; }

 

[RequiredArgument]

public InArgument<string>   Name        { get; set; }

 

[RequiredArgument]

public InArgument<string>   Password    { get; set; }

 

[RequiredArgument]

public InArgument<string>   To          { get; set; }

 

[RequiredArgument]

public InArgument<string>   Subject     { get; set; }

2. Передача файла.
C# исходный текст формирования и передачи SMTP сообщения стандартен и приведен ниже. Из особенностей хочу отметить следующее. Передача данных в программе всегда выполняется в новом потоке и асинхронно. Что касается инициации передачи данных, а речь в данном случае идет о классе FileSystemWatcher и его использовании, смотрите статью WatchFileActivity Windows Workflow.
Отмечу, что методика переноса данных на диск у разных редакторов различна. Например, Microsoft Word 2010 и Excel 2010 создают с сохраняемым файлом и временные. Время создания файла в Excel 2010 значительно, и в программе это приходится учитывать.
Code

// The file transfer

 private void Smtp(string path,string fileName)

 {

     Console.WriteLine( "File name: " + fileName);

 

     //The new name of the file to be sent

     string tmpName = "~" + fileName.Substring(fileName.IndexOf("\\") + 1);

     string tmpDrive = fileName.Substring(0, fileName.IndexOf("\\") + 1);

     tempFileName = tmpDrive + tmpName;

 

     // Delete temporary file

     if (File.Exists(tempFileName)) File.Delete(tempFileName);

 

     // Create client and message

      client  = new SmtpClient();

      message = new MailMessage();

      int i = 1;

 

      //Such a file exists?

      while (i < maxNumberCall )

      {

          // Sleep :)

         Thread.Sleep(1000);

         if (File.Exists(fileName))

         {

             try

             {

                 // Create the attached file

                 File.Copy(fileName, tempFileName);

 

                 client.Host      = host;

                 message.Sender   = new MailAddress(sender);

                 message.From     = new MailAddress(sender, name);

                 message.To.Add(new MailAddress(to));

                 message.Subject  = subject;

                 message.Body     = fileName;

                 message.Priority = MailPriority.High;

                 Attachment attchment = new Attachment(tempFileName, MediaTypeNames.Application.Octet);

                 message.Attachments.Add(attchment);

                 client.Credentials = new System.Net.NetworkCredential(sender, password);

                 client.EnableSsl = false;                     

                 client.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);

                 client.SendAsync(message, client);

                 i = maxNumberCall;

             }

             catch (Exception ex)

             {

                 Console.WriteLine("Error procedure SMTP: " + ex.ToString());

                 i = maxNumberCall;

             }

         }

         else

         {

             Console.WriteLine("Waiting ... ");

         }

         i++;

     }

 }



Microsoft Visual Studio 2012 проект приложения можно свободно загрузить.
Евгений Вересов.
10.08.2013 года.