/// <summary> /// Waits until the specified file is accessible and then sets its file attributes to /// readonly to block the access of other processes such as pop3 clients. The mail is /// scanned for viruses first and deleted when infected. Second step is to scan the /// mail for spam issues. If the mail seem to be spam its subject is marked. Finally /// the file attributes are set to normal and the thread terminates. /// </summary> private void BeginScanThreadStart() { try { this.WaitForAccessAndBlock(this.file); //Virusscann if (VirusScanner.Scan(this.file) == VirusScanResult.Infected) { this.UnblockFile(this.file); this.file.Delete(); } else { //Spamm scann if (SpamScanner.Scan(this.file) == SpamScanResult.Spam) { EmlFile.MarkAsSpam(this.file); } } } catch (Exception ex) { Tracing.Exception(ex); } finally { if (this.file.Exists) { this.UnblockFile(this.file); } } }
/// <summary> /// Forwards the eml file to the recepient that is determined from the folder of the eml file. /// </summary> /// <param name="destinationIp">The destinationIp.</param> /// <param name="destinationHostname">The destinationHostname.</param> /// <returns>True if the mail was forwarded. False otherwise.</returns> public static Boolean Forward(FileInfo file, String destinationIp, String destinationHostname) { Boolean result = false; try { LumiSoft.Net.Mime.Mime mimemessage = LumiSoft.Net.Mime.Mime.Parse(file.FullName); MemoryStream messageStream = new MemoryStream(); mimemessage.ToStream(messageStream); messageStream.Position = 0; LumiSoft.Net.SMTP.Client.SmtpClientEx smtpClient = new LumiSoft.Net.SMTP.Client.SmtpClientEx(); smtpClient.Connect(destinationIp, 25); smtpClient.Ehlo(destinationHostname); smtpClient.SetSender(EmlFile.GetSender(mimemessage), messageStream.Length); smtpClient.AddRecipient(EmlFile.GetRecepient(file)); smtpClient.SendMessage(messageStream); smtpClient.Disconnect(); messageStream.Close(); result = true; } catch (Exception ex) { throw new Exception("Forwarding failed", ex); } return(result); }
/// <summary> /// Handles the file system watcher created event. /// </summary> private void Watcher_Created(object sender, FileSystemEventArgs e) { FileInfo file = new FileInfo(e.FullPath); if (EmlFile.IsUnsentMail(file)) { this.OnNewEmail(file); } }
private static String GetRecepient(FileInfo file) { String result = "<{0}@{1}>"; result = String.Format( result, EmlFile.GetRecepientMailbox(file), EmlFile.GetRecepientDomain(file)); return(result); }
/// <summary> /// Gets all eml-files from the mailfolder that are marked as unsent. /// </summary> /// <param name="start">The start.</param> /// <param name="mails">The mails.</param> private void GetUnblockedAndUnsentEmlFilesInDirectory(DirectoryInfo start, ref List <FileInfo> mails) { foreach (DirectoryInfo current in start.GetDirectories()) { this.GetUnblockedAndUnsentEmlFilesInDirectory(current, ref mails); } foreach (FileInfo current in start.GetFiles()) { if ( EmlFile.IsUnblocked(current) && EmlFile.IsUnsentMail(current) && ForwardingConfiguration.IsConfiguredForForwarding(EmlFile.GetRecepientDomain(current))) { mails.Add(current); } } }
/// <summary> /// Forwards all files in the files parameter to the configured destination. /// </summary> /// <param name="files">The files.</param> private void ForwardMails(List <FileInfo> files) { foreach (FileInfo current in files) { try { String ip = ForwardingConfiguration.IpOfDomain(EmlFile.GetRecepientDomain(current)); String host = ForwardingConfiguration.HostnameOfDomain(EmlFile.GetRecepientDomain(current)); if (EmlFile.Forward(current, ip, host)) { EmlFile.MarkAsSent(current); } } catch (Exception ex) { Tracing.Exception(ex); } } }