using System; using System.Text; using System.IO; using System.Net.Sockets; using System.Net; using System.Web.Mail; namespace SMTP { ////// provides methods to send email via smtp direct to mail server /// public class SmtpDirect { ////// Get / Set the name of the SMTP mail server /// public static string SmtpServer; private enum SMTPResponse: int { CONNECT_SUCCESS = 220, GENERIC_SUCCESS = 250, DATA_SUCCESS = 354, QUIT_SUCCESS = 221 } public static bool Send(MailMessage message) { IPHostEntry IPhst = Dns.Resolve(SmtpServer); IPEndPoint endPt = new IPEndPoint(IPhst.AddressList[0], 25); Socket s= new Socket(endPt.AddressFamily, SocketType.Stream,ProtocolType.Tcp); s.Connect(endPt); if(!Check_Response(s, SMTPResponse.CONNECT_SUCCESS)) { s.Close(); return false; } Senddata(s, string.Format("HELO {0}\r\n", Dns.GetHostName() )); if(!Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) { s.Close(); return false; } Senddata(s, string.Format("MAIL From: {0}\r\n", message.From )); if(!Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) { s.Close(); return false; } string _To = message.To; string[] Tos= _To.Split(new char[] {';'}); foreach (string To in Tos) { Senddata(s, string.Format("RCPT TO: {0}\r\n", To)); if(!Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) { s.Close(); return false; } } if(message.Cc!=null) { Tos= message.Cc.Split(new char[] {';'}); foreach (string To in Tos) { Senddata(s, string.Format("RCPT TO: {0}\r\n", To)); if(!Check_Response(s, SMTPResponse.GENERIC_SUCCESS)) { s.Close(); return false; } } } StringBuilder Header=new StringBuilder(); Header.Append("From: " + message.From + "\r\n"); Tos= message.To.Split(new char[] {';'}); Header.Append("To: "); for( int i=0; i< Tos.Length; i++) { Header.Append( i > 0 ? "," : "" ); Header.Append(Tos[i]); } Header.Append("\r\n"); if(message.Cc!=null) { Tos= message.Cc.Split(new char[] {';'}); Header.Append("Cc: "); for( int i=0; i< Tos.Length; i++) { Header.Append( i > 0 ? "," : "" ); Header.Append(Tos[i]); } Header.Append("\r\n"); } Header.Append( "Date: " ); Header.Append(DateTime.Now.ToString("ddd, d M y H:m:s z" )); Header.Append("\r\n"); Header.Append("Subject: " + message.Subject+ "\r\n"); Header.Append( "X-Mailer: SMTPDirect v1\r\n" ); string MsgBody = message.Body; if(!MsgBody.EndsWith("\r\n")) MsgBody+="\r\n"; if(message.Attachments.Count>0) { Header.Append( "MIME-Version: 1.0\r\n" ); Header.Append( "Content-Type: multipart/mixed; boundary=unique-boundary-1\r\n" ); Header.Append("\r\n"); Header.Append( "This is a multi-part message in MIME format.\r\n" ); StringBuilder sb = new StringBuilder(); sb.Append("--unique-boundary-1\r\n"); sb.Append("Content-Type: text/plain\r\n"); sb.Append("Content-Transfer-Encoding: 7Bit\r\n"); sb.Append("\r\n"); sb.Append(MsgBody + "\r\n"); sb.Append("\r\n"); foreach(object o in message.Attachments) { MailAttachment a = o as MailAttachment; byte[] binaryData; if(a!=null) { FileInfo f = new FileInfo(a.Filename); sb.Append("--unique-boundary-1\r\n"); sb.Append("Content-Type: application/octet-stream; file=" + f.Name + "\r\n"); sb.Append("Content-Transfer-Encoding: base64\r\n"); sb.Append("Content-Disposition: attachment; filename=" + f.Name + "\r\n"); sb.Append("\r\n"); FileStream fs = f.OpenRead(); binaryData = new Byte[fs.Length]; long bytesRead = fs.Read(binaryData, 0, (int)fs.Length); fs.Close(); string base64String = System.Convert.ToBase64String(binaryData, 0,binaryData.Length); for(int i=0; i< base64String.Length ; ) { int nextchunk=100; if(base64String.Length - (i + nextchunk ) <0) nextchunk = base64String.Length -i; sb.Append(base64String.Substring(i, nextchunk)); sb.Append("\r\n"); i+=nextchunk; } sb.Append("\r\n"); } } MsgBody=sb.ToString(); } Senddata(s, ("DATA\r\n")); if(!Check_Response(s, SMTPResponse.DATA_SUCCESS)) { s.Close(); return false; } Header.Append( "\r\n" ); Header.Append( MsgBody ); Header.Append( ".\r\n" ); Header.Append( "\r\n" ); Header.Append( "\r\n" ); Senddata(s, Header.ToString()); if(!Check_Response(s, SMTPResponse.GENERIC_SUCCESS )) { s.Close(); return false; } Senddata(s, "QUIT\r\n"); Check_Response(s, SMTPResponse.QUIT_SUCCESS ); s.Close(); return true; } private static void Senddata(Socket s, string msg) { byte[] _msg = Encoding.ASCII.GetBytes(msg); s.Send(_msg , 0, _msg .Length, SocketFlags.None); } private static bool Check_Response(Socket s, SMTPResponse response_expected ) { string sResponse; int response; byte[] bytes = new byte[1024]; while (s.Available==0) { System.Threading.Thread.Sleep(100); } s.Receive(bytes, 0, s.Available, SocketFlags.None); sResponse = Encoding.ASCII.GetString(bytes); response = Convert.ToInt32(sResponse.Substring(0,3)); if(response != (int)response_expected) return false; return true; } } }