)>}]
شركة التطبيقات المتكاملة لتصميم وبرمجة البرمجيات الخاصة ش.ش.و.
Integrated Applications Programming Company
Home » Code Library » Mail (Ia.Ftn.Cl.Models.Business)

Public general use code classes and xml files that we've compiled and used over the years:

Mail process support class of Fixed Telecommunications Network (FTN) business model.

    1: using MailKit;
    2: using System;
    3: using System.Collections;
    4: using System.Collections.Generic;
    5: using System.Configuration;
    6: using System.Linq;
    7: using System.Text;
    8: using System.Text.RegularExpressions;
    9: using System.Xml;
   10: using System.Xml.Serialization;
   11:  
   12: namespace Ia.Ftn.Cl.Models.Business
   13: {
   14:     ////////////////////////////////////////////////////////////////////////////
   15:  
   16:     /// <summary publish="true">
   17:     /// Mail process support class of Fixed Telecommunications Network (FTN) business model.
   18:     /// </summary>
   19:     /// 
   20:     /// <remarks> 
   21:     /// Copyright © 2006-2021 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   22:     /// </remarks> 
   23:     public class Mail
   24:     {
   25:         private readonly List<string> folderList, mailRegexToFolderList;
   26:  
   27:         /// <summary/>
   28:         public bool EnabledSsl { get; set; }
   29:  
   30:         /// <summary/>
   31:         public bool IsActive { get; set; }
   32:  
   33:         /// <summary/>
   34:         public bool IsActiveDuringWorkingHoursOnly { get; set; }
   35:  
   36:         /// <summary/>
   37:         public int MailboxCheckFrequencyInMinutes { get; set; }
   38:  
   39:         /// <summary/>
   40:         public string Host { get; set; }
   41:  
   42:         /// <summary/>
   43:         public string UserName { get; set; }
   44:  
   45:         /// <summary/>
   46:         public string Password { get; set; }
   47:  
   48:         /// <summary/>
   49:         public List<string> FolderList { get { return folderList; } }
   50:  
   51:         /// <summary/>
   52:         public List<string> MailRegexToMailboxList { get { return mailRegexToFolderList; } }
   53:  
   54:         ////////////////////////////////////////////////////////////////////////////
   55:  
   56:         /// <summary>
   57:         ///
   58:         /// </summary>
   59:         public Mail()
   60:         {
   61:             mailRegexToFolderList = new List<string>(100);
   62:             folderList = new List<string>(100);
   63:         }
   64:  
   65:         ////////////////////////////////////////////////////////////////////////////
   66:  
   67:         /// <summary>
   68:         ///
   69:         /// </summary>
   70:         public bool AddFolder(string name, out string result)
   71:         {
   72:             bool b;
   73:             string s;
   74:  
   75:             if (Ia.Cl.Models.File.IsValidFilename(name))
   76:             {
   77:                 // below: check if the folder name exists in upper or lower forms
   78:                 s = (from m in folderList where m.ToLower() == name.ToLower() select m).SingleOrDefault();
   79:  
   80:                 if (s == null) // no duplicates
   81:                 {
   82:                     folderList.Add(name);
   83:  
   84:                     result = "Success: Folder name '" + name + "' assigned to be added. ";
   85:                     b = true;
   86:                 }
   87:                 else
   88:                 {
   89:                     result = "Error: Folder name '" + name + "' already assigned or exists. ";
   90:                     b = false;
   91:                 }
   92:             }
   93:             else
   94:             {
   95:                 result = "Error: Folder '" + name + "' is not valid. ";
   96:                 b = false;
   97:             }
   98:  
   99:             return b;
  100:         }
  101:  
  102:         ////////////////////////////////////////////////////////////////////////////
  103:  
  104:         /// <summary>
  105:         ///
  106:         /// </summary>
  107:         public bool DeleteFolder(string name, out string result)
  108:         {
  109:             bool b;
  110:  
  111:             if (folderList.Contains(name) || folderList.Contains(name.ToLower()))
  112:             {
  113:                 folderList.Remove(name);
  114:  
  115:                 result = "Success: Mailbox name '" + name + "' assigned to be deleted. ";
  116:                 b = true;
  117:             }
  118:             else
  119:             {
  120:                 result = "Error: Mailbox name '" + name + "' does not exist. ";
  121:                 b = false;
  122:             }
  123:  
  124:             return b;
  125:         }
  126:  
  127:         ////////////////////////////////////////////////////////////////////////////
  128:  
  129:         /// <summary>
  130:         ///
  131:         /// </summary>
  132:         public void CopyFolderList(List<string> newFolderList)
  133:         {
  134:             // below: this will copy folder list into object
  135:  
  136:             folderList.Clear();
  137:  
  138:             foreach (string s in newFolderList) folderList.Add(s);
  139:         }
  140:  
  141:         ////////////////////////////////////////////////////////////////////////////
  142:  
  143:         /// <summary>
  144:         ///
  145:         /// </summary>
  146:         public bool AddRegex(string folderName, string regex, out string result)
  147:         {
  148:             bool b;
  149:  
  150:             if (Ia.Cl.Models.Default.IsRegexPatternValid(regex))
  151:             {
  152:                 if (folderList.Contains(folderName) || folderList.Contains(folderName.ToLower()))
  153:                 {
  154:                     if (!mailRegexToFolderList.Contains(regex + " (" + folderName + ")"))
  155:                     {
  156:                         mailRegexToFolderList.Add(regex + " (" + folderName + ")");
  157:  
  158:                         result = "Success: Regex '" + regex + "' for folder '" + folderName + "' is added. ";
  159:                         b = true;
  160:                     }
  161:                     else
  162:                     {
  163:                         result = "Error: Regex '" + regex + "' for folder '" + folderName + "' already exists. ";
  164:                         b = false;
  165:                     }
  166:                 }
  167:                 else
  168:                 {
  169:                     result = "Error: Folder '" + folderName + "' is not assigned or does not exist. ";
  170:                     b = false;
  171:                 }
  172:             }
  173:             else
  174:             {
  175:                 result = "Error: Regex pattern '" + regex + "' is invalid. ";
  176:                 b = false;
  177:             }
  178:  
  179:             return b;
  180:         }
  181:  
  182:         ////////////////////////////////////////////////////////////////////////////
  183:  
  184:         /// <summary>
  185:         ///
  186:         /// </summary>
  187:         public bool DeleteRegex(string regex, out string result)
  188:         {
  189:             bool b;
  190:  
  191:             if (mailRegexToFolderList.Contains(regex))
  192:             {
  193:                 mailRegexToFolderList.Remove(regex);
  194:  
  195:                 result = "Success: regex '" + regex + "' was removed. ";
  196:                 b = true;
  197:             }
  198:             else
  199:             {
  200:                 result = "Error: regex does not exist. ";
  201:                 b = false;
  202:             }
  203:  
  204:             return b;
  205:         }
  206:  
  207:         ////////////////////////////////////////////////////////////////////////////
  208:         ////////////////////////////////////////////////////////////////////////////
  209:  
  210:         /// <summary>
  211:         ///
  212:         /// </summary>
  213:         public static Mail DeserializeFromString(string serializedObject)
  214:         {
  215:             Mail m;
  216:  
  217:             m = serializedObject.XmlDeserializeFromString<Mail>();
  218:  
  219:             return m;
  220:         }
  221:  
  222:         ////////////////////////////////////////////////////////////////////////////
  223:  
  224:         /// <summary>
  225:         ///
  226:         /// </summary>
  227:         public string SerializeToString()
  228:         {
  229:             StringBuilder sb;
  230:  
  231:             sb = new StringBuilder(10000);
  232:  
  233:             var serializer = new XmlSerializer(typeof(Mail));
  234:  
  235:             using (var writer = XmlWriter.Create(sb))
  236:             {
  237:                 serializer.Serialize(writer, this);
  238:             }
  239:  
  240:             return sb.ToString();
  241:         }
  242:  
  243:         ////////////////////////////////////////////////////////////////////////////
  244:  
  245:         /// <summary>
  246:         ///
  247:         /// </summary>
  248:         public static bool Sorter(Mail mail, out Ia.Cl.Models.Result result)
  249:         {
  250:             bool b;
  251:             int numberOfMessagesMoved;
  252:             string regex, destinationFolder; //, messageId, email;
  253:             List<string> folderList;
  254:             List<string> foldersToAddList;
  255:             Match match;
  256:             Ia.Cl.Models.Imap imap2;
  257:  
  258:             numberOfMessagesMoved = 0;
  259:             result = new Ia.Cl.Models.Result();
  260:  
  261:             foldersToAddList = new List<string>(100);
  262:  
  263:             try
  264:             {
  265:                 imap2 = new Ia.Cl.Models.Imap(mail.Host, mail.UserName, mail.Password, mail.EnabledSsl);
  266:                 //imap2 = new Ia.Cl.Models.Imap("imap.*.com", "*@*.com", "*", false);
  267:  
  268:                 // below: read all folders
  269:                 folderList = imap2.FolderList().Select(u => u.Name).ToList();
  270:  
  271:                 // below: determain change if any
  272:                 // below: mailboxes to add:
  273:                 foreach (string s in mail.FolderList)
  274:                 {
  275:                     if (!folderList.Contains(s)) foldersToAddList.Add(s);
  276:                 }
  277:  
  278:                 // below: mailboxes to delete:
  279:                 // below: I will disable deletion of mailboxes
  280:                 // foreach (string s in mailboxArrayList) if (!m.MailboxList.Contains(s)) mailboxesToAddArrayList.Add(s);
  281:  
  282:                 // below: create mailboxes
  283:                 foreach (var s in foldersToAddList) imap2.CreateFolder("inbox", s);
  284:  
  285:                 // below: delete mailboxes
  286:                 // foreach (string s in mailboxesToDeleteArrayList) imap.DeleteMailbox(s);
  287:  
  288:                 // below: read all mailboxes again
  289:                 folderList = imap2.FolderList().Select(u => u.Name).ToList();
  290:  
  291:                 // below: assign change to object
  292:                 mail.CopyFolderList(folderList);
  293:  
  294:                 // below: start moving
  295:                 foreach (string s in mail.MailRegexToMailboxList)
  296:                 {
  297:                     match = Regex.Match(s, @"(.+?) \((.+?)\)");
  298:  
  299:                     if (match.Success)
  300:                     {
  301:                         regex = match.Groups[1].Value;
  302:                         destinationFolder = match.Groups[2].Value;
  303:  
  304:                         //numberOfMessagesMoved += imap2.MoveMessagesFromEmailToMailbox(regex, destinationMailbox);
  305:                     }
  306:                 }
  307:  
  308:                 result.AddSuccess("Number of messages moved: " + numberOfMessagesMoved + ". ");
  309:  
  310:                 b = true;
  311:             }
  312:             catch (Exception ex)
  313:             {
  314:                 b = false;
  315:  
  316:                 result.AddSuccess("Exception: " + ex.ToString());
  317:             }
  318:  
  319:             return b;
  320:         }
  321:  
  322:         ////////////////////////////////////////////////////////////////////////////
  323:         ////////////////////////////////////////////////////////////////////////////
  324:     }
  325:  
  326:     ////////////////////////////////////////////////////////////////////////////
  327:     ////////////////////////////////////////////////////////////////////////////
  328: }