一、用JavaMail從GMail寄信
因為GMail講求安全性,所以在Java Mail的設定上會比較複雜, SMTP 伺服器的通訊埠設為 465 (適用 SSL/TLS) 和 587 (適用 STARTTLS),而在這個例子,我們使用STARTTLS,這個協定就是為了加密從用戶端到伺服器端的連線,會對EMAIL在寄送時更加安全。另外,GMail也有開啟SMTP AUTH的功能,所以我們要得到使用者的帳號密碼才可以寄送。
而如果你有開兩步驟,需要另外建立一個「應用程式密碼」;沒有開兩步驟,則是需要開起「允許安全性較低的應用程式」才能夠正確執行,要不然會報錯。
部份程式碼:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
private static void sendFromGMail(String from, String pass, String[] to, | |
String subject, String body) { | |
Properties props = System.getProperties(); | |
String host = "smtp.gmail.com"; | |
// 下面設定是根據GMail官方文件所寫的,開啟TLS以及SMTP AUTH | |
props.put("mail.smtp.starttls.enable", "true"); | |
props.put("mail.smtp.host", host); | |
props.put("mail.smtp.user", from); | |
props.put("mail.smtp.password", pass); | |
props.put("mail.smtp.port", "587"); | |
props.put("mail.smtp.auth", "true"); | |
Session session = Session.getDefaultInstance(props); | |
MimeMessage message = new MimeMessage(session); | |
try { | |
message.setFrom(new InternetAddress(from)); | |
InternetAddress[] toAddress = new InternetAddress[to.length]; | |
// To get the array of addresses | |
for (int i = 0; i < to.length; i++) { | |
toAddress[i] = new InternetAddress(to[i]); | |
} | |
for (int i = 0; i < toAddress.length; i++) { | |
message.addRecipient(Message.RecipientType.TO, toAddress[i]); | |
} | |
message.setSubject(subject); | |
message.setText(body); | |
Transport transport = session.getTransport("smtp"); | |
transport.connect(host, from, pass); | |
transport.sendMessage(message, message.getAllRecipients()); | |
transport.close(); | |
} catch (AddressException ae) { | |
ae.printStackTrace(); | |
} catch (MessagingException me) { | |
me.printStackTrace(); | |
} | |
} |
完整程式碼:
https://github.com/jimc1682000/JavaMailLab/blob/master/src/tw/com/jimmy/lab/SendFromGMailUsingJavaMailLab.java
Ref:
http://pclevin.blogspot.tw/2014/11/java-mail-gmail-smtp-server.html
https://support.google.com/mail/answer/78775?hl=zh-Hant
二、用EWS API從Exchange寄信
其實這個也沒有相當困難,官方的WIKI文件也都寫得蠻清楚的,比較要注意的是,因為EWS他有用上Apache的一些HttpClient相關套件,所以請一併加入。另外就是Exchange很強大,本身就有AutoDiscover的功能,如果你的環境當中有開啟,那就可以像我這個例子直接使用,如果沒有的話,就要另外去設定URI和一些相關參數,這個部份也要注意一下。還有就是在你使用AutoDiscover的時候,是可以使用Redirect的CallBack,我在例子裡面也有放入,可以一併使用。
部份程式碼:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static void main(String[] args) { | |
ExchangeService service = new ExchangeService( | |
ExchangeVersion.Exchange2010); | |
ExchangeCredentials credentials = new WebCredentials( | |
"myaccount@my.domain", "myPassword", "my.domain"); | |
service.setCredentials(credentials); | |
try { | |
service.autodiscoverUrl("myaccount@my.domain", | |
new RedirectionUrlCallback()); | |
EmailMessage msg = new EmailMessage(service); | |
msg.setSubject("Hello EWS!"); | |
msg.setBody(MessageBody | |
.getMessageBodyFromText("Sent using the EWS Java API.")); | |
msg.getToRecipients().add("myaccount2@my.domain"); | |
msg.send(); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
public static class RedirectionUrlCallback implements | |
IAutodiscoverRedirectionUrl { | |
public boolean autodiscoverRedirectionUrlValidationCallback( | |
String redirectionUrl) { | |
return redirectionUrl.toLowerCase().startsWith("https://"); | |
} | |
} |
完整程式碼:
https://github.com/jimc1682000/JavaMailLab/blob/master/src/tw/com/jimmy/lab/EwsLab.java
沒有留言:
張貼留言