我写了个利用TcpClient及SMTP协议发送邮件的程序,
程序运行没有问题,服务器的应答也很正确,如下:
连接应答: 220 Coremail SMTP(Anti Spam) System (163com[20050206])
EHLO 应答:250-smtp11
250-PIPELINING
250-AUTH LOGIN PLAIN NTLM
250-AUTH=LOGIN PLAIN NTLM
250 8BITMIME
AUTH LOGIN 应答:334 VXNlcm5hbWU6
username 应答:334 UGFzc3dvcmQ6
password 应答:235 Authentication successful
MAIL FROM 应答:250 Ok
RCPT TO 应答:250 Ok
DATA 应答:354 Please start mail input.
信已经发送完毕,服务器应答:250 Mail queued for delivery.可是我确无法收到这个邮件,请问各位大侠 是什么原因,我用的是163.com的SMTP
主要代码如下:
private void button5_Click(object sender, System.EventArgs e)
{
string username=Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(this.textBox6.Text.Trim()));
string password=Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(this.textBox7.Text.Trim()));
string HostName=Dns.GetHostName();
this.WriteToNetStream(ref stream,"EHLO "+HostName);
string come=this.ReadFromNetStream(ref stream);
this.richTextBox1.AppendText("EHLO 应答:"+come+"\r\n");
this.WriteToNetStream(ref stream,"AUTH LOGIN");
come=this.ReadFromNetStream(ref stream);
this.richTextBox1.AppendText("AUTH LOGIN 应答:"+come+"\r\n"); this.WriteToNetStream(ref stream,username);
come=this.ReadFromNetStream(ref stream);
this.richTextBox1.AppendText("username 应答:"+come+"\r\n"); this.WriteToNetStream(ref stream,password);
come=this.ReadFromNetStream(ref stream);
this.richTextBox1.AppendText("password 应答:"+come+"\r\n");
string check=this.checkForError(come,"235"); this.WriteToNetStream(ref stream,"MAIL FROM:<"+this.textBox4.Text+">");
come=this.ReadFromNetStream(ref stream);
this.richTextBox1.AppendText("MAIL FROM 应答:"+come+"\r\n"); this.WriteToNetStream(ref stream,"RCPT TO:<"+this.textBox5.Text+">");
come=this.ReadFromNetStream(ref stream);
this.richTextBox1.AppendText("RCPT TO 应答:"+come+"\r\n"); this.WriteToNetStream(ref stream,"DATA");
come=this.ReadFromNetStream(ref stream);
this.richTextBox1.AppendText("DATA 应答:"+come+"\r\n"); this.sendMail(ref stream,"Subject: "+this.textBox3.Text+"\r\n"+this.richTextBox2.Text+"\r\n.\r\n");
come=this.ReadFromNetStream(ref stream);
this.richTextBox1.AppendText("信已经发送完毕,服务器应答:"+come+"\r\n");
check=this.checkForError(come,"250");
}
//以下是用到的一些自定义的函数
                  private string ReadFromNetStream(ref NetworkStream stream)
{
byte[] bb=new byte[512];
stream.Read(bb,0,bb.Length);
string read=System.Text.Encoding.Default.GetString(bb);
return read;
} private void WriteToNetStream(ref NetworkStream stream,string Command)
{
string strToSend=Command+"\r\n";
byte[] arrayToSend=System.Text.Encoding.Default.GetBytes(strToSend.ToCharArray());
stream.Write(arrayToSend,0,arrayToSend.Length);
} private void sendMail(ref NetworkStream stream,string massage)
{
byte[] arrayToSend=System.Text.Encoding.Default.GetBytes(massage.ToCharArray());
stream.Write(arrayToSend,0,arrayToSend.Length);
} private string checkForError(string strMassage,string check)
{
if(strMassage.IndexOf(check)==-1)
{
return "err";
}
else
{
return "correct";
}
}

解决方案 »

  1.   

    我是在自己的机器上发的,不过我在程序中使用的是163的SMTP服务器呀,服务器给的回复是在帖子上已经写明,没有报错,可就是收不到。
     但如果用jmail,就可以发送成功,不知道为什么。
      

  2.   

    将你的程序的
    this.sendMail(ref stream,"Subject: "+this.textBox3.Text+"\r\n"+this.richTextBox2.Text+"\r\n.\r\n");
    改为下面代码:
    string CRLF="\r\n";
    string message="Subject:"+this.textBox3.Text+CRLF; 
    string encon="GB2312"
    message+="X-mailer:"+this.textBox3.Text+CRLF; 
    message+="MIME-Version:1.0"+CRLF; 
    message+="Content-Type:text/plain;"+CRLF+" ".PadRight(8,' ')+"charset=\""+ encon+"\""+CRLF; 
    message+="Content-Transfer-Encoding:base64"+CRLF+CRLF;
    message+=Convert.ToBase64String(this.richTextBox2.Text,0,this.richTextBox2.Text.Length)+CRLF+CRLF+CRLF+"."+CRLF;而且在最后加上:
    WriteToNetStream(ref stream,"QUIT");
    come=this.ReadFromNetStream(ref stream);
    this.richTextBox1.AppendText("QUIT 应答:"+come+"\r\n");
    就ok了
      

  3.   

    我用jmail,简单易用些。没有问题的
      

  4.   

    这么做你累不累啊。有封装好了的MAILMESSAGE不用。