helo <domain>后mail from:<address>
报错,提示要认证用户。
请问谁知道怎么认证?
是哪个命令?我翻了rfc821也没有找到。大家帮帮忙。

解决方案 »

  1.   

    分太少了。哈哈俣。拿回去用吧。巨好使。public void SmtpSend(out bool _Succeed)
    {
    _Succeed = false;
    // 创建TcpClient对象, 并建立连接
    TcpClient tcp = null;
    try{tcp = new TcpClient(_EmailParameters.server,EmailParameters.port);}
    catch{return;} if(ReadString (tcp.GetStream()).Substring(0,3)!="220")//获取连接信息
    return;
    if (!Command (tcp.GetStream(), "EHLO Localhost", "250"))// 开始进行服务器认证
    return;
    if (!Command (tcp.GetStream(), "AUTH LOGIN", "334"))// 需要身份验证
    return;
    if (!Command (tcp.GetStream(), ToBase64 (_EmailParameters.username), "334"))// 此处将username转换为Base64码
    return;
    if (!Command (tcp.GetStream(), ToBase64 (_EmailParameters.password), "235"))// 此处将password转换为Base64码
    return;
    // 准备发送
    WriteString (tcp.GetStream(), "mail From: " + _EmailParameters.from);
    WriteString (tcp.GetStream(), "rcpt to: " + _EmailParameters.to);
    WriteString (tcp.GetStream(), "data");
    // 发送邮件头
    WriteString (tcp.GetStream(), "Date: " + DateTime.Now); // 时间
    WriteString (tcp.GetStream(), "From: " + _EmailParameters.fromname + "<" + _EmailParameters.from + ">"); // 发件人
    WriteString (tcp.GetStream(), "Subject: " + _EmailParameters.subject); // 主题
    WriteString (tcp.GetStream(), "To:" + _EmailParameters.toname + "<" + _EmailParameters.to + ">"); // 收件人
    //邮件格式 
    WriteString (tcp.GetStream(), "Reply-To:" + _EmailParameters.from); // 回复地址
    WriteString (tcp.GetStream(), "X-Priority:" + EmailParameters.priority); // 优先级
    WriteString (tcp.GetStream(), "KoEnemy-Version:1.0"); // MIME版本
    //html信息
    WriteString (tcp.GetStream(), "Content-Type: text/html;charset=" + EmailParameters.languageencoding); 
    WriteString (tcp.GetStream(), "Content-Transfer-Encoding:" + EmailParameters.encoding); 
    WriteString (tcp.GetStream(), ""); 
    WriteString (tcp.GetStream(), ""); 
    WriteString (tcp.GetStream(), _EmailParameters.content); 
    WriteString (tcp.GetStream(), ""); 
    if(!Command (tcp.GetStream(), ".", "250"))
    return;
    // 关闭连接
    tcp.Close ();
    _Succeed = true;
    }
    /// <summary>
    /// 向流中写入字符
    protected void WriteString (NetworkStream netStream, string str)
    {
    str = str + "\r\n"; // 加入换行符
    byte[] bWrite = Encoding.GetEncoding(EmailParameters.languageencoding).GetBytes(str.ToCharArray());
    try{netStream.Write(bWrite,0,bWrite.Length);}
    catch{}
    } /// <summary>
    /// 从流中读取字符
    protected string ReadString (NetworkStream netStream)
    {
    string sp = null;
    byte[] by = new byte[1024];
    int size = netStream.Read(by,0,by.Length);// 读取数据流
    if (size > 0)
    sp = Encoding.Default.GetString(by);// 转化为String
    return sp;
    } /// <summary>
    /// 发出命令并判断返回信息是否正确
    protected bool Command (NetworkStream netStream, string command, string state)
    {
    string sp=null;
    bool success=false;
    try
    {
    WriteString (netStream, command);// 写入命令
    sp = ReadString (netStream);// 接受返回信息
    if (sp.IndexOf(state) != -1)// 判断状态码是否正确
    success=true;
    }
    catch{}
    return success;
    }
    /// <summary>
    /// 字符串编码为Base64
    protected string ToBase64 (string str)
    {
    try
    {
    byte[] by = Encoding.Default.GetBytes (str.ToCharArray());
    str = Convert.ToBase64String (by);
    }
    catch{}
    return str;
    }
    }
      

  2.   

    多谢,smtp得字符串编码必须是base64吗?
    AUTH LOGIN
    这个是从哪里找来得?怎么我在smtp协议上没找到呢?
    还有我输入 HELO时和你输入ELHO时效果应该是一样的啊,smtp服务器回复的却不一样?重点
    AUTH LOGIN  哪里找到的?
      

  3.   

    AUTH LOGIN这个从哪里看来得?
    我翻了Rfc821 smtp协议。也没有找到。
    是不是有什么扩展得协议?
    还有为什么 HELO  和 EHLO  得倒服务器的回馈不一样的?