又一個新的項目啟動了,雖說目前還處於系統設計階段,但從當前的系統需求來看,其中有一項功能就是通過Web方式發送系統郵件。還是提前做好準備吧,還說不錯,花了一下午的時間,把封裝了一個MailService類,直接調用即可。此篇僅介紹用javamail實現發送郵件功能,其中涉及smtp認證,郵件附件發送,及HTML內容郵件等。
系統內容:Windows XP SP3
開發環境:Eclipse 3.5/JDK 1.6/Struts2/Tiles
測試載入器:Firefox 3.6/IE 8
測試郵箱:網易郵箱、IBM Lotus Notes郵箱
所需JAR包:mail.jar(包含MailService.java類檔案) 一 二
MailService.java類檔案(經過封裝的發送郵件類):
- package com.olympus.Util;
-
- import java.util.Date;
- import java.util.Properties;
-
- import javax.activation.DataHandler;
- import javax.activation.FileDataSource;
- import javax.mail.Authenticator;
- import javax.mail.Multipart;
- import javax.mail.PasswordAuthentication;
- import javax.mail.Session;
- import javax.mail.Transport;
- import javax.mail.internet.InternetAddress;
- import javax.mail.internet.MimeBodyPart;
- import javax.mail.internet.MimeMessage;
- import javax.mail.internet.MimeMultipart;
- import javax.mail.internet.MimeUtility;
-
- public class MailService extends Authenticator {
- private String m_username = null;
- private String m_userpass = null;
-
- public void setUsername(String username) {
- m_username = username;
- }
-
- public void setUserpass(String userpass) {
- m_userpass = userpass;
- }
-
- public MailService(String username, String userpass) {
- super();
- setUsername(username);
- setUserpass(userpass);
- }
-
- public PasswordAuthentication getPasswordAuthentication() {
- return new PasswordAuthentication(m_username,m_userpass);
- }
-
- public static void sendmail(
- String subject, String from,
- String[] to, String text,
- String[] filenames,String mimeType) throws Exception
- {
- Properties props = new Properties();
- String smtp = "smtp.163.com"; //設定發送郵件所用到的SMTP伺服器位址
- String smtpname = "username"; //設定登入SMTP伺服器的使用者名稱
- String smtppassword = "password"; //設定登入SMTP伺服器的密碼
-
- Session mailSession; //郵件會話對象
- MimeMessage mimeMsg; //MIME郵件對象
- props = java.lang.System.getProperties(); //獲得系統屬性對象
-
- props.put("mail.smtp.host", smtp); //設定SMTP主機
- props.put("mail.smtp.auth", "true"); //連結到SMTP伺服器是否需要使用者名稱和密碼驗證
-
- //到伺服器驗證發送的使用者名稱和密碼是否正確
- MailService myEmailAuther = new MailService(smtpname, smtppassword);
- //設定郵件會話
- mailSession = Session.getInstance(props, (Authenticator) myEmailAuther);
- Transport transport = mailSession.getTransport("smtp"); //設定傳輸協議
- mimeMsg = new MimeMessage(mailSession); //設定from、to等資訊
-
- InternetAddress sentFrom = new InternetAddress(from);
- mimeMsg.setFrom(sentFrom); //設定發送人地址
- InternetAddress[] sendTo = new InternetAddress[to.length];
-
- for (int i = 0; i < to.length; i++) {
- //System.out.println("發送到:" + to[i]);
- sendTo[i] = new InternetAddress(to[i]);
- }
-
- mimeMsg.setRecipients(MimeMessage.RecipientType.TO, sendTo);
- mimeMsg.setSubject(subject, "utf-8");
- MimeBodyPart messageBodyPart1 = new MimeBodyPart();
- //messageBodyPart.setText(UnicodeToChinese(text));
- messageBodyPart1.setContent(text, mimeType);
- Multipart multipart = new MimeMultipart();//附件傳輸格式
- multipart.addBodyPart(messageBodyPart1);
-
- for (int i = 0; i < filenames.length; i++) {
- MimeBodyPart messageBodyPart2 = new MimeBodyPart();
- String filename = filenames[i].split(",")[0]; //選擇出每一個附件名
- String displayname = filenames[i].split(",")[1];
- FileDataSource fds = new FileDataSource(filename); //得到資料來源
- //得到附件本身並至入BodyPart
- messageBodyPart2.setDataHandler(new DataHandler(fds));
- //得到檔案名稱同樣至入BodyPart
- //messageBodyPart2.setFileName(displayname);
- //messageBodyPart2.setFileName(fds.getName());
- messageBodyPart2.setFileName(MimeUtility.encodeText(displayname));
- multipart.addBodyPart(messageBodyPart2);
- }
-
- mimeMsg.setContent(multipart);
- mimeMsg.setSentDate(new Date()); //設定信件頭的發送日期
- mimeMsg.saveChanges();
- Transport.send(mimeMsg); //發送郵件
- transport.close();
- }
- }
在Action中調用
- @Action(value="//",
- results={@Result(name="success", location="index",type="tiles")})
- public String Index(){
- String sendTo[] = {"liang.xu@ohc.olympus.com.hk"};
- String fileNames[] = {};
- try {
- MailService.sendmail(
- "JavaWeb發送郵件測試", "Alex Xu<xht555@163.com>",
- sendTo, "JavaWeb發送郵件測試",
- fileNames, "text/html;charset=utf-8");
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- return SUCCESS;
- }
- 測試結果
- 我的網易郵箱顯示郵件發送成功:② 我的工作郵箱(IBM Lotus Notes)成功接收到來自網易郵箱發出的郵件:
: