课程设计三:使用SMTP协议发送邮件
知识点:
1、 SMTP协议的基本内容;
2、 使用SOCKET发送SMTP命令;
3、 发送邮件的附近。
设计步骤:
1、 设计窗体和组件;
2、 窗体中的事件处理;
3、 smtpMail类的实现;
实验效果为:
程序功能:
这个实例为一个E-mail发送程序。本程序在发送邮件时,支持邮件服务器的发送认证,同时具有发送附件的功能。
实现程序的部分代码为:
import java.io.*;
import java.net.Socket;
import java.util.*;
public class smtpMail{
private boolean sendConf=false;
private String User="";
private String Password="";
public static final int OK = 1;
public static final int ERROR = 0;
private static final String TEXT = "1";
private static final String TFILE = "2";
private static final String BFILE = "3";
private static final String CPR = "Java 1.0";
private static final String MIME = "Mime-Version";
private static final String MAILER = "X-Mailer";
private static final int BUFFER_SIZE = 48;
private String DELIMETER;
private String SEPARATOR;
private static final int HOW_LONG = 6;
private static final char SMTP_ERROR_CODE1 = 52;
private static final char SMTP_ERROR_CODE2 = 53;
private static final int fillchar = 61;
private static final String cvt = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
private Socket mailSocket;
private BufferedReader recv;
private PrintWriter send;
private String from;
private String to;
private String domain;
private Vector x_set;
private Vector body;
private Vector attach;
public smtpMail(){
DELIMETER = "";
SEPARATOR = "";
mailSocket = null;
recv = null;
send = null;
from = "";
to = "";
domain = "";
x_set = new Vector();
body = new Vector();
attach = new Vector();
DELIMETER = getId();
SEPARATOR = System.getProperty("file.separator");
}
private String getId(){
String s = "";
long l = System.currentTimeMillis();
Random random = new Random();
s = String.valueOf(l);
for(int i = 1; i <= 6; i++)
s = s + (int)(1.0D + 6D * random.nextDouble());
return s;
}
public int open(String serverName, int port){
try{
mailSocket = new Socket(serverName, port);
send = new PrintWriter(mailSocket.getOutputStream(), true);
recv = new BufferedReader(new InputStreamReader(mailSocket.getInputStream()));
String s1 = recv.readLine();
char c = s1.charAt(0);
if((c == '4') | (c == '5'))
return 0;
}
catch(Exception e){
return 0;
}
return 1;
}
private int sendString(String s){
String s1 = "";
try{
send.println(s);
s1 = recv.readLine();
}
catch(Exception e){
System.out.print(s1);
return 0;
}
if(s1.length() == 0)
return 0;
char c = s1.charAt(0);
return !((c == '4') | (c == '5')) ? 1 : 0;
}
public void setSendConf(boolean blnConf){
sendConf=blnConf;
}
public void setUser(String strUser){
User = strUser;
}
public void setPwd(String strPwd){
Password = strPwd;
}
public void setDomain(String s){
domain = s;
}
public void addHeader(String s, String s1){
x_set.addElement(s);
x_set.addElement(s1);
}
public void removeHeader(String s){
int i = x_set.indexOf(s);
if(i >= 0){
x_set.removeElementAt(i + 1);
x_set.removeElementAt(i);
}
}
public void clearHeaders(){
x_set.removeAllElements();
}
public void setFrom(String fromAddress){
from = fromAddress;
x_set.addElement("From");
x_set.addElement(fromAddress);
}
public void setTo(String toAddress){
to = toAddress;
x_set.addElement("To");
x_set.addElement(toAddress);
}
public void clearData(){
body.removeAllElements();
}
public void clearAttachment(){
attach.removeAllElements();
}
public void addData(String s){
body.addElement("1");
body.addElement(s);
}
public void addTextFile(String s) {
body.addElement("2");
body.addElement(s);
}
public void addAttachment(String s){
attach.addElement(s);
}
public int transmit(){
boolean flag = true;
if(domain.length() != 0){
int i = sendString("HELO " + domain);
if(i != 1)
return 0;
}
if(sendConf){
int i = sendString("AUTH LOGIN");
if(i != 1)
return 0;
String tmp=new String(Base64.encode(User.getBytes()));
i = sendString(tmp);
if(i != 1)
return 0;
String tp=new String(Base64.encode(Password.getBytes()));
i = sendString(tp);
if(i != 1)
return 0;
}
if(from.length() != 0){
int j = sendString("MAIL FROM:" + from);
if(j != 1)
return 0;
}
if(to.length() != 0){
int k = sendString("RCPT TO:" + to);
if(k != 1)
return 0;
}
if(sendString("DATA") != 1)
return 0;
for(int l = 0; l < x_set.size(); l += 2){
String s = (String)x_set.elementAt(l);
send.println(s + ": " + x_set.elementAt(l + 1));
}
if(x_set.indexOf("Date") < 0)
send.println("Date: " + (new Date()).toString());
if(x_set.indexOf("Mime-Version") < 0)
send.println("Mime-Version: 1.0");
send.println("X-Mailer: Java v1.0");
if(attach.size() > 0)
send.println("Content-Type: MULTIPART/mixed; BOUNDARY=" + DELIMETER);
try{
send.print("\n\n");
int i1 = 0;
if(attach.size() > 0){
send.println("--" + DELIMETER);
send.println("Content-Type: TEXT/plain;");
send.print("\n");
}
for(; i1 < body.size(); i1 += 2){
String s1 = (String)body.elementAt(i1);
if(s1.compareTo("1") == 0)
send.println((String)body.elementAt(i1 + 1));
else
if(s1.compareTo("2") == 0)
sendTextFile((String)body.elementAt(i1 + 1));
}
for(int j1 = 0; j1 < attach.size(); j1++)
sendBinaryFile((String)attach.elementAt(j1));
if(attach.size() > 0)
send.println("--" + DELIMETER + "--");
int j= sendString("\r\n.\r\n");
return j;
}
catch(Exception e){
return 0;
}
}
private void sendTextFile(String s){
try{
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(new FileInputStream(s)));
String s1;
while((s1 = bufferedreader.readLine()) != null)
send.println(s1);
bufferedreader.close();
return;
}
catch(Exception e){
return;
}
}
private void sendBinaryFile(String s){
byte abyte0[] = new byte[48];
boolean flag = true;
String s1 = s;
try{
DataInputStream datainputstream = new DataInputStream(new FileInputStream(s));
int i = s.lastIndexOf(SEPARATOR);
if(i >= 0)
s1 = s1.substring(i + 1);
send.println("--" + DELIMETER);
send.println("Content-Type: APPLICATION/octet-stream; name=\"" + s1 + "\";");
send.println("Content-Transfer-Encoding: BASE64");
send.println("Content-Description: " + s1);
send.print("\n");
while(flag){
int j = datainputstream.available();
int k;
if(j >= abyte0.length){
k = datainputstream.read(abyte0, 0, abyte0.length);
}
else{
k = j;
datainputstream.readFully(abyte0, 0, k);
flag = false;
}
send.println(encode(abyte0, k));
}
datainputstream.close();
return;
}
catch(Exception e){
return;
}
}
private static String toBinaryString(byte byte0){
byte byte1 = byte0;
String s = Integer.toBinaryString(byte1);
if(byte1 < 0)
s = s.substring(s.length() - 8);
for(; s.length() < 8; s = "0" + s);
return s;
}
public static String encode(byte abyte0[], int i){
StringBuffer stringbuffer = new StringBuffer();
for(int j = 0; j < i; j += 3)
if(j + 2 < i){
String s = toBinaryString(abyte0[j]) + toBinaryString(abyte0[j + 1]) + toBinaryString(abyte0[j + 2]);
stringbuffer.append("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(Integer.parseInt("00" + s.substring(0, 6), 2)));
stringbuffer.append("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(Integer.parseInt("00" + s.substring(6, 12), 2)));
stringbuffer.append("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(Integer.parseInt("00" + s.substring(12, 18), 2)));
stringbuffer.append("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(Integer.parseInt("00" + s.substring(18, 24), 2)));
}
else
if(j + 1 < i){
String s1 = toBinaryString(abyte0[j]) + toBinaryString(abyte0[j + 1]) + "00";
stringbuffer.append("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(Integer.parseInt("00" + s1.substring(0, 6), 2)));
stringbuffer.append("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(Integer.parseInt("00" + s1.substring(6, 12), 2)));
stringbuffer.append("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(Integer.parseInt("00" + s1.substring(12, 18), 2)));
stringbuffer.append(61);
}
else{
String s2 = toBinaryString(abyte0[j]) + "0000";
stringbuffer.append("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(Integer.parseInt("00" + s2.substring(0, 6), 2)));
stringbuffer.append("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(Integer.parseInt("00" + s2.substring(6, 12), 2)));
stringbuffer.append(61);
stringbuffer.append(61);
}
return stringbuffer.toString();
}
public int close(){
int i = 0;
try{
i += sendString("QUIT");
mailSocket.close();
}
catch(Exception e){
return 0;
}
return i == 0 ? 1 : 0;
}
}