javamail實現smtp身份認證

- 中國WEB開發者網絡 (http://www.webasp.net)
-- 技術教程 (http://www.webasp.net/article/)
--- javamail實現smtp身份認證 (http://www.webasp.net/article/18/17339.htm)
-- 作者:未知
-- 發佈日期: 2005-04-06
現在大多數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()主類,再加入發送附件和群發郵件的功能,那麼將是一個完整的郵件發送客戶端程序。 

webasp.net