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协议。
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协议。
//发送邮件给用户找回密码
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(); //判断发送结果
你那个是通过 http的
我要的是通过 smtp进行的结尾必须 以 <CR><LF>.<CR><LF>
<CR>回车 <LF>换行
这样结尾但是我不太清楚我的代码要增么写。看有谁自己写过。另外如果还找不到。
我只好去看 javaMail的实现了。
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 就好了