string[] SenderAdder=new String[1];
string[] ServerAdder=new String[1];
string[] FJAdder=new String[1];
SenderAdder[0]="[email protected]";
//            ServerAdder[0]="http://mail.yankee.com.cn/exchange/";
FJAdder[0]="";
MailSender MS=new MailSender();
// MS.IsHtml=true;
MS.HtmlBody="dsfdsafdsafdsa";
MS.Server="miss1";  //邮件服务器名
MS.Password="111";
MS.UserName="caolh";
MS.Subject="sdfdsfds";
MS.From="[email protected]";发件人地址
MS.To=SenderAdder;收件人地址
MS.Port=25;
MS.send();  (注:调用SendMail()的方法;)
private void SendMail() 

// 创建TcpClient对象, 并建立连接 
TcpClient tcpNewClient = null; 
try 

tcpNewClient = new TcpClient (m_strServer, m_iPort); 

catch (Exception) 

throw new Exception ("无法连接服务器"); 
}  ReadString (tcpNewClient.GetStream());//获取连接信息  // 开始进行服务器认证 
// 如果状态码是250则表示操作成功 
if (!Command (tcpNewClient.GetStream(), "EHLO Localhost", "250")) 

tcpNewClient.Close(); 
throw new Exception ("登陆阶段失败"); 
}  if (m_strUserName != "") 

// 需要身份验证 
if (!Command (tcpNewClient.GetStream(), "AUTH LOGIN", "334")) 

tcpNewClient.Close(); 
throw new Exception ("身份验证阶段失败"); 
}  // 此处将username转换为Base64码 
string nameB64 = ToBase64 (m_strUserName); 
if (!Command (tcpNewClient.GetStream(), nameB64, "334")) 

tcpNewClient.Close(); 
throw new Exception ("身份验证阶段失败"); 
}  // 此处将m_strPassWord转换为Base64码 
string passB64 = ToBase64 (m_strPassWord); 
if (!Command (tcpNewClient.GetStream(), passB64, "235")) 

tcpNewClient.Close(); 
throw new Exception ("身份验证阶段失败"); 


// 准备发送 
WriteString (tcpNewClient.GetStream(), "mail From: " + m_strFrom); 
for(int i=0;i<m_strTo.Length;i++) 

WriteString (tcpNewClient.GetStream(), "rcpt m_strTo: " + m_strTo[i]); 

WriteString (tcpNewClient.GetStream(), "data");  // 发送邮件头 
WriteString (tcpNewClient.GetStream(), "Date: " + DateTime.Now); // 时间 
WriteString (tcpNewClient.GetStream(), "From: " + m_strFromName + "<" + m_strFrom + ">"); // 发件人 
WriteString (tcpNewClient.GetStream(), "Subject: " + m_strSubject); // 主题 
WriteString (tcpNewClient.GetStream(), "To:" + m_strToName + "<" + m_strTo + ">"); // 收件人  //邮件格式 
WriteString (tcpNewClient.GetStream(), "Content-Type: multipart/mixed; boundary=\"unique-boundary-1\""); 
WriteString (tcpNewClient.GetStream(), "Reply-To:" + m_strFrom); // 回复地址 
WriteString (tcpNewClient.GetStream(), "X-Priority:" + m_iPriority); // 优先级 
WriteString (tcpNewClient.GetStream(), "MIME-Version:1.0"); // MIME版本  // 数据ID,随意 
// WriteString (tcpNewClient.GetStream(), "Message-Id: " + DateTime.Now.ToFileTime() + "@security.com"); 
WriteString (tcpNewClient.GetStream(), "Content-Transfer-Encoding:" + m_strEncoding); // 内容编码 
WriteString (tcpNewClient.GetStream(), "X-Mailer:JcPersonal.Utility.MailSender"); // 邮件发送者 
WriteString (tcpNewClient.GetStream(), "");  WriteString (tcpNewClient.GetStream(), ToBase64 ("This is a multi-part message in MIME format.")); 
WriteString (tcpNewClient.GetStream(), "");  // 从此处开始进行分隔输入 
WriteString (tcpNewClient.GetStream(), "--unique-boundary-1");  // 在此处定义第二个分隔符 
WriteString (tcpNewClient.GetStream(), "Content-Type: multipart/alternative;Boundary=\"unique-boundary-2\""); 
WriteString (tcpNewClient.GetStream(), "");  if(!m_bIsHtml) 

// 文本信息 
WriteString (tcpNewClient.GetStream(), "--unique-boundary-2"); 
WriteString (tcpNewClient.GetStream(), "Content-Type: text/plain;charset=" + m_strLanguageEncoding); 
WriteString (tcpNewClient.GetStream(), "Content-Transfer-Encoding:" + m_strEncoding); 
WriteString (tcpNewClient.GetStream(), ""); 
WriteString (tcpNewClient.GetStream(), m_strTxtBody); 
WriteString (tcpNewClient.GetStream(), "");//一个部分写完之后就写如空信息,分段 
WriteString (tcpNewClient.GetStream(), "--unique-boundary-2--");//分隔符的结束符号,尾巴后面多了-- 
WriteString (tcpNewClient.GetStream(), ""); 

else 

//html信息 
WriteString (tcpNewClient.GetStream(), "Content-Type: multipart/mixed"); 
WriteString (tcpNewClient.GetStream(), "--unique-boundary-2"); 
WriteString (tcpNewClient.GetStream(), "Content-Type: text/html;charset=" + m_strLanguageEncoding); 
WriteString (tcpNewClient.GetStream(), "Content-Transfer-Encoding:" + m_strEncoding); 
WriteString (tcpNewClient.GetStream(), ""); 
WriteString (tcpNewClient.GetStream(), m_strHtmlBody); 
WriteString (tcpNewClient.GetStream(), ""); 
WriteString (tcpNewClient.GetStream(), "--unique-boundary-2--");//分隔符的结束符号,尾巴后面多了-- 
WriteString (tcpNewClient.GetStream(), ""); 
}  // 发送附件 
// 对文件列表做循环 
for (int i = 0; i < m_alAttachments.Count; i++) 

WriteString (tcpNewClient.GetStream(), "--unique-boundary-1"); // 邮件内容分隔符 
WriteString (tcpNewClient.GetStream(), "Content-Type: application/octet-stream;name=\"" + ((AttachmentInfo)m_alAttachments[i]).FileName + "\""); // 文件格式 
WriteString (tcpNewClient.GetStream(), "Content-Transfer-Encoding: base64"); // 内容的编码 
WriteString (tcpNewClient.GetStream(), "Content-Disposition:attachment;filename=\"" + ((AttachmentInfo)m_alAttachments[i]).FileName + "\""); // 文件名 
WriteString (tcpNewClient.GetStream(), ""); 
WriteString (tcpNewClient.GetStream(), ((AttachmentInfo)m_alAttachments[i]).Bytes); // 写入文件的内容 
WriteString (tcpNewClient.GetStream(), ""); 
}  Command (tcpNewClient.GetStream(), ".", "250"); // 最后写完了,输入"."  // 关闭连接 
tcpNewClient.Close (); 
}

解决方案 »

  1.   

    SMTP規範中規定郵件是以“<CRLF>.<CRLF>”為結束符,所以你最後應該輸入 "." & vbCRLF ,這是VB的形式,光一個“.”並不表示郵件結束,然後你關閉了連接,所以等於沒有寫完郵件就退出了,沒收到也是當然的事情了。
      

  2.   

    另外提一下,SMTP命令的返回值,只要判斷三位數字的第一位就可以了,具體含義如下:
    The first digital of the three digitals in response message indicates:
    1: command accepted, waiting for confirm
    2: command executed
    3: command accepted, waiting for more information
    4: command refused
    5: command failed
      

  3.   

    这种写法要在服务器装SMTP服务吗??,如果本机不是服邮件服务器,又如何设置呢
      

  4.   

    服務器上當然要安裝SMTP服務,類似Microsoft Exchange之類的。
    MS.Server屬性用來指明服務器IP地址或者域名。你自己寫的代碼怎麽這個都不知道?抄的?