【転送】JAVAメール送信の簡単実現

11394 ワード

記事のソース:http://www.cnblogs.com/codeplus/archive/2011/10/30/2229391.html
 
JAVA MAILは既存のメールアカウントを利用してメールを送るツールです.例えば、網易でメールアカウントを登録して、JAVA Mailの操作を通じて、直接網易メールアドレスに登録しないで、プログラムを自動的に網易メールアドレスでメールを送ります.このメカニズムは登録の活性化や迷惑メールの送信などに広く使われている.
JavaMailはhttp://www.oracle.com/technetwork/java/javamail/index-138643.htmlにダウンロードして、mail.jarをclassipathに追加すればいいです.JAVA EE SDKを使っているなら、C:\glassfish v 3\glassfish\modules\mail.jarで必要なjarカバンを見つけてもいいです.追加のclassipathが必要です.
JAVAメールの発送の大体の過程はこのようなものです.
1、javax.mail.Authenticatorから引き継ぐ具体的なクラスを構築し、中のgetPassword Authentication()方法を書き換える.このような場合は、メールを送信する権利があることを確認するために登録検査として使用されます.
2、SMTPサーバアドレスなどのパラメータを格納するpropertiesファイルを構築する.
3、構築されたpropertiesファイルとjavax.mail.Authenticatorの具体的なクラスを通じてjavax.mail.Sessionを作成します.Sessionの作成は、メールボックスに登録するのと同じです.残りはもちろん新築メールです.
4、メールの内容を構築するには、通常はjavax.mail.internet.MimeMessageの対象となり、送信者、受信者、テーマ、内容などを指定します.
5、javax.mail.Transportツールを使ってメールを送ります.
以下は私のパッケージのコードです.コメントも詳細です.ふふ~ん
1、まずjavax.mail.Authenticatorからの具体的なクラスを継承します.getPassword Authentication()方法とは、Password Authenticationのオブジェクトを構築して返していくことであり、JAVA Mailのような設計意図を理解するのがちょっと難しいです.javax.mail.Authenticatorが追加的に安全を保証する検証措置を提供してくれたのかもしれません.
package com.mzule.simplemail;
 
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
 
/**
 *          
 * 
 * @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、メール送信クラス、残りのステップはこのクラスで実施されます.コードの中のSimpleMailは、メールの件名と内容をパッケージ化したPOJOです.一つの方法パラメータにはテーマも含まれているし、内容も含まれているので、あまり適切ではないと思います.また、ほとんどのメールボックスのSMTPサーバアドレスはメールアドレスで計算できるので、簡単にSMTPサーバアドレスを必要としないコンストラクタを提供します.
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;
 
/**
 *        ,   ,  。
 *
 * @author MZULE
 *
 */
public class SimpleMailSender {
 
    /**
     *      props  
     */
    private final transient Properties props = System.getProperties();
    /**
     *          
     */
    private transient MailAuthenticator authenticator;
 
    /**
     *   session
     */
    private transient Session session;
 
    /**
     *         
     *
     * @param smtpHostName
     *                SMTP       
     * @param username
     *                        (  )
     * @param password
     *                       
     */
    public SimpleMailSender(final String smtpHostName, final String username,
        final String password) {
    init(username, password, smtpHostName);
    }
 
    /**
     *         
     *
     * @param username
     *                        (  ),     SMTP     
     * @param password
     *                       
     */
    public SimpleMailSender(final String username, final String password) {
    //         smtp   ,         
    final String smtpHostName = "smtp." + username.split("@")[1];
    init(username, password, smtpHostName);
 
    }
 
    /**
     *    
     *
     * @param username
     *                        (  )
     * @param password
     *                  
     * @param smtpHostName
     *                SMTP    
     */
    private void init(String username, String password, String smtpHostName) {
    //    props
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.host", smtpHostName);
    //   
    authenticator = new MailAuthenticator(username, password);
    //   session
    session = Session.getInstance(props, authenticator);
    }
 
    /**
     *     
     *
     * @param recipient
     *                       
     * @param subject
     *                    
     * @param content
     *                    
     * @throws AddressException
     * @throws MessagingException
     */
    public void send(String recipient, String subject, Object content)
        throws AddressException, MessagingException {
    //   mime    
    final MimeMessage message = new MimeMessage(session);
    //      
    message.setFrom(new InternetAddress(authenticator.getUsername()));
    //      
    message.setRecipient(RecipientType.TO, new InternetAddress(recipient));
    //     
    message.setSubject(subject);
    //       
    message.setContent(content.toString(), "text/html;charset=utf-8");
    //   
    Transport.send(message);
    }
 
    /**
     *     
     *
     * @param recipients
     *                    
     * @param subject
     *                  
     * @param content
     *                  
     * @throws AddressException
     * @throws MessagingException
     */
    public void send(List<String> recipients, String subject, Object content)
        throws AddressException, MessagingException {
    //   mime    
    final MimeMessage message = new MimeMessage(session);
    //      
    message.setFrom(new InternetAddress(authenticator.getUsername()));
    //       
    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);
    //     
    message.setSubject(subject);
    //       
    message.setContent(content.toString(), "text/html;charset=utf-8");
    //   
    Transport.send(message);
    }
 
    /**
     *     
     *
     * @param recipient
     *                       
     * @param mail
     *                    
     * @throws AddressException
     * @throws MessagingException
     */
    public void send(String recipient, SimpleMail mail)
        throws AddressException, MessagingException {
    send(recipient, mail.getSubject(), mail.getContent());
    }
 
    /**
     *     
     *
     * @param recipients
     *                    
     * @param mail
     *                    
     * @throws AddressException
     * @throws MessagingException
     */
    public void send(List<String> recipients, SimpleMail mail)
        throws AddressException, MessagingException {
    send(recipients, mail.getSubject(), mail.getContent());
    }
 
}
 
3、上記のメール送信機を呼び出して、工場類を構築し、工場類はパッケージ作成の過程ができるので、設定ファイルを読んでメールアドレスを取得すると、パスワードが非常に便利になります.次のコードは観察者モードを書く時に書いたものです.工場種類を簡単に実証しました.
package com.mzule.dp.observer.factory;
 
import com.mzule.dp.observer.constant.MailSenderType;
import com.mzule.simplemail.SimpleMailSender;
 
/**
 *      
 *
 * @author MZULE
 *
 */
public class MailSenderFactory {
 
    /**
     *     
     */
    private static SimpleMailSender serviceSms = null;
 
    /**
     *     
     *
     * @param type     
     * @return        
     */
    public static SimpleMailSender getSender(MailSenderType type) {
    if (type == MailSenderType.SERVICE) {
        if (serviceSms == null) {
        serviceSms = new SimpleMailSender("[email protected]",
            "hidden");
        }
        return serviceSms;
    }
    return null;
    }
 
}

4、    ,       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) {
        //     
        SimpleMailSender sms = MailSenderFactory
            .getSender(MailSenderType.SERVICE);
        List<String> recipients = new ArrayList<String>();
        recipients.add("[email protected]");
        recipients.add("[email protected]");
        try {
            for (String recipient : recipients) {
            sms.send(recipient, "    ", "      "
                + product.getName() + "   , "
                + product.getPrice() + "   " + price + " ,   "
                + decrease + "    。     。");
            }
        } catch (AddressException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        }
    }
    }
 
}
 
5、残りはメールが送信されたかどうかを確認することです.ふふ~ん