记得原来有人问过用socket实现smtp,这是我的一部分代码 - 中国WEB开发者网络 (http://www.webasp.net) -- 技术教程 (http://www.webasp.net/article/) --- 记得原来有人问过用socket实现smtp,这是我的一部分代码 (http://www.webasp.net/article/5/4013.htm) |
| -- 作者:未知 -- 发布日期: 2003-07-12 |
| namespace mySmtp { using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Collections; interface ITransport { void setHost(String smtpHost); String getHost(); void setPort(int smtpPort); int getPort(); void sendMail(MailMessage msg); } public class Smtp : ITransport { private String smtpHost; private int smtpPort; public Smtp() { //smtpHost = "127.0.0.1"; //smtpPort = 25; } public Smtp(String host, int port) { smtpHost = host; smtpPort = port; } public void setHost(String host) { smtpHost = host; } public String getHost() { return smtpHost; } public void setPort(int port) { smtpPort = port; } public int getPort() { return smtpPort; } public void sendMail(MailMessage msg) { TcpClient tcpc = new TcpClient(); try { if (smtpHost != null && smtpPort != 0) { tcpc.Connect(smtpHost, smtpPort); tcpc.ReceiveTimeout= 20; tcpc.SendTimeout = 20; } else { throw new SmtpException("Cannot use sendMail() method without specifying target host and port"); } NetworkStream nwstream = tcpc.GetStream(); checkForError(ReadFromStream(ref nwstream), SmtpConstants.HELO_REPLY); WriteToStream(ref nwstream, "HELO " + smtpHost); checkForError(ReadFromStream(ref nwstream), SmtpConstants.OK); WriteToStream(ref nwstream, "MAIL FROM: <" + msg.getFrom().getAddress() + ">"); checkForError(ReadFromStream(ref nwstream), SmtpConstants.OK); sendRecipientList(ref nwstream, msg.getTo()); sendRecipientList(ref nwstream, msg.getCC()); sendRecipientList(ref nwstream, msg.getBCC()); WriteToStream(ref nwstream, "DATA"); checkForError(ReadFromStream(ref nwstream), SmtpConstants.START_INPUT); if (msg.getReplyTo() != null) { WriteToStream(ref nwstream, "Reply-To: " + msg.getReplyTo().getPersonal() + "<" + msg.getReplyTo().getAddress() + ">;"); } if (msg.getFrom() != null) { WriteToStream(ref nwstream, "From: " + msg.getFrom().getPersonal() + "<" + msg.getFrom().getAddress() + ">;"); } WriteToStream(ref nwstream, "Subject: " + msg.getSubject()); WriteToStream(ref nwstream, "To: " + createAddressList(msg.getTo())); WriteToStream(ref nwstream, "CC: " + createAddressList(msg.getCC())); if (msg.getPriority() != null) { WriteToStream(ref nwstream, "X-Priority: " + msg.getPriority()); } //WriteToStream(ref nwstream, "Return-Path:" + msg.getFrom().getAddress()); WriteToStream(ref nwstream, msg.getBody()); WriteToStream(ref nwstream, "\r\n.\r\n"); checkForError(ReadFromStream(ref nwstream), SmtpConstants.OK); /* WriteToStream(ref nwstream, "QUIT"); checkForError(ReadFromStream(ref nwstream), SmtpConstants.UNKNOWN); */ } catch(SocketException e) { throw new SmtpException("Cannot connect to specified smtp host(" + smtpHost + ":" + smtpPort + ").", e); } finally { tcpc.Close(); } } private String createAddressList(ArrayList msgList) { StringBuilder sb = new StringBuilder(); for (IEnumerator i = msgList.GetEnumerator(); i.MoveNext();) { Address a = (Address)i.Current; string address = a.getPersonal() + "<" + a.getAddress() + ">;"; sb.Append(a.getPersonal() + "<" + a.getAddress() + ">;"); } return sb.ToString(); } private void sendRecipientList(ref NetworkStream nwstream, ArrayList recipients) { for (IEnumerator i = recipients.GetEnumerator();i.MoveNext();) { Address recipient = (Address)i.Current; String address = recipient.getAddress(); // potential 501 error (not valid sender) below: WriteToStream(ref nwstream, "RCPT TO: <" + address + ">"); checkForError(ReadFromStream(ref nwstream), SmtpConstants.OK); } } private bool checkMailMessage(MailMessage message) { String returnMessage = "Mail Message is missing "; if (message.getTo() == null) throw new SmtpException(returnMessage + "'To:' field"); else if(message.getFrom() == null) throw new SmtpException(returnMessage + "'From:' field"); else if(message.getSubject() == null) throw new SmtpException(returnMessage + "Subject"); else if(message.getBody() == null) throw new SmtpException(returnMessage + "Body"); */ else return true; } private void WriteToStream(ref NetworkStream nw, string line) { string stringToSend = line + "\r\n"; Byte[] arrToSend = Encoding.ASCII.GetBytes(stringToSend.ToCharArray()); nw.Write(arrToSend, 0, arrToSend.Length); } private String ReadFromStream(ref NetworkStream nw) { byte[] readBuffer = new byte[512]; int length = nw.Read(readBuffer, 0, readBuffer.Length); String returnMsg = Encoding.ASCII.GetString(readBuffer, 0, length); return returnMsg; } /** * * Checks stream returned from SMTP server for success code * If the success code is not present it will throw an error. * */ private void checkForError(String s, String successCode) { if (s.IndexOf(successCode) == -1) throw new SmtpException("ERROR - Expecting " + successCode + ". Recieved: " + s); } } } |
| webasp.net |