JAVA使用Transport類傳送郵件
使用Authenticator類的情況:當直接使用Transport的無參方法connect或者是Transport的靜態方法直接傳送郵件時,若伺服器需要認證資訊者則這兩個方法都不能提供,因此要在建立Session物件時提供了Authenticator的認證資訊,則就可以直接使用了。
通過使用Authenticator類的方式向郵件伺服器提供認證資訊可以按照以下步驟和思路進行編寫:
1. 編寫抽象類Authenticator的實現子類,在子類中覆蓋父類的getPasswordAuthentication方法,並返回封裝使用者名稱和密碼的PasswordAuthentication物件;
2. 呼叫Session.getInstance(Properties, Authenticator)方法獲得Session類的例項物件,並把Authenticator物件註冊到Session物件中。
3. 使用Session物件建立代表郵件訊息內容的Message物件
4. 呼叫Transport.send靜態方法傳送Message物件中的郵件訊息內容。send方法將從Message物件中獲得Session物件的引用,然後將呼叫Session物件中註冊的Authenticator物件從中獲取認證資訊後傳遞給郵件伺服器。或者首先使用Transport的無參connect方法連線郵件伺服器然後使用sendMessage傳送傳送郵件;最後呼叫close方法關閉與郵件伺服器的連線。
public class MyAuthentication extends Authenticator {
private String username;
private String password;
public MyAuthentication(String username, String password) {
this.username = username;
this.password = password;
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
}
public class TransportWithAuthentication {
public static void main(String[] args) throws Exception {
String smtpServer ="smtp.163.com";
String protocol = "smtp";
String username = "XXX";
String password = "XXX";
String from ="
String to = "[email protected] , [email protected]";
String subject = "測試郵件";
String body = "authenticator 測試";
Properties props = new Properties();
props.setProperty("mail.transport.protocol", protocol);
props.setProperty("mail.host", smtpServer);
props.setProperty("mail.smtp.auth", "true");
MyAuthentication authentication = new MyAuthentication(username, password);
Session session = Session.getInstance(props, authentication);
session.setDebug(true);
//建立代表郵件的MimeMessage物件
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(RecipientType.TO, InternetAddress.parse(to));
message.setSentDate(new Date());
message.setSubject(subject);
message.setText(body);
//儲存並且生成郵件物件
message.saveChanges();
//建立傳送郵件的物件
Transport sender = session.getTransport();
Transport.send(message);
//或是使用下面的方法
/* sender.connect();
sender.sendMessage(message, message.getRecipients(RecipientType.TO));
sender.close();*/
}
}
實際上可以使用匿名類實現上面的程式,這種方式的思想就是設計模式中的策略模式(封裝變化)。其程式碼如下:
public class Transport2 {
public static void main(String[] args) throws Exception {
String smtpServer ="smtp.163.com";
String protocol = "smtp";
final String username = "XXX";
final String password = "XXX";
String from ="
String to = "[email protected] ,[email protected]";
String subject = "測試郵件";
String body = "authenticator 測試";
Properties props = new Properties();
props.setProperty("mail.transport.protocol", protocol);
props.setProperty("mail.host", smtpServer);
props.setProperty("mail.smtp.auth", "true");
Session session = Session.getInstance(props,
new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//匿名只能訪問函式內容的final型別的變數,可以訪問外部類的成員變數
return new PasswordAuthentication(username, password);
}
}
);
session.setDebug(true);
//建立代表郵件的MimeMessage物件
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(RecipientType.TO, InternetAddress.parse(to));
message.setSentDate(new Date());
message.setSubject(subject);
message.setText(body);
//儲存並且生成郵件物件
message.saveChanges();
//建立傳送郵件的物件
Transport sender = session.getTransport();
Transport.send(message);
}
}