package org.birdy.socket;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;import sun.misc.BASE64Encoder;public class MailSender {
private String smtp_server = "smtp.126.com";
private int port = 25;

private String username = "evangelionxb";
private String password = "sadsaddfg";
private String localhost = "";

// private String smtp_server = "smtp.qq.com";
// private int port = 25;
//
// private String username = "303040169";
// private String password = "dgdfgdg";
// private String localhost = "";

private Socket s = null;

public static void main(String[] args) {
MailSender mail = new MailSender();
// System.out.println("--->" + createMessage().data);
mail.sendMail(createMessage());

}

private static Message createMessage(){
Message msg = new Message(
// "<[email protected]>",
"<[email protected]>",
"<[email protected]>",
"hello",
"this mail by socket");
return msg;
}

public void sendMail(Message message){
username = new BASE64Encoder().encode(username.getBytes());
password = new BASE64Encoder().encode(password.getBytes());
try {
localhost = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}


try {
s = new Socket(InetAddress.getByName(smtp_server),port);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

BufferedReader br = null;

PrintWriter pw = null;
try {
pw = new PrintWriter(s.getOutputStream(),true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

send("EHLO " + localhost, pw);
send("AUTH LOGIN", pw);
send(username, pw);
send(password,pw);
send("MAIL FROM:" + message.from,pw);
send("RCPT TO:" + message.to,pw);
send("DATA",pw);
send("Subject: this is a test",pw);
send("hello",pw);
send(".",pw);

System.out.println("---end1---");

receive(br); boolean isConnecting = s.isConnected()&&!s.isClosed();

if(isConnecting!=true){
try {
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

private void send(String string, PrintWriter pw){
pw.println(string);
System.out.println("Client>" + string);
}


private void receive(BufferedReader br){
boolean flag = true;
while(flag==true){
try {
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

try {
while(br.ready()){
String temp = br.readLine();
System.out.println("Server>" + temp);
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}public class Message {

public String from;
public String to;
public String subject;
public String content;
public String data;

public Message(String from,String to,String subject,String content){
this.from = from;
this.to = to;
this.subject = subject;
this.content = content;
this.data = "Subject: " + subject + "\r\n" + content;
}
}我如果不用java 直接用 cmd命令的 telnet 已经成功在 126, qq的邮箱登陆并发送邮件。但是使用java socket 发送时。
在测试 qq.com的时候 结束有问题 
在测试 126邮箱的时候 读取账户后就  br 就输出不了下面的内容了。
send(".",pw); 应该怎么去改?练下手熟悉下smtp协议。

解决方案 »

  1.   


    //发送邮件给用户找回密码
    String email = request.getParameter("username"); //处理结果以及发送邮件
    String results = "" ;
    //发送邮件
    sends.settype("text/html;charset=GBK");
    //设置并发送邮件
    String mailHost = "mail.washpe.com";
    sends.sethost(mailHost);
    sends.setfrom("[email protected]");
    sends.setuser("[email protected]");
    sends.setpass("123456");

    //邮件标题
    sends.setsubject("找回会员密码!"); String contents = "";
    //邮件内容开始
    String enPro = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
    String enCy = "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB";
    enPro = java.net.URLEncoder.encode(enPro,"GBK");
    enCy = java.net.URLEncoder.encode(enCy,"GBK");

    String root = request.getRealPath("/");
    root = root + "reg.html"; //发送静态页面
    try{
    BufferedReader reader = new BufferedReader(new FileReader(new File(root)));
    String line = "";
    while((line=reader.readLine())!=null){
    if(line.indexOf("#realname#")!=-1) line = line.replaceAll("#realname#",new String(request.getParameter("realname").getBytes("GBK")));
    if(line.indexOf("#email#")!=-1) line = line.replaceAll("#email#",new String(request.getParameter("email")));
    if(line.indexOf("#[email protected]#")!=-1) line = line.replaceAll("#[email protected]#",new String(request.getParameter("email")));
    if(line.indexOf("#valid.jsp#")!=-1) line = line.replaceAll("#valid.jsp#","valid.jsp?hxp=1&cy="+enPro+"&ci="+enCy);
    contents = contents + line;
    }
    reader.close();
    //System.out.println(contents);
    }catch(Exception e){
    System.out.println(e.getMessage());
    }
      //邮件内容结束 //邮件内容
    sends.setmsg(contents);
    //发件人显示名称
    sends.setRealname("趣搭找回密码服务");
    boolean bool = false;
    sends.setto(email); bool = sends.send(); //判断发送结果
      

  2.   

    楼上的复制自己写的还是别人的?
    你那个是通过 http的
    我要的是通过 smtp进行的结尾必须 以  <CR><LF>.<CR><LF>
    <CR>回车 <LF>换行
    这样结尾但是我不太清楚我的代码要增么写。看有谁自己写过。另外如果还找不到。
    我只好去看 javaMail的实现了。
      

  3.   

    我觉得你可以学一下张孝详的java mail,里面讲解的很清楚
      

  4.   

    搞了半天终于搞好了。代码修改如下:package org.birdy.socket;import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.Date;import sun.misc.BASE64Encoder;public class MailSender {
    private String smtp_server = "smtp.126.com";
    private int port = 25;

    private String username = "evangelionxb";
    private String password = "19851216232";
    private String localhost = "";

    // private String smtp_server = "smtp.qq.com";
    // private int port = 25;
    //
    // private String username = "303040169";
    // private String password = "19851216232";
    // private String localhost = "";

    private Socket s = null;

    public static void main(String[] args) {
    MailSender mail = new MailSender();
    // System.out.println("--->" + createMessage().data);
    mail.sendMail(createMessage());

    }

    private static Message createMessage(){
    Message msg = new Message(
    // "<[email protected]>",
    "<[email protected]>",
    "<[email protected]>",
    "hello",
    "this mail by socket");
    return msg;
    }

    public void sendMail(Message message){
    username = new BASE64Encoder().encode(username.getBytes());
    password = new BASE64Encoder().encode(password.getBytes());
    try {
    localhost = InetAddress.getLocalHost().getHostName();
    } catch (UnknownHostException e2) {
    // TODO Auto-generated catch block
    e2.printStackTrace();
    }

    try {
    s = new Socket(InetAddress.getByName(smtp_server),port);
    } catch (UnknownHostException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }

    BufferedReader br = null;

    PrintWriter pw = null;
    try {
    pw = new PrintWriter(s.getOutputStream(),true);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    send("EHLO " + localhost, pw);
    send("AUTH LOGIN", pw);
    send(username,pw);
    send(password,pw);
    send("MAIL FROM:" + message.from,pw);
    send("RCPT TO:" + message.to,pw);
    send("DATA",pw);
    send("From: " + message.from,pw);
    send("To: " + message.to,pw);
    send("Date: " + new Date().toString(),pw);
    send("Subject: this is a test",pw);
    send("hello",pw); send(".",pw);

    // <CR><LF>.<CR><LF>  --->  <CR> == \r ;  <LF> == \n ;
    send("QUIT",pw);

    System.out.println("---end---");

    receive(br);

    boolean isConnecting = s.isConnected()&&!s.isClosed();

    if(isConnecting!=true){
    try {
    s.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }

    private void send(String string, PrintWriter pw){
    pw.println(string);

    try {
    Thread.sleep(500);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    pw.flush();
    System.out.println("Client>" + string);
    }


    private void receive(BufferedReader br){
    boolean flag = true;
    while(flag==true){
    try {
    br = new BufferedReader(new InputStreamReader(s.getInputStream()));
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    try {
    while(br.ready() == true){
    String temp = br.readLine();
    System.out.println("Server>" + temp);
    // if(temp.equals("354 End data with <CR><LF>.<CR><LF>")){
    // flag = false;
    // }
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    }其实加个 sleep 就好了