public string SendFileToFtp(CustomerDetails customer, string filename) { string hostIP = customer.FTPURL; string userName = customer.FTPUserName; string passWord = customer.FTPPassword; string status = string.Empty; string fileNameOnly = GetFileName(filename); customer.CustomerSpecificFileName = RenameReadyToSendFiles.RenameFiles(customer, fileNameOnly); try { FTPClient ftpClient = new FTPClient(); status = "Assign FTP credentials " + hostIP; ftpClient.SetUserNameAndPassword(hostIP, userName, passWord); status = "FTP credentials are assigned " + hostIP; if (!ftpClient.CheckDirectoryExists()) { status = "FTP directory not Exists " + hostIP; if (!ftpClient.CreateHostDirectory()) { //even if above 2 checks failed and OverRidePreFtpChecks = true proceed to upload. if (!customer.OverRidePreFTPChecks) { status = "FTP could not Create Host Directory " + hostIP; return(status); } } } status = "Path Success " + hostIP; if (ftpClient.CheckIfFileExists(customer.CustomerSpecificFileName)) { status = "File exists " + hostIP + " file name " + customer.CustomerSpecificFileName; return(status); } status = ftpClient.Upload(customer.CustomerSpecificFileName, filename); if (String.IsNullOrEmpty(status)) { status = "File sent to FTP"; } } catch (Exception ex) { Logger.WriteException(ex); status = status + ex.Message; } return(status); }
private static void Main(string[] args) { // Read the files from folder string connString = ConfigurationManager.ConnectionStrings["eLimsMilkM2MReports"].ConnectionString; string fromMailAddress = ConfigurationManager.AppSettings.Get("FromEmail"); string mailQueue = ConfigurationManager.AppSettings.Get("EmailQueue"); string SMTPServer = ConfigurationManager.AppSettings.Get("SMTPServer"); int Port = int.Parse(ConfigurationManager.AppSettings.Get("SMTPPortNumber")); string UserName = ConfigurationManager.AppSettings.Get("SMTPUserName"); string Password = ConfigurationManager.AppSettings.Get("SMTPPassword"); string mailSentFolders = ConfigurationManager.AppSettings.Get("MailSent"); string logFilePath = ConfigurationManager.AppSettings.Get("LogPath"); string todaysDate = DateTime.Now.ToString("yyyyMMdd"); string LogFile = string.Empty; string input = "1"; if (args != null && args.Any()) { input = args[0]; } if (input == "0") { try { todaysDate = todaysDate + ".txt"; LogFile = Path.Combine(logFilePath, todaysDate); Logger.WriteLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss fff")); CustomerSendFiles obj = new CustomerSendFiles(); // get Customer details from Db // // List of Customers TO Sen Files WriteLine("Read Customer Files", LogFile); List <CustomerFiles> cusromerFileDetails = obj.ReadCustomerFiles(); WriteLine("Read Customer Files completed", LogFile); if (cusromerFileDetails.Count <= 0) { WriteLine("No files to process", LogFile); return; } WriteLine("Get Customer Detailses", LogFile); List <CustomerDetails> customerDetailses = obj.GetCustomerDetailses(cusromerFileDetails, connString); WriteLine("Get Customer Detailses Completed", LogFile); if (customerDetailses.Count <= 0) { WriteLine("No Customer to process", LogFile); return; } // Process Each File foreach (CustomerFiles oneFile in cusromerFileDetails) { //get Customer delivery method WriteLine("Processing File " + oneFile.FilePath, LogFile); CustomerDetails oneCustomer = customerDetailses.FirstOrDefault( c => String.Equals(c.CustomerCode, oneFile.CustomerCode, StringComparison.CurrentCultureIgnoreCase)); if (oneCustomer == null) { WriteLine("NO Customer for this file " + oneFile.FilePath, LogFile); continue; } WriteLine("Processing Customer " + oneCustomer.CustomerCode + " for file " + oneFile.FilePath, LogFile); switch (oneCustomer.Mode.ToUpper()) { case "EMAIL": { WriteLine( "Processing Customer to Send mail " + oneCustomer.CustomerCode + " for file " + oneFile, LogFile); //Write to transaction log //-------------------------------------------------------------------------------------------------------------------------------------------- using ( TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) { SendEmails mailToSend = new SendEmails(); // Write to DB WriteLine("Write To DB Transaction table " + oneCustomer.CustomerCode, LogFile); oneCustomer.CustomerSpecificFileName = RenameReadyToSendFiles.RenameFiles( oneCustomer, SendEmails.GetFileName(oneFile.FilePath)); bool isinserted = mailToSend.WriteToTransaction(oneCustomer, connString, oneFile.FilePath, "Queued"); if (isinserted) { WriteLine("Send To Queue " + oneCustomer.CustomerCode, LogFile); bool mailSent = mailToSend.WriteMailMessageToQueue(oneCustomer, oneFile.FilePath, fromMailAddress, mailQueue); if (mailSent) { // Move file to Sent folder WriteLine( "Move file to sent folder from " + oneFile.FilePath + " to " + mailSentFolders, LogFile); MoveFile(oneFile.FilePath, mailSentFolders); scope.Complete(); } else { WriteLine( "Error in move file to sent folder from " + oneFile.FilePath + " to " + mailSentFolders, LogFile); } } } //-------------------------------------------------------------------------------------------------------------------------------------------- break; } case "FTP": { //Write to transaction log //-------------------------------------------------------------------------------------------------------------------------------------------- using ( TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) { SendEmails mailToSend = new SendEmails(); SendFtp sendToFtp = new SendFtp(); WriteLine( "Send TO FTP Customer " + oneCustomer.CustomerCode + " ftp: " + oneCustomer.FTPURL + " file: " + oneFile.FilePath, LogFile); string mailSent = sendToFtp.SendFileToFtp(oneCustomer, oneFile.FilePath); if (mailSent == "File sent to FTP") { WriteLine( "Send TO FTP Customer " + oneCustomer.CustomerCode + " ftp: " + oneCustomer.FTPURL + " file: " + oneFile.FilePath + " Status: " + mailSent, LogFile); // Write to DB WriteLine("Write To DB Transaction table " + oneCustomer.CustomerCode, LogFile); bool isinserted = mailToSend.WriteToTransaction(oneCustomer, connString, oneFile.FilePath, mailSent); // Move file to Sent folder WriteLine( "Move file to sent folder from " + oneFile.FilePath + " to " + mailSentFolders + " write to Db status " + isinserted, LogFile); MoveFile(oneFile.FilePath, mailSentFolders); } else { WriteLine( "Send TO FTP Customer " + oneCustomer.CustomerCode + " ftp: " + oneCustomer.FTPURL + " file: " + oneFile.FilePath + " Status: " + mailSent, LogFile); } scope.Complete(); } break; } default: break; } } } catch (Exception ex) { WriteLine("Send to Queue Error: " + ex.Message, LogFile); } finally { WriteLine( "---------------------------------------------------------------------------------------------------", LogFile); } } else { try { //as both if and else conditions runs in sequential based on the arg values we pass, better add a little delay so that we will not miss any queue items. Thread.Sleep(3000); todaysDate = todaysDate + "-1.txt"; LogFile = Path.Combine(logFilePath, todaysDate); WriteLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss fff"), LogFile); SendEmails mailToSend = new SendEmails(); bool queNotEmpty = true; do { string attachementFileName = string.Empty; queNotEmpty = mailToSend.SendQueueMails(mailQueue, SMTPServer, Port, UserName, Password, ref attachementFileName); if (queNotEmpty) { WriteLine("Sent file " + attachementFileName, LogFile); // Update the Report transaction for file sent mailToSend.UpdateMailSent(connString, attachementFileName); } else { WriteLine("No file to Sent ", LogFile); } } while (queNotEmpty); } catch (Exception ex) { WriteLine("Send to mail Error: " + ex.Message, LogFile); } finally { WriteLine( "---------------------------------------------------------------------------------------------------", LogFile); } } }