private void SendRetryMail() { try { if(!m_RelayTable.Contains(Thread.CurrentThread)){ SCore.WriteLog(m_pServer.m_SartUpPath + "mailServiceError.log","SendRetryMail: params missing"); return; } string messageFile = m_RelayTable[Thread.CurrentThread].ToString(); using(FileStream fs = File.Open(messageFile,FileMode.Open,FileAccess.ReadWrite)){ // Get relay info RelayInfo relayInf = new RelayInfo(fs,RelayUndelivered,RelayUndelWarning); string from = relayInf.From; if(from.Length == 0){ from = relayInf.To; } SMTP_Client smtpClnt = new SMTP_Client(); smtpClnt.UseSmartHost = UseSmartHost; smtpClnt.SmartHost = SmartHost; smtpClnt.DnsServers = new string[]{Dns1,Dns2}; if(smtpClnt.Send(new string[]{relayInf.To},from,fs)){ fs.Close(); // Message sended successfuly, may delete it File.Delete(messageFile); } // send failed else{ string error = smtpClnt.Errors[0].ErrorText; // If destination recipient is invalid or Undelivered Date Exceeded, try to return message to sender if(smtpClnt.Errors[0].ErrorType != SMTP_ErrorType.UnKnown || relayInf.IsUndeliveredDateExceeded){ MakeUndeliveredNotify(relayInf,error,fs); fs.Close(); // Undelivery note made, may delete message if(relayInf.From.Length > 0){ File.Delete(messageFile); } // There isn't return address, can't send undelivery note else if(StoreUndeliveredMessages){ // Check if Directory exists, if not Create if(!Directory.Exists(m_pServer.m_MailStorePath + "Undelivered\\")){ Directory.CreateDirectory(m_pServer.m_MailStorePath + "Undelivered\\"); } File.Move(messageFile,messageFile.Replace("Retry","Undelivered")); } } else if(relayInf.MustSendWarning){ MakeUndeliveredWarning(relayInf,error,fs); byte[] mustSendWarningBit = System.Text.Encoding.ASCII.GetBytes("1"); fs.Position = relayInf.WarningBitPos; fs.Write(mustSendWarningBit,0,mustSendWarningBit.Length); } } } } catch(Exception x){ if(!(x is IOException)){ Error.DumpError(x,new System.Diagnostics.StackTrace()); } } finally{ RemoveThread(Thread.CurrentThread); } }
private void RelayMessage() { try { if(!m_RelayTable.Contains(Thread.CurrentThread)){ SCore.WriteLog(m_pServer.m_SartUpPath + "mailServiceError.log","RelayMails: params missing"); return; } string messageFile = m_RelayTable[Thread.CurrentThread].ToString(); bool sendOk = false; using(FileStream fs = File.Open(messageFile,FileMode.Open,FileAccess.ReadWrite)){ // Get relay info RelayInfo relayInf = new RelayInfo(fs,1,1); string from = relayInf.From; if(from.Length == 0){ from = relayInf.To; } SMTP_Client smtpClnt = new SMTP_Client(); smtpClnt.UseSmartHost = UseSmartHost; smtpClnt.SmartHost = SmartHost; smtpClnt.DnsServers = new string[]{Dns1,Dns2}; sendOk = smtpClnt.Send(new string[]{relayInf.To},from,fs); } if(sendOk){ // Message sended successfuly, may delete it File.Delete(messageFile); } // send failed else{ // Move message to Retry folder string msgFileName = Path.GetFileName(messageFile); File.Move(messageFile,m_pServer.m_MailStorePath + "Retry\\" + msgFileName); } } catch(Exception x){ if(!(x is IOException)){ Error.DumpError(x,new System.Diagnostics.StackTrace()); } } finally{ RemoveThread(Thread.CurrentThread); } }