现在大多数smtp服务器都需要身份认证,若用javamail写一个
邮件收发客户端,怎么来实现这种功能呢?下面是一个简单的列子,模拟foxmail对认证功能的实现。
package
jmail;
import javax.mail.*;
import
java.util.*;
import
java.sql.*;
import javax.swing.*;
import
java.awt.*;
public class mailauthenticator extends authenticator{
string authenname; //用户名
string authenpass; //密码
public mailauthenticator(string authenname,string authenpass) {
super();
this.authenname=authenname;
this.authenpass=authenpass;
}
public passwordauthentication getpasswordauthentication(){ /*若服务器需要身份认证,sission会自动调用这个方法
string temp=null;
if(authenpass.equals("")||authenpass==null){ /*若密码为空*/
option op=new option(null,"身份验证",true); /*弹出要求用户输入密码的对话框,option是自定义的jdialog,包含一个密码域*/
temp=op.showdialog(); /*option的返回输入的密码*/
authenpass=temp;
}
return new passwordauthentication(authenname,authenpass);
}
}
/* 下面是option 类,jbuilder里写的,无须解释*/
package
jmail;
import
java.awt.*;
import javax.swing.*;
import com.borland.jbcl.layout.*;
import
java.awt.event.*;
public class option extends jdialog {
jpanel panel1 = new jpanel();
jlabel jlabel1 = new jlabel();
xylayout xylayout1 = new xylayout();
jbutton jbutton1 = new jbutton();
jbutton jbutton2 = new jbutton();
jpasswordfield jpasswordfield1 = new jpasswordfield();
jlabel jlabel2 = new jlabel();
jlabel jlabel3 = new jlabel();
icon forget=new imageicon(".\images\forget.gif");
boolean ok=false;
jlabel jlabel4 = new jlabel();
jlabel jlabel5 = new jlabel();
public option(frame frame, string title, boolean modal) {
super(frame, title, modal);
try {
jbinit();
pack();
}
catch(exception ex) {
ex.printstacktrace();
}
}
public option() {
this(null, "", false);
}
private void jbinit() throws exception {
panel1.setlayout(xylayout1);
jlabel1.setfont(new
java.awt.font("dialog", 0, 12));
jlabel1.settext("密码:");
jbutton1.setfont(new
java.awt.font("dialog", 0, 12));
jbutton1.setdoublebuffered(false);
jbutton1.settext("确定");
jbutton1.addactionlistener(new option_jbutton1_actionadapter(this));
jbutton2.setfont(new
java.awt.font("dialog", 0, 12));
jbutton2.settext("取消");
jbutton2.addactionlistener(new option_jbutton2_actionadapter(this));
jlabel2.setfont(new
java.awt.font("dialog", 0, 12));
jlabel2.sethorizontaltextposition(swingconstants.trailing);
jlabel2.seticon(forget);
jlabel2.settext("");
jlabel3.setfont(new
java.awt.font("dialog", 0, 12));
jlabel3.settext("服务器需要身份认证, 请输入密码");
panel1.settooltiptext("");
jlabel4.settext(" ");
jlabel5.settext(" ");
getcontentpane().add(panel1, borderlayout.center);
panel1.add(jlabel4, new xyconstraints(189, 61, -1, -1));
panel1.add(jlabel2, new xyconstraints(15, 1, 67, 19));
panel1.add(jlabel3, new xyconstraints(15, 22, -1, -1));
panel1.add(jpasswordfield1, new xyconstraints(48, 46, 140, -1));
panel1.add(jlabel1, new xyconstraints(15, 48, -1, -1));
panel1.add(jbutton1, new xyconstraints(46, 79, 58, 22));
panel1.add(jbutton2, new xyconstraints(112, 79, 58, 22));
panel1.add(jlabel5, new xyconstraints(85, 102, -1, 12));
this.getrootpane().setdefaultbutton(jbutton1);
this.setsize(220,130);
dimension screensize = toolkit.getdefaulttoolkit().getscreensize();
this.setlocation((int)screensize.getwidth()/2-80,(int)screensize.getheight()/2-50);
}
void jbutton1_actionperformed(actionevent e) {
ok=true;
this.dispose();
}
void jbutton2_actionperformed(actionevent e) {
ok=false;
this.dispose();
}
public string showdialog(){
show();
if(ok)return new string(jpasswordfield1.getpassword());
else return null;
}
}
class option_jbutton1_actionadapter implements
java.awt.event.actionlistener {
option adaptee;
option_jbutton1_actionadapter(option adaptee) {
this.adaptee = adaptee;
}
public void actionperformed(actionevent e) {
adaptee.jbutton1_actionperformed(e);
}
}
class option_jbutton2_actionadapter implements
java.awt.event.actionlistener {
option adaptee;
option_jbutton2_actionadapter(option adaptee) {
this.adaptee = adaptee;
}
public void actionperformed(actionevent e) {
adaptee.jbutton2_actionperformed(e);
}
}
/*下面写一个发送邮件主类,利用上面的mailauthenticator类来提供身份验证 */
package
jmail;
import javax.mail.*;
import javax.mail.internet.*;
import javax.swing.*;
import
java.io.*;
import javax.activation.*;
import
java.util.*;
public class sendmail{
public static void main(string[] args) {
string host="";
string from="";
string to="";
string name="";
string pass=null;
string subject="";
string content="";
mailauthenticator ma;
if(args.length<6){ /*小于6,先不输入密码,发送过程服务器要求认证时就会跳出密码输入框(option类)*/
system.out.println("enter<host><from><to><name><pass><subject><content>");
system.exit(0);
}
else {
host=args[0]; /*smtp服务器*/
from=args[1]; /*发件人*/
to=args[2]; /收件人*/
name=args[3]; /*smtp认证用户名,一般跟pop3登录相同*/
subject=args[4]; /*邮件主题*/
content=args[5]; /*邮件内容*/
}
try{
ma=new mailauthenticator(name,pass);
properties props=system.getproperties();
props.put("mail.smtp.host",host);
props.put("mail.smtp.auth","true"); /*服务器需要认证*/
session session=session.getinstance(props,ma); /*session会自动调用getpasswordauthentication()方法*/
mimemessage msg=new mimemessage(session);
msg.setfrom(new internetaddress(from));
msg.setrecipient(message.recipienttype.to,new internetaddress(to));
msg.setsubject(subject);
msg.settext(content);
msg.setsentdate(new
java.util.date());
transport.send(msg);
system.out.println("send email success");
}catch(exception e){
system.out.println(e.getmessage());
}
}
}
可以自己写个ui界面的sendmail()主类,再加入发送附件和群发邮件的功能,那么将是一个完整的邮件发送客户端程序。