我刚开始了解发送邮件的程序,想做一个简单的发送邮件的程序(不带附件),我是按照书上的例子
用编写底层代码方式,和用javamail的api的方式都作了尝试,但是当程序运行的时候,我所登陆的几个smtp服务器都发回“您没有权限发送邮件(翻译)”(smtp.163.com, smtp.sina.com.cn)。我不明白
为什么发邮件还需要权限呢?
请问谁有已调试成功的代码让我参考以下?谢谢!

解决方案 »

  1.   

    也就是说那些smtp服务器不是免费的啊,
    你去找那些免费的试试。
      

  2.   

    smtp需要认证哦。
    Properties props = new Properties();
    props.put("mail.smtp.host", "smtp.163.com");
    props.put("mail.smtp.auth", "true");
    .....
      

  3.   

    嗯,发信的很多SMTP服务器都会要求验证你的身份的
      

  4.   

    如果不验证, 你用人家的帐号就可以发邮件了.AUTH LOGIN
    之后就是输入base64编码之后的用户名和密码.
      

  5.   

    //确定验证。
    props.put("mail.smtp.auth","true");
    //输入用户名和密码
    transport.connect((String)props.get("mail.smtp.host"),"name","password");
      

  6.   

    你去找本tcp/ip协议的书看看吧. 或者去看看rfc文档.
    下面简单说一下使用socket怎么和smtp回话的.首先是客户端主动连接smtp服务器, 一般端口是25, 服务器使用dns s例如smtp.163.net
    这是服务器应该返回220为正确以下是用telnet smtp.tom.com 25
    ----------------------------------------------
    220 Coremail SMTP(Anti Spam) System (163net[040302])
    HELO
    501 CoremailSys:Syntax: HELO hostname
    HELO [email protected]
    250 bjapp41
    RSET
    250 Ok
    AUTH LOGIN
    334 VXNlcm5hbWU6
    这里输入base64编码后的用户名
    服务器返回334
    这里输入base编码后的密码
    正确则服务器返回334
    MAIL FROM :<[email protected]>
    250返回码
    RCPT TO:<收件人@aaa.com>
    250返回码
    DATA
    354返回码, 之后用户久输入整个邮件的内容以为.结束
    FROM: [email protected]
    TO:收件人
    SUBJECT:主题
    ""
    邮件内容
    . 结束
    期待250返回码
    QUIT
    期待221返回码以下是代码, 但是当然的乱码问题什么肯定是会有的, 因为没标记编码.
    你使用foxmail等收邮件原始邮件的内容.
    //不用javaMail发送邮件
    import java.net.*;
    import java.io.*;
    import java.util.*;
    //import javax.mail.*;
    //import javax.mail.internet.*;public class SmtpTalk {
        BufferedReader is;
        PrintStream os;
        private boolean debug=true;
        private String host;
        sun.misc.BASE64Encoder enc;
        private String user;
        private String psw;    
        public static void main(String[] argv){
         if(argv.length!=2){
         System.out.println("Usage:java SmtpTalk host user");
         System.exit(1);
         }
        
        
         try{
           SmtpTalk st=new SmtpTalk(argv[0]);
           System.out.println("Smtp Talker ready");
           
           st.converse("[email protected]",argv[1],"Test message",
                     "helo there");
         }catch(Exception ig){
         System.err.println(ig.getMessage());
         System.exit(1);
         }
        }
        

    SmtpTalk(String Server){
    host=Server;
     enc = new sun.misc.BASE64Encoder();
     user=new String("madass");
     psw=new String ("xinxin");



    try{
      Socket s=new Socket(host,25);
      is=new BufferedReader(new InputStreamReader(s.getInputStream()));
      os=new PrintStream(s.getOutputStream());
      }
     catch(NoRouteToHostException e){
      die(/*EX_TEMPFAIL*/1,"No route to host "+host);
      }
     catch(ConnectException e){
      die(/*EX_TEMPFAIL*/1,"Connection Refused by"+host);
      } 
     catch(UnknownHostException e){
      die(/*EX_NOHOST*/2,"Unknown host "+host);
      }
     catch(IOException e){
      die(/*EX_IOERR*/3,"I/O error setting up socket stream\n"+e);
      }  
    }


    protected void send_cmd (String cmd,String oprnd){
    send_cmd(cmd+" "+oprnd);
    }

    protected void send_cmd(String cmd){
    if(debug)
    System.out.println(">>>"+cmd);
    os.print(cmd+"\r\n");
    }

    public void send_text(String text){
    os.print(text+"\r\n");
    }

    protected boolean expect_reply(String rspNum) /*throw SMTPException*/{
         String s=null;
         try{
         s=is.readLine();
         }catch(IOException e){
          die(/*EX_IOERR*/3,"I/o error reading from host"+host+" "+e);
          }
         if(debug) System.out.println("<<<"+s);
         return s.startsWith(rspNum+" ");
               }
               
            
            protected void die(int ret,String msg)/* throw  SMTPException*/{
             //throw new SMTPException (ret,msg);
             }   
               
    public void converse(String sender,String recipients,String  subject,String body) /*throw SMTPException*/{
      
      if(!expect_reply("220")) die(/*EX_PROTOCOL*/4,"did not get SMTP greeting");
      
      send_cmd("HELO","[email protected]");
      if(!expect_reply("250")) die(/*EX_PROTOCOL*/4,"did not get ack our HELO");
      send_cmd("RSET");
      if(!expect_reply("250")) die (/*EX_PROTOCOL*/4,"not reset");
      
      send_cmd("AUTH LOGIN");
      if(!expect_reply("334")) die (/*EX_PROTOCOL*/4,"not reset");
      
      send_cmd(enc.encode(user.getBytes()));
      if(!expect_reply("334")) die (/*EX_PROTOCOL*/4,"not reset");
      
     send_cmd(enc.encode(psw.getBytes()));
      if(!expect_reply("334")) die (/*EX_PROTOCOL*/4,"not reset");
      
     
      
      send_cmd("MAIL","From:<"+sender+">");
      if(!expect_reply("250")) die (/*EX_PROTOCOL*/4,"did not ack our MAIL command");
      
      //StringTokenizer st=new StringTokenizer(recipients);
      //while(st.hasMoreTokens()){
       //String  r=st.nextToken();
       send_cmd("RCPT","To:<"+recipients+">");
       if(!expect_reply("250"))
          die(/*EX_PROTOCOL*/4,"did not ack RECP");
          //}
          
       send_cmd("DATA");
       if(!expect_reply("354")) die(/*EX_PROTOCOL*/4,"did not want our data");
       
       send_text("From: "+sender);
       send_text("To: "+recipients);
       send_text("Subject: "+subject);
       send_text("");
       send_text(body+"\r");
       
       send_cmd(".");
       if(!expect_reply("250")) die(/*EX_PROTOCOL*/4,"mail not accepted");
       
       send_cmd("QUIT");
       if(!expect_reply("221")) die(/*EX_PROTOCOL*/4,"Other end not closing down");
           
      
      }

    }
      

  7.   

    利用Javamail来发送邮件
    利用126邮箱提供的服务来发送邮件,但是必须通过邮箱认证
    <%@ page import="javax.mail.*" %>
    <%@ page import="javax.mail.internet.*" %>
    <%@ page import="javax.activation.*" %>
    <%@ page import="java.util.*,java.io.*" %>
    <%@ page contentType="text/html;charset=GB2312" %><html>
    <head>
      <title>JavaMail.jsp</title>
    </head>
    <body><h2>利用JavaMail来传送电子邮件 </h2>
    <%
        InternetAddress[] address = null;    request.setCharacterEncoding("GB2312");    String mailserver= "smtp.126.com";
        String From= request.getParameter("From");
        String to= request.getParameter("To");
        String Subject= request.getParameter("Subject");
        String Username=request.getParameter("username");
        String Password =request.getParameter("password");
        String messageText= request.getParameter("Message");
        boolean sessionDebug = false;
        try 
      {
      java.util.Properties props = System.getProperties();
      props.put("mail.host",mailserver);//服务器
      props.put("mail.smtp.auth","true");//服务器需通过认证
    props.put("mail.smtp.host",mailserver);
      props.put("mail.transport.protocol","smtp");//传输协议为SMTP
        javax.mail.Session mailSession = javax.mail.Session.getDefaultInstance(props);
      mailSession.setDebug(sessionDebug);
        
      Message msg = new MimeMessage(mailSession);
      
      
      msg.setFrom(new InternetAddress(From));    address = InternetAddress.parse(to,false);
      msg.setRecipients(Message.RecipientType.TO, address);
        msg.setSubject(Subject);  msg.setSentDate(new Date());
        msg.setText(messageText);
        msg.saveChanges();
    //编程实现通过SMTP发信认证---SMTP认证就是输入你在SMTP服务器上的用户名称和密码
      Transport transport = mailSession.getTransport("smtp");
      transport.connect(mailserver,Username,Password);
      transport.sendMessage(msg, msg.getAllRecipients());
      transport.close();
        out.println("邮件顺利传送");
        
        }
        catch(MessagingException mex) 
      {
    mex.printStackTrace();
      }
    %></body>
    </html> 如何使用代码编程实现通过SMTP发信认证呢?SMTP认证就是输入你在SMTP服务器上的用户名称和密码,
    String Username  =request.getParameter("username");
    String  Password =request.getParameter("password");
    假设SMTP服务器为String mailserver  = "smtp.126.com";
    则:
    try {  
      java.util.Properties props = System.getProperties();
      props.put("mail.host",mailserver);//服务器
      props.put("mail.smtp.auth","true");//服务器需通过认证
      props.put("mail.smtp.host",mailserver);
      props.put("mail.transport.protocol","smtp");//传输协议为SMTP
        javax.mail.Session mailSession = javax.mail.Session.getDefaultInstance(props);
      mailSession.setDebug(sessionDebug);//创建对话
        
      Message msg = new MimeMessage(mailSession);//创建信息
      
      
      msg.setFrom(new InternetAddress(From));    address = InternetAddress.parse(to,false);
      msg.setRecipients(Message.RecipientType.TO, address);
        msg.setSubject(Subject);  msg.setSentDate(new Date());
        msg.setText(messageText);
        msg.saveChanges();
      Transport transport = mailSession.getTransport("smtp");
      transport.connect(mailserver,Username,Password);//链接服务器,
                            //此处为方法固定格式,即:服务器名,用户
                            //名,密码
      transport.sendMessage(msg, msg.getAllRecipients());//发送
      transport.close();
        out.println("邮件顺利传送");
        
    }
        catch (MessagingException mex) {      mex.printStackTrace();
        }