2015年1月1日 星期四

Javamail for google

原文出處: 龍貓 的心情日記
http://supermand9362787.wordpress.com/2008/11/02/javamail-for-google/

利用JavaMail收/發Gmail郵件(SSL)

Gmail目前已經啟用了POP3和SMTP服務,具體情況請看 http://www.javayou.com/showlog.jspe?log_id=490
與其他郵箱不同的是Gmail提供的POP3和SMTP是使用安全套接字層SSL的,因此常規的JavaMail程序是無法收發郵件的,下面是使用JavaMail如何收取Gmail郵件以及發送郵件的代碼:
1. 郵件收取
package lius.javamail.ssl;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeUtility;
/**
* 用於收取Gmail郵件
* @author Winter Lau
*/
public class GmailFetch {
public static void main(String argv[]) throws Exception {
  Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
  final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
  // Get a Properties object
  Properties props = System.getProperties();props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
  props.setProperty("mail.pop3.socketFactory.fallback", "false");props.setProperty("mail.pop3.port", "995");
  props.setProperty("mail.pop3.socketFactory.port", "995");
  //以下步驟跟一般的JavaMail操作相同
  Session session = Session.getDefaultInstance(props,null);
  //請將紅色部分對應替換成你的郵箱帳號和密碼
  URLName urln = new URLName("pop3","pop.gmail.com",995,null,"[郵箱帳號]", "[郵箱密碼]");
  Store store = session.getStore(urln);
  Folder inbox = null;
  try {
      store.connect();
      inbox = store.getFolder("INBOX");
      inbox.open(Folder.READ_ONLY);
      FetchProfile profile = new FetchProfile();
      profile.add(FetchProfile.Item.ENVELOPE);
      Message[] messages = inbox.getMessages();
      inbox.fetch(messages, profile);
      System.out.println("收件箱的郵件數:" + messages.length);
      for (int i = 0; i < messages.length; i++) {
         //郵件發送者
         String from = decodeText(messages[i].getFrom()[0].toString());
         InternetAddress ia = new InternetAddress(from);
         System.out.println("FROMia.getPersonal()+'(‘+ia.getAddress()+’)’);
         //郵件標題
         System.out.println("TITLEmessages[i].getSubject());
         //郵件大小
         System.out.println("SIZEmessages[i].getSize());
         //郵件發送時間
         System.out.println("DATEmessages[i].getSentDate());
     }
   } finally {
     try {
         inbox.close(false);
     } catch (Exception e) {}
         try {
             store.close();
         } catch (Exception e) {}
     }
   }

   protected static String decodeText(String text)
         throws UnsupportedEncodingException {
    if (text == null)
       return null;
    if (text.startsWith("=?GB") || text.startsWith("=?gb"))
        text = MimeUtility.decodeText(text);
    else
         text = new String(text.getBytes("ISO8859_1"));
     return text;
   }
}
2. 發送郵件
package lius.javamail.ssl;
import java.security.Security;
import java.util.Date;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/**
* 使用Gmail發送郵件
* @author Winter Lau
*/
public class GmailSender {
   public static void main(String[] args) throws AddressException, MessagingException {
      Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
      final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
      // Get a Properties object
      Properties props = System.getProperties();
      props.setProperty("mail.smtp.host", "smtp.gmail.com");
      props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
      props.setProperty("mail.smtp.socketFactory.fallback", "false");
      props.setProperty("mail.smtp.port", "465");
      props.setProperty("mail.smtp.socketFactory.port", "465");
      props.put("mail.smtp.authrue");
      final String username = "[郵箱帳號]";
      final String password = "[郵箱密碼]";
      Session session = Session.getDefaultInstance(props, new Authenticator()
      {
          protected PasswordAuthentication getPasswordAuthentication() {
             return new PasswordAuthentication(username, password);
          }
      }
   );
   // — Create a new message –
   Message msg = new MimeMessage(session);
   // — Set the FROM and TO fields –
   msg.setFrom(new InternetAddress(username + "@mo168.com"));
   msg.setRecipients(Message.RecipientType.TO,
   InternetAddress.parse("[收件人地址]",false));
   msg.setSubject("Hello");
   msg.setText("How are you");
   msg.setSentDate(new Date());
   Transport.send(msg);
   System.out.println("Message.");
 }
}

沒有留言:

Java 不同編碼字串, 其字串長度大小計算

以 Java 開發專案, 在 DAO 寫入資料庫時, 常遇到JAVA 字串與資料庫編碼不一致, 有時會產生字串過長,導致無法寫入資料庫的情況. 這時就要在入庫前, 先驗證 JAVA 編碼字串是否超出資料庫欄位長度 JAVA 依 不同編碼, 其長度是不一樣的 如: ...