最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)簡(jiǎn)單郵件發(fā)送

 更新時(shí)間:2016年02月29日 15:23:33   作者:小瓶子  
這篇文章主要介紹了Java實(shí)現(xiàn)簡(jiǎn)單郵件發(fā)送的相關(guān)資料,實(shí)例講解了java郵件發(fā)送實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下

JAVA MAIL是利用現(xiàn)有的郵件賬戶發(fā)送郵件的工具,比如說,我在網(wǎng)易注冊(cè)一個(gè)郵箱賬戶,通過JAVA Mail的操控,我可以不親自登錄網(wǎng)易郵箱,讓程序自動(dòng)的使用網(wǎng)易郵箱發(fā)送郵件。這一機(jī)制被廣泛的用在注冊(cè)激活和垃圾郵件的發(fā)送等方面。
Java郵件發(fā)送的大致過程是這樣的:

1、構(gòu)建一個(gè)繼承自javax.mail.Authenticator的具體類,并重寫里面的getPasswordAuthentication()方法。此類是用作登錄校驗(yàn)的,以確保你對(duì)該郵箱有發(fā)送郵件的權(quán)利。

2、構(gòu)建一個(gè)properties文件,該文件中存放SMTP服務(wù)器地址等參數(shù)。

3、通過構(gòu)建的properties文件和javax.mail.Authenticator具體類來創(chuàng)建一個(gè)javax.mail.Session。Session的創(chuàng)建,就相當(dāng)于登錄郵箱一樣。剩下的自然就是新建郵件。

4、構(gòu)建郵件內(nèi)容,一般是javax.mail.internet.MimeMessage對(duì)象,并指定發(fā)送人,收信人,主題,內(nèi)容等等。

5、使用javax.mail.Transport工具類發(fā)送郵件。

下面是我封裝的代碼,注釋也比較詳細(xì)。

1、首先是繼承自javax.mail.Authenticator的一個(gè)具體類。getPasswordAuthentication()方法也就是構(gòu)建一個(gè)PasswordAuthentication對(duì)象并返回,有點(diǎn)費(fèi)解JAVA Mail這樣的設(shè)計(jì)意圖,可能是javax.mail.Authenticator為我們提供了附加的保證安全的驗(yàn)證措施吧。

package com.mzule.simplemail;
 
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
 
/**
 * 服務(wù)器郵箱登錄驗(yàn)證
 * 
 * @author MZULE
 * 
 */
public class MailAuthenticator extends Authenticator {
 
  /**
   * 用戶名(登錄郵箱)
   */
  private String username;
  /**
   * 密碼
   */
  private String password;
 
  /**
   * 初始化郵箱和密碼
   * 
   * @param username 郵箱
   * @param password 密碼
   */
  public MailAuthenticator(String username, String password) {
  this.username = username;
  this.password = password;
  }
 
  String getPassword() {
  return password;
  }
 
  @Override
  protected PasswordAuthentication getPasswordAuthentication() {
  return new PasswordAuthentication(username, password);
  }
 
  String getUsername() {
  return username;
  }
 
  public void setPassword(String password) {
  this.password = password;
  }
 
  public void setUsername(String username) {
  this.username = username;
  }
 
}

2、郵件發(fā)送類,剩下的步驟都是在這個(gè)類實(shí)現(xiàn)的。代碼中的SimpleMail是封裝了郵件主題和內(nèi)容的一個(gè)POJO。覺得在一個(gè)方法參數(shù)中既包含主題又包含內(nèi)容,不太合適,故重載了此方法。還有就是因?yàn)榇蠖鄶?shù)郵箱的SMTP服務(wù)器地址都是可以通過郵箱地址算出來,簡(jiǎn)單起見,提供了一個(gè)不需要SMTP服務(wù)器地址的構(gòu)造器。

package com.mzule.simplemail;
 
import java.util.List;
import java.util.Properties;
 
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
 
/**
 * 簡(jiǎn)單郵件發(fā)送器,可單發(fā),群發(fā)。
 * 
 * @author MZULE
 * 
 */
public class SimpleMailSender {
 
  /**
   * 發(fā)送郵件的props文件
   */
  private final transient Properties props = System.getProperties();
  /**
   * 郵件服務(wù)器登錄驗(yàn)證
   */
  private transient MailAuthenticator authenticator;
 
  /**
   * 郵箱session
   */
  private transient Session session;
 
  /**
   * 初始化郵件發(fā)送器
   * 
   * @param smtpHostName
   *        SMTP郵件服務(wù)器地址
   * @param username
   *        發(fā)送郵件的用戶名(地址)
   * @param password
   *        發(fā)送郵件的密碼
   */
  public SimpleMailSender(final String smtpHostName, final String username,
    final String password) {
  init(username, password, smtpHostName);
  }
 
  /**
   * 初始化郵件發(fā)送器
   * 
   * @param username
   *        發(fā)送郵件的用戶名(地址),并以此解析SMTP服務(wù)器地址
   * @param password
   *        發(fā)送郵件的密碼
   */
  public SimpleMailSender(final String username, final String password) {
  //通過郵箱地址解析出smtp服務(wù)器,對(duì)大多數(shù)郵箱都管用
  final String smtpHostName = "smtp." + username.split("@")[1];
  init(username, password, smtpHostName);
 
  }
 
  /**
   * 初始化
   * 
   * @param username
   *        發(fā)送郵件的用戶名(地址)
   * @param password
   *        密碼
   * @param smtpHostName
   *        SMTP主機(jī)地址
   */
  private void init(String username, String password, String smtpHostName) {
  // 初始化props
  props.put("mail.smtp.auth", "true");
  props.put("mail.smtp.host", smtpHostName);
  // 驗(yàn)證
  authenticator = new MailAuthenticator(username, password);
  // 創(chuàng)建session
  session = Session.getInstance(props, authenticator);
  }
 
  /**
   * 發(fā)送郵件
   * 
   * @param recipient
   *        收件人郵箱地址
   * @param subject
   *        郵件主題
   * @param content
   *        郵件內(nèi)容
   * @throws AddressException
   * @throws MessagingException
   */
  public void send(String recipient, String subject, Object content)
    throws AddressException, MessagingException {
  // 創(chuàng)建mime類型郵件
  final MimeMessage message = new MimeMessage(session);
  // 設(shè)置發(fā)信人
  message.setFrom(new InternetAddress(authenticator.getUsername()));
  // 設(shè)置收件人
  message.setRecipient(RecipientType.TO, new InternetAddress(recipient));
  // 設(shè)置主題
  message.setSubject(subject);
  // 設(shè)置郵件內(nèi)容
  message.setContent(content.toString(), "text/html;charset=utf-8");
  // 發(fā)送
  Transport.send(message);
  }
 
  /**
   * 群發(fā)郵件
   * 
   * @param recipients
   *        收件人們
   * @param subject
   *        主題
   * @param content
   *        內(nèi)容
   * @throws AddressException
   * @throws MessagingException
   */
  public void send(List<String> recipients, String subject, Object content)
    throws AddressException, MessagingException {
  // 創(chuàng)建mime類型郵件
  final MimeMessage message = new MimeMessage(session);
  // 設(shè)置發(fā)信人
  message.setFrom(new InternetAddress(authenticator.getUsername()));
  // 設(shè)置收件人們
  final int num = recipients.size();
  InternetAddress[] addresses = new InternetAddress[num];
  for (int i = 0; i < num; i++) {
    addresses[i] = new InternetAddress(recipients.get(i));
  }
  message.setRecipients(RecipientType.TO, addresses);
  // 設(shè)置主題
  message.setSubject(subject);
  // 設(shè)置郵件內(nèi)容
  message.setContent(content.toString(), "text/html;charset=utf-8");
  // 發(fā)送
  Transport.send(message);
  }
 
  /**
   * 發(fā)送郵件
   * 
   * @param recipient
   *        收件人郵箱地址
   * @param mail
   *        郵件對(duì)象
   * @throws AddressException
   * @throws MessagingException
   */
  public void send(String recipient, SimpleMail mail)
    throws AddressException, MessagingException {
  send(recipient, mail.getSubject(), mail.getContent());
  }
 
  /**
   * 群發(fā)郵件
   * 
   * @param recipients
   *        收件人們
   * @param mail
   *        郵件對(duì)象
   * @throws AddressException
   * @throws MessagingException
   */
  public void send(List<String> recipients, SimpleMail mail)
    throws AddressException, MessagingException {
  send(recipients, mail.getSubject(), mail.getContent());
  }
 
}

3、調(diào)用上面的郵箱發(fā)送器,可以構(gòu)建一個(gè)工廠類,工廠類可以封裝創(chuàng)建的過程,所以通過讀配置文件獲取郵箱用戶名,密碼都會(huì)變得十分方便。下面的代碼是我在寫觀察者模式的時(shí)候?qū)懙模皇呛?jiǎn)單演示了工廠類。

package com.mzule.dp.observer.factory;
 
import com.mzule.dp.observer.constant.MailSenderType;
import com.mzule.simplemail.SimpleMailSender;
 
/**
 * 發(fā)件箱工廠
 * 
 * @author MZULE
 * 
 */
public class MailSenderFactory {
 
  /**
   * 服務(wù)郵箱
   */
  private static SimpleMailSender serviceSms = null;
 
  /**
   * 獲取郵箱
   * 
   * @param type 郵箱類型
   * @return 符合類型的郵箱
   */
  public static SimpleMailSender getSender(MailSenderType type) {
  if (type == MailSenderType.SERVICE) {
    if (serviceSms == null) {
    serviceSms = new SimpleMailSender("invisible@126.com",
      "hidden");
    }
    return serviceSms;
  }
  return null;
  }
 
}

4、發(fā)送郵件,還是觀察者模式DEMO里面的代碼,呼呼。

package com.mzule.dp.observer.observer;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
 
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
 
import com.mzule.dp.observer.constant.MailSenderType;
import com.mzule.dp.observer.factory.MailSenderFactory;
import com.mzule.dp.observer.po.Product;
import com.mzule.simplemail.SimpleMailSender;
 
public class ProductPriceObserver implements Observer {
 
  @Override
  public void update(Observable obj, Object arg) {
  Product product = null;
  if (obj instanceof Product) {
    product = (Product) obj;
  }
  if (arg instanceof Float) {
    Float price = (Float) arg;
    Float decrease = product.getPrice() - price;
    if (decrease > 0) {
    // 發(fā)送郵件
    SimpleMailSender sms = MailSenderFactory
      .getSender(MailSenderType.SERVICE);
    List<String> recipients = new ArrayList<String>();
    recipients.add("invisible@qq.com");
    recipients.add("invisible@gmail.com");
    try {
      for (String recipient : recipients) {
      sms.send(recipient, "價(jià)格變動(dòng)", "您關(guān)注的物品"
        + product.getName() + "降價(jià)了,由"
        + product.getPrice() + "元降到" + price + "元,降幅達(dá)"
        + decrease + "元人民幣。趕快購物吧。");
      }
    } catch (AddressException e) {
      e.printStackTrace();
    } catch (MessagingException e) {
      e.printStackTrace();
    }
    }
  }
  }
 
}

5、查看郵件是否發(fā)送成功了。
以上就是java郵件發(fā)送的全部過程,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • JDBC如何通過SSL方式連接MySQL

    JDBC如何通過SSL方式連接MySQL

    文章介紹了如何配置MySQL以支持SSL連接,并通過JDBC進(jìn)行安全連接,主要內(nèi)容包括查看MySQL SSL支持、創(chuàng)建SSL連接用戶、配置用戶是否強(qiáng)制使用SSL、JDBC配置導(dǎo)入證書以及使用Go編寫一個(gè)簡(jiǎn)單的HTTP文件服務(wù)器來提供SSL證書
    2025-02-02
  • NameNode?重啟恢復(fù)數(shù)據(jù)的流程詳解

    NameNode?重啟恢復(fù)數(shù)據(jù)的流程詳解

    這篇文章主要為大家介紹了NameNode?重啟恢復(fù)數(shù)據(jù)的流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Java驗(yàn)證碼圖片生成代碼

    Java驗(yàn)證碼圖片生成代碼

    這篇文章主要為大家詳細(xì)介紹了Java驗(yàn)證碼圖片生成代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Java?stream?sorted使用?Comparator?進(jìn)行多字段排序的方法

    Java?stream?sorted使用?Comparator?進(jìn)行多字段排序的方法

    這篇文章主要介紹了Java?stream?sorted使用?Comparator?進(jìn)行多字段排序,主要講解使用Java?Stream流排序器Comparator對(duì)List集合進(jìn)行多字段排序的方法,包括復(fù)雜實(shí)體對(duì)象多字段升降序排序方法,需要的朋友可以參考下
    2023-03-03
  • 實(shí)例講解Java并發(fā)編程之變量

    實(shí)例講解Java并發(fā)編程之變量

    這篇文章主要介紹了實(shí)例講解Java并發(fā)編程之變量,本文講解了編寫線程安全需要關(guān)心的共享變量和可變變量,需要的朋友可以參考下
    2015-04-04
  • 在Mac下IDEA安裝并使用protobuf方式(Java)

    在Mac下IDEA安裝并使用protobuf方式(Java)

    這篇文章主要介紹了在Mac下IDEA安裝并使用protobuf方式(Java),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 每天練一練Java函數(shù)與算法Math函數(shù)總結(jié)與字符串轉(zhuǎn)換整數(shù)

    每天練一練Java函數(shù)與算法Math函數(shù)總結(jié)與字符串轉(zhuǎn)換整數(shù)

    這篇文章主要介紹了Java函數(shù)與算法Math函數(shù)總結(jié)與字符串轉(zhuǎn)換整數(shù),每天練一練,水平在不知不覺中提高,需要的朋友快過來看看吧
    2021-08-08
  • java8根據(jù)某一屬性過濾去重的實(shí)例

    java8根據(jù)某一屬性過濾去重的實(shí)例

    這篇文章主要介紹了java8根據(jù)某一屬性過濾去重的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • springboot連接不同數(shù)據(jù)庫的寫法詳解

    springboot連接不同數(shù)據(jù)庫的寫法詳解

    這篇文章主要介紹了springboot連接不同數(shù)據(jù)庫的寫法?,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Struts2開發(fā)環(huán)境搭建 附簡(jiǎn)單登錄功能實(shí)例

    Struts2開發(fā)環(huán)境搭建 附簡(jiǎn)單登錄功能實(shí)例

    這篇文章主要介紹了Struts2開發(fā)環(huán)境搭建,為大家分享一個(gè)簡(jiǎn)單登錄功能實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11

最新評(píng)論

西林县| 安吉县| 民丰县| 桂平市| 奉节县| 虹口区| 寿阳县| 宜黄县| 广饶县| 云南省| 丹阳市| 义马市| 郑州市| 武陟县| 安丘市| 铅山县| 东山县| 当阳市| 松原市| 游戏| 永吉县| 仪征市| 吉木萨尔县| 观塘区| 台江县| 大悟县| 娄烦县| 海丰县| 广灵县| 资中县| 赤水市| 瑞丽市| 邵阳市| 承德市| 南澳县| 深水埗区| 吉隆县| 辰溪县| 和硕县| 绍兴市| 大田县|