繁体中文
设为首页
加入收藏
当前位置:.Net技术首页 >> 远程及网络应用 >> 记得原来有人问过用socket实现smtp,这是我的一部分代码

记得原来有人问过用socket实现smtp,这是我的一部分代码

2004-10-01 08:26:10  作者:  来源:互联网  浏览次数:33  文字大小:【】【】【
简介:namespace mySmtp { using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Collections;     interface ITransport     {...

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);

}

}

}

责任编辑:admin
相关文章