1. SMTP 协议简介
simple mail Transfer Protocal:简称传输协议,是应用vengeance的协议。建立在TCP/IP的协议之上。SMTP协议规定了把邮件从发送方传输的
接受方的规则
SMTP 客户程序请求发送邮件,SMTP服务器负责吧邮件传输到目的地。默认情况下,SMTP服务器监听25端口。在SMTP客户与SMTP服务器的一次绘画过程中,SMTP客户户发送一些列SMTP命令,SMTP服务器则做出相应,返回相应的应答码,以及对应答码描述。
主要的SMTP命令:
2. 发送过程
1.首先创建于SMTP服务器链接的socket对象。
2.当链接成功,SMTP服务器就会返回一个应答码为220 的相应,表示服务就绪。
3.接着sendMail()方法开始发送‘HELLO’。‘MAILFROM“,”RCPT TO“等命令,每条命令都按航发送,即以”\r\n"结束。每发送完一条命令后,都会等接收到了SMTP服务器的响应数据,然后再发送另一条命令。
实现;
package STMP;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
import javax.swing.*;
/*
* 发送邮件客户端
* */
public class SendMail extends JFrame {
private JTextField from;
private JTextField to;
private JTextField server;
private JTextArea message;
private JTextArea comm;
private Scanner in;
private PrintWriter out;
public SendMail(){
//设置frame
setSize(500,600);
setTitle("send Mail");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
//往frame里面添加组件
JPanel p1= new JPanel(new GridLayout(3,2));
p1.add(new JLabel("from:"));
from=new JTextField(20);
p1.add(from);
p1.add(new JLabel("to:"));
to= new JTextField(20);
p1.add(to);
p1.add(new JLabel("SMTP server:"));
server= new JTextField(20);
p1.add(server);
add(p1,BorderLayout.NORTH);
System.out.println("Look at here");
JPanel p2= new JPanel(new GridLayout(2,1));
message=new JTextArea();
p2.add(new JScrollPane(message));
comm= new JTextArea();
comm.setEditable(false);
p2.add(new JScrollPane(comm));
add(p2,BorderLayout.CENTER);
JPanel p3= new JPanel();
JButton sendButton = new JButton("Send");
p3.add(sendButton);
add(p3,BorderLayout.SOUTH);
setVisible(true);
//给发送按钮注册监听器
sendButton.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
comm.setText("");
sendMail(server.getText().trim(),from.getText().trim(),to.getText().trim(),message.getText().trim());
}
});
}
//发送邮件
public void sendMail(String server, String from, String to, String message){
try{
Socket s= new Socket(server,25);
try{
in= new Scanner(s.getInputStream());
out= new PrintWriter(s.getOutputStream(),true);/*表示自动刷新*/
String hostName=InetAddress.getLocalHost().getHostName();
receive();
send("HELLO"+hostName);//握手,成功返回220准备就绪
receive();
send("Mail From:<"+from +">");//发件人邮箱
receive();
send("RCPT To:<"+to+">"); //收件人邮箱
receive();
send(message);//发送邮件内容
send(".");
receive();
send("QUIT");
}finally{
s.close();
}
}catch(IOException e){
comm.append("Error:"+e);
}
}
//发送
private void send(String s){
comm.append(s+"\n");
out.print(s);
out.print("\r\n");
out.flush();
}
//接收
private void receive(){
comm.append(in.nextLine()+"\n");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new SendMail();
}
}