是不是其他信箱屏蔽了这个smtp或者,这个smtp有限制

解决方案 »

  1.   

    你应该换一个smtp服务器试一下
      

  2.   

    我试试先,不过我用jmail用的也是这个smtp服务器地址,可以发送到hotmail以及公司信箱的。但用socket来做就不可以了。
      

  3.   

    是的哦,我发给sina发送成功了。但为什么用同一个smtp服务器,jmail可以送到hotmail,但socket写的就不能发送到了呢。高手,高手,sos....
      

  4.   

    是不是hotmail不支持啊?163的可以~~
      

  5.   

    但我用jmail同样可以发送过去的阿。
      

  6.   

    看看你的 From 以及subject 是如何填寫的,或許被hotmail的垃圾郵件過濾器各刪掉了。
    MIME 頭的構成很重要。
      

  7.   

    mmp7uk能详细说说吗?MIME头构成
      

  8.   

    你有没有通过TELNET测试过呢?你根据协议通过TELNET一步一步测试,哪一步不行就是这步需修改,我以前做过。首先把协议用弄清了,然后测试,如果还不行,适当修改代码,比如编码问题或别的等等,祝你成功!
      

  9.   

    如用SmtpMail類,則簡單。但用socket自己寫,要自己構成MIME頭。
    那個很多資料,你可以找 RFC2045到2049自己看看,不光是電子郵件,其他協議
    的編程MIME也是很重要嘀。
      

  10.   

    我感觉跟你的smtp服务器有关系.
      

  11.   

    我觉得可能和smtp服务器或者MIME的构成有关。但我用JMAIL发送同样用的是smtp.163.com发送的邮件,可以发送出去的阿。我查查资料先/大家继续发表意见,hoho~~~~~~~~~
      

  12.   

    不是,局域网通过163的smtp服务器发到网外。
      

  13.   

    我以前也出现这样问题。只能发,服务器有时能收到。SMTP服务器要建在主机上,稳定性差。如果在局域内建服务器。只能发不能收,去租个花生壳,
      

  14.   

    我用jmail组件,也用的是smtp.163.com邮箱,应该是没有问题的,我向sohu,yahoo,126,163都可以发通的
      

  15.   

    这个我用过,但我用问题是自己用socket来写的,不能发送给hotmail,我测试过sohu,263,126,163基本的大公司邮箱都能发送成功。
      

  16.   

    很多小网站的SMTP服务器不是SMTP.163.COM,出于安全的考虑
      

  17.   

    public class SmtpEmail 

    private string enter="\r\n"; 
    /// <summary> 
    /// 设定语言代码,默认设定为GB2312,如不需要可设置为"" 
    /// </summary> 
    public string Charset="GB2312"; 
    /// <summary> 
    /// 发件人地址 
    /// </summary> 
    public string From=""; 
    /// <summary> 
    /// 发件人姓名 
    /// </summary> 
    public string FromName=""; 
    /// <summary> 
    /// 回复邮件地址 
    /// </summary> 
    //public string ReplyTo=""; 
    /// <summary> 
    /// 收件人姓名 
    /// </summary>    
    public string RecipientName=""; 
    /// <summary> 
    /// 收件人列表 
    /// </summary> 
    private Hashtable Recipient=new Hashtable(); 
    /// <summary> 
    /// 邮件服务器域名 
    /// </summary>    
    private string mailserver=""; 
    /// <summary> 
    /// 邮件服务器端口号 
    /// </summary>    
    private int mailserverport=25; 
    /// <summary> 
    /// SMTP认证时使用的用户名 
    /// </summary> 
    private string username=""; 
    /// <summary> 
    /// SMTP认证时使用的密码 
    /// </summary> 
    private string password=""; 
    /// <summary> 
    /// 是否需要SMTP验证 
    /// </summary>       
    private bool ESmtp=false; 
    /// <summary> 
    /// 是否Html邮件 
    /// </summary>       
    public bool Html=false; 
    /// <summary> 
    /// 邮件附件列表 
    /// </summary> 
    private System.Collections.ArrayList Attachments; 
    /// <summary> 
    /// 邮件发送优先级,可设置为"High","Normal","Low"或"1","3","5" 
    /// </summary> 
    private string priority="Normal"; 
    /// <summary> 
    /// 邮件主题 
    /// </summary>       
    public string Subject=""; 
    /// <summary> 
    /// 邮件正文 
    /// </summary>       
    public string Body=""; 
    /// <summary> 
    /// 收件人数量 
    /// </summary> 
    private int RecipientNum=0; 
    /// <summary> 
    /// 最多收件人数量 
    /// </summary> 
    private int recipientmaxnum=1; 
    /// <summary> 
    /// 密件收件人数量 
    /// </summary> 
    //private int RecipientBCCNum=0; 
    /// <summary> 
    /// 错误消息反馈 
    /// </summary> 
    private string errmsg; 
    /// <summary> 
    /// TcpClient对象,用于连接服务器 
    /// </summary>    
    private TcpClient tc; 
    /// <summary> 
    /// NetworkStream对象 
    /// </summary>    
    private NetworkStream ns; 
    /// <summary> 
    /// SMTP错误代码哈希表 
    /// </summary> 
    private Hashtable ErrCodeHT = new Hashtable(); 
    /// <summary> 
    /// SMTP正确代码哈希表 
    /// </summary> 
    private Hashtable RightCodeHT = new Hashtable(); 
    public SmtpEmail() 

    Attachments = new System.Collections.ArrayList(); 
    }       
    /// <summary> 
    /// 邮件服务器域名和验证信息 
    /// 形如:"user:paswww.server.com:25",也可省略次要信息。如"user:paswww.server.com"www.server.com" 
    /// </summary>    
    public string MailDomain 

    set 

    string maidomain=value.Trim(); 
    int tempint;  if(maidomain!="") 

    tempint=maidomain.IndexOf("@"); 
    if(tempint!=-1) 

    string str=maidomain.Substring(0,tempint); 
    MailServerUserName=str.Substring(0,str.IndexOf(":")); 
    MailServerPassWord=str.Substring(str.IndexOf(":")+1,str.Length-str.IndexOf(":")-1); 
    maidomain=maidomain.Substring(tempint+1,maidomain.Length-tempint-1); 
    }  tempint=maidomain.IndexOf(":"); 
    if(tempint!=-1) 

    mailserver=maidomain.Substring(0,tempint); 
    mailserverport=System.Convert.ToInt32(maidomain.Substring(tempint+1,maidomain.Length-tempint-1)); 

    else 

    mailserver=maidomain;  }                 
    }  } 
    }   /// <summary> 
    /// 邮件服务器端口号 
    /// </summary>    
    public int MailDomainPort 

    set 

    mailserverport=value; 

    }   /// <summary> 
    /// SMTP认证时使用的用户名 
    /// </summary> 
    public string MailServerUserName 

    set 

    if(value.Trim()!="") 

    username=value.Trim(); 
    ESmtp=true; 

    else 

    username=""; 
    ESmtp=false; 


    }  /// <summary> 
    /// SMTP认证时使用的密码 
    /// </summary> 
    public string MailServerPassWord 

    set 

    password=value; 

    }     /// <summary> 
    /// 邮件发送优先级,可设置为"High","Normal","Low"或"1","3","5" 
    /// </summary> 
    public string Priority 

    set 

    switch(value.ToLower()) 

    case "high": 
    priority="High"; 
    break;  case "1": 
    priority="High"; 
    break;  case "normal": 
    priority="Normal"; 
    break;  case "3": 
    priority="Normal"; 
    break;  case "low": 
    priority="Low"; 
    break;  case "5": 
    priority="Low"; 
    break;  default: 
    priority="Normal"; 
    break; 



    /// <summary> 
    /// 错误消息反馈 
    /// </summary>       
    public string ErrorMessage 

    get 

    return errmsg; 

    }   /// <summary> 
    /// 服务器交互记录 
    /// </summary> 
    private string logs="";  /// <summary> 
    /// 服务器交互记录,如发现本组件不能使用的SMTP服务器,请将出错时的Logs发给我([email protected]),我将尽快查明原因。 
    /// </summary> 
    public string Logs 

    get 

    return logs; 


             /// <summary> 
    /// SMTP回应代码哈希表 
    /// </summary> 
    private void SMTPCodeAdd() 

    ErrCodeHT.Add("500","邮箱地址错误"); 
    ErrCodeHT.Add("501","参数格式错误"); 
    ErrCodeHT.Add("502","命令不可实现"); 
    ErrCodeHT.Add("503","服务器需要SMTP验证"); 
    ErrCodeHT.Add("504","命令参数不可实现"); 
    ErrCodeHT.Add("421","服务未就绪,关闭传输信道"); 
    ErrCodeHT.Add("450","要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)"); 
    ErrCodeHT.Add("550","要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)"); 
    ErrCodeHT.Add("451","放弃要求的操作;处理过程中出错"); 
    ErrCodeHT.Add("551","用户非本地,请尝试<forward-path>"); 
    ErrCodeHT.Add("452","系统存储不足,要求的操作未执行"); 
    ErrCodeHT.Add("552","过量的存储分配,要求的操作未执行"); 
    ErrCodeHT.Add("553","邮箱名不可用,要求的操作未执行(例如邮箱格式错误)"); 
    ErrCodeHT.Add("432","需要一个密码转换"); 
    ErrCodeHT.Add("534","认证机制过于简单"); 
    ErrCodeHT.Add("538","当前请求的认证机制需要加密"); 
    ErrCodeHT.Add("454","临时认证失败"); 
    ErrCodeHT.Add("530","需要认证");  RightCodeHT.Add("220","服务就绪"); 
    RightCodeHT.Add("250","要求的邮件操作完成"); 
    RightCodeHT.Add("251","用户非本地,将转发向<forward-path>"); 
    RightCodeHT.Add("354","开始邮件输入,以<enter>.<enter>结束"); 
    RightCodeHT.Add("221","服务关闭传输信道"); 
    RightCodeHT.Add("334","服务器响应验证Base64字符串"); 
    RightCodeHT.Add("235","验证成功"); 

    /// <summary> 
    /// 将字符串编码为Base64字符串 
    /// </summary> 
    /// <param name="estr">要编码的字符串</param> 
    private string Base64Encode(string str) 

    byte[] barray; 
    barray=Encoding.Default.GetBytes(str); 
    return Convert.ToBase64String(barray); 

      

  18.   


    /// <summary> 
    /// 将Base64字符串解码为普通字符串 
    /// </summary> 
    /// <param name="dstr">要解码的字符串</param> 
    private string Base64Decode(string str) 

    byte[] barray; 
    barray=Convert.FromBase64String(str); 
    return Encoding.Default.GetString(barray); 
    }  /// <summary> 
    /// 得到上传附件的文件流 
    /// </summary> 
    /// <param name="FilePath">附件的绝对路径</param> 
    private string GetStream(string FilePath) 

    //建立文件流对象 
    System.IO.FileStream FileStr=new System.IO.FileStream(FilePath,System.IO.FileMode.Open); 
    byte[] by=new byte[System.Convert.ToInt32(FileStr.Length)]; 
    FileStr.Read(by,0,by.Length); 
    FileStr.Close(); 
    return(System.Convert.ToBase64String(by)); 

    /// <summary> 
    /// 添加邮件附件 
    /// </summary> 
    /// <param name="path">附件绝对路径</param> 
    public void AddAttachment(string path) 

    Attachments.Add(path); 

           
            /// <summary> 
    /// 添加一个收件人 
    /// </summary>    
    /// <param name="str">收件人地址</param> 
    public bool AddRecipient(string str) 

    str=str.Trim(); 
    if(str==null||str==""||str.IndexOf("@")==-1) 
    return true; 
    if(RecipientNum<recipientmaxnum) 

    Recipient.Add(RecipientNum,str); 
    RecipientNum++;             
    return true; 

    else 

    errmsg+="收件人过多"; 
    return false; 


    /// <summary> 
    /// 最多收件人数量 
    /// </summary> 
    public int RecipientMaxNum 

    set 

    recipientmaxnum = value; 


    /// <summary> 
    /// 添加一组收件人(不超过recipientmaxnum个),参数为字符串数组 
    /// </summary> 
    /// <param name="str">保存有收件人地址的字符串数组(不超过recipientmaxnum个)</param>    
    public bool AddRecipient(string[] str) 

    for(int i=0;i<str.Length;i++) 

    if(!AddRecipient(str[i])) 

    return false; 


    return true; 
    }  /// <summary> 
    /// 发送SMTP命令 
    /// </summary>    
    private bool SendCommand(string str) 

    byte[]  WriteBuffer; 
    if(str==null||str.Trim()=="") 

    return true; 

    logs+=str; 
    WriteBuffer = Encoding.Default.GetBytes(str); 
    try 

    ns.Write(WriteBuffer,0,WriteBuffer.Length); 

    catch 

    errmsg="网络连接错误"; 
    return false; 

    return true; 
    }  /// <summary> 
    /// 接收SMTP服务器回应 
    /// </summary> 
    private string RecvResponse() 

    int StreamSize; 
    string Returnvalue = ""; 
    byte[]  ReadBuffer = new byte[1024] ; 
    try 

    StreamSize=ns.Read(ReadBuffer,0,ReadBuffer.Length); 

    catch 

    errmsg="网络连接错误"; 
    return "false"; 
    }  if (StreamSize==0) 

    return Returnvalue ; 

    else 

    Returnvalue = Encoding.Default.GetString(ReadBuffer).Substring(0,StreamSize); 
    logs+=Returnvalue; 
    return  Returnvalue; 


    /// <summary> 
    /// 与服务器交互,发送一条命令并接收回应。 
    /// </summary> 
    /// <param name="Command">一个要发送的命令</param> 
    /// <param name="errstr">如果错误,要反馈的信息</param> 
    private bool Dialog(string str,string errstr) 

    if(str==null||str.Trim()=="") 

    return true; 

    if(SendCommand(str)) 

    string RR=RecvResponse(); 
    if(RR=="false") 

    return false; 

    string RRCode=RR.Substring(0,3); 
    if(RightCodeHT[RRCode]!=null) 

    return true; 

    else 

    if(ErrCodeHT[RRCode]!=null) 

    errmsg+=(RRCode+ErrCodeHT[RRCode].ToString()); 
    errmsg+=enter; 

    else 

    errmsg+=RR; 

    errmsg+=errstr; 
    return false; 


    else 

    return false; 
    }  }
      

  19.   


    /// <summary> 
    /// 与服务器交互,发送一组命令并接收回应。 
    /// </summary>  private bool Dialog(string[] str,string errstr) 

    for(int i=0;i<str.Length;i++) 

    if(!Dialog(str[i],"")) 

    errmsg+=enter; 
    errmsg+=errstr; 
    return false; 

    }  return true; 
    }   /// <summary>
    /// 请求连接
    /// </summary>
    public event EventHandlerSendEmail Connect;
    /// <summary>
    /// 登录服务器
    /// </summary>
    public event EventHandlerSendEmail Login;
    /// <summary>
    /// 发送邮件
    /// </summary>
    public event EventHandlerSendEmail Sending; private bool SendEmail() 

    try
    {
    if(this.Connect !=null) this.Connect("Connecting Server " + mailserver + " : " + mailserverport); //连接网络 
    try 

    tc=new TcpClient(mailserver,mailserverport); 

    catch(Exception e) 

    errmsg=e.ToString(); 
    return false; 
    }  ns = tc.GetStream(); 
    SMTPCodeAdd();  //验证网络连接是否正确 
    if(RightCodeHT[RecvResponse().Substring(0,3)]==null) 

    errmsg="网络连接失败"; 
    return false; 

    string[] SendBuffer; 
    string SendBufferstr;  if(this.Login !=null) this.Login("Validate : " + username);
    //进行SMTP验证 
    if(ESmtp) 

    SendBuffer=new String[4]; 
    SendBuffer[0]="EHLO " + mailserver + enter; 
    SendBuffer[1]="AUTH LOGIN" + enter; 
    SendBuffer[2]=Base64Encode(username) + enter; 
    SendBuffer[3]=Base64Encode(password) + enter; 
    if(!Dialog(SendBuffer,"SMTP服务器验证失败,请核对用户名和密码。")) 
    return false; 

    else 

    SendBufferstr="HELO " + mailserver + enter; 
    if(!Dialog(SendBufferstr,"")) 
    return false; 
    }  if(this.Sending != null) this.Sending("Sending Email ...");
    // 
    SendBufferstr="MAIL FROM:<" + From + ">" + enter; 
    if(!Dialog(SendBufferstr,"发件人地址错误,或不能为空")) 
    return false;  // 
    SendBuffer=new string[recipientmaxnum]; 
    for(int i=0;i<Recipient.Count;i++) 
    {  SendBuffer[i]="RCPT TO:<" + Recipient[i].ToString() +">" + enter;  } 
    if(!Dialog(SendBuffer,"收件人地址有误")) 
    return false;  SendBufferstr="DATA" + enter; 
    if(!Dialog(SendBufferstr,"")) 
    return false;  SendBufferstr="From:" + FromName + "<" + From +">" +enter;  SendBufferstr += "To:=?"+Charset.ToUpper()+"?B?"+Base64Encode(RecipientName)+"?="+"<"+Recipient[0]+">"+enter; 
    SendBufferstr+="CC:"; 
    for(int i=0;i<Recipient.Count;i++) 

    SendBufferstr+=Recipient[i].ToString() + "<" + Recipient[i].ToString() +">,"; 

    SendBufferstr+=enter; 
    if(Charset=="") 

    SendBufferstr+="Subject:" + Subject + enter; 

    else 

    SendBufferstr+="Subject:" + "=?" + Charset.ToUpper() + "?B?" + Base64Encode(Subject) +"?=" +enter; 
    }  SendBufferstr+="X-Priority:" + priority + enter; 
    SendBufferstr+="X-MSMail-Priority:" + priority + enter; 
    SendBufferstr+="Importance:" + priority + enter; 
    SendBufferstr+="X-Mailer: Huolx.Pubclass" + enter; 
    SendBufferstr+="MIME-Version: 1.0" + enter;  SendBufferstr += "Content-Type: multipart/mixed;"+enter;//内容格式和分隔符 
    //----=_NextPart_000_00D6_01C29593.AAB31770
    SendBufferstr += "   boundary=\"----=_NextPart_000_00D6_01C29593.AAB31770\""+enter + enter; 
    SendBufferstr += "------=_NextPart_000_00D6_01C29593.AAB31770"+enter;  if(Html) 

    SendBufferstr+="Content-Type: text/html;" + enter; 

    else 

    SendBufferstr+="Content-Type: text/plain;" + enter; 
    }  if(Charset=="") 

    SendBufferstr+="   charset=\"iso-8859-1\"" + enter; 

    else 

    SendBufferstr+="   charset=\"" + Charset.ToLower() + "\"" + enter; 
    }  SendBufferstr+="Content-Transfer-Encoding: base64" + enter + enter;  SendBufferstr+= Base64Encode(Body) + enter;  if(Attachments.Count!=0) 

    foreach(string filepath in Attachments) 

                    
    SendBufferstr += "------=_NextPart_000_00D6_01C29593.AAB31770"+enter; 
    SendBufferstr += "Content-Type: application/octet-stream"+enter; 
    SendBufferstr += "   name=\"=?"+Charset.ToUpper()+"?B?"+Base64Encode(filepath.Substring(filepath.LastIndexOf("\\")+1))+"?=\""+enter; 
    SendBufferstr += "Content-Transfer-Encoding: base64"+enter; 
    SendBufferstr += "Content-Disposition: attachment;"+enter; 
    SendBufferstr += "   filename=\"=?"+Charset.ToUpper()+"?B?"+Base64Encode(filepath.Substring(filepath.LastIndexOf("\\")+1))+"?=\""+enter+enter; 
    SendBufferstr += GetStream(filepath)+enter+enter; 


    else
    {
    SendBufferstr += enter;
    }
    SendBufferstr += "------=_NextPart_000_00D6_01C29593.AAB31770--"+enter+enter; 
              
              
    SendBufferstr += enter + "." + enter; 
    if(!Dialog(SendBufferstr,"错误信件信息")) 
    return false; 
    SendBufferstr="QUIT" + enter; 
    if(!Dialog(SendBufferstr,"断开连接时错误")) 
    return false; 
    ns.Close(); 
    tc.Close();  return true; 
    }
    catch(Exception er)
    {
    errmsg += er.Message; 
    return false;
    }

    /// <summary> 
    /// 发送邮件方法,所有参数均通过属性设置。 
    /// </summary> 
    public bool Send() 

    if(Recipient.Count==0) 

    errmsg="收件人列表不能为空"; 
    return false; 
    }  if(mailserver.Trim()=="") 

    errmsg="必须指定SMTP服务器"; 
    return false; 
    }  return SendEmail(); 
              

    /// <summary> 
    /// 发送邮件方法 
    /// </summary> 
    /// <param name="smtpserver">smtp服务器信息,如"username:passwordwww.smtpserver.com:25",也可去掉部分次要信息,如www.smtpserver.com"</param> 
    public bool Send(string smtpserver) 

              
    MailDomain=smtpserver; 
    return Send(); 

    /// <summary> 
    /// 发送邮件方法 
    /// </summary> 
    /// <param name="smtpserver">smtp服务器信息,如"username:passwordwww.smtpserver.com:25",也可去掉部分次要信息,如www.smtpserver.com"</param> 
    /// <param name="from">发件人mail地址</param> 
    /// <param name="fromname">发件人姓名</param> 
    /// <param name="to">收件人地址</param> 
    /// <param name="toname">收件人姓名</param> 
    /// <param name="html">是否HTML邮件</param> 
    /// <param name="subject">邮件主题</param> 
    /// <param name="body">邮件正文</param> 
    public bool Send(string smtpserver,string from,string fromname,string to,string toname,bool html,string subject,string body) 

    MailDomain=smtpserver; 
    From=from; 
    FromName=fromname; 
    AddRecipient(to); 
    RecipientName=toname; 
    Html=html; 
    Subject=subject; 
    Body=body; 
    return Send(); 

           
           
    }  public delegate void EventHandlerSendEmail(string info);
      

  20.   

    http://blog.csdn.net/zhzuo/archive/2004/07/12/39459.aspx
      

  21.   

    象新浪与tom网,一般的邮件都是拒收的。
      

  22.   

    我是用 socket来实现的发送邮件功能,没有使用System.Web.Mail中的控件。还有使用的是smtp.163.com的smtp服务器
      

  23.   

    我用jmail组件,smtp服务器用的是smtp.163.com,实现的可以发送到sohu,yahoo,163.126的邮箱都可以啊,你可以试一下,这方面的例子是很多的
      

  24.   

    多谢dpmcy618()的建议,我已经用过jmail了,确实很好用。但我用socket来做,目的是了想解一下其中的低层知识。
      

  25.   

    问题已解决,因为hotmail信箱是不支持smtp和pop3协议的.