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 |