Java Mail 发送邮件 JMail 多人 解决乱码 带附件

package net.guoguoda.admin.common.utils;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
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 SendMail {
    /*
    * POP3/SMTP协议
    * 收发邮件服务器地址分别如下。
    * 接收邮件服务器:pop.exmail.qq.com (端口 110)
    * 发送邮件服务器:smtp.exmail.qq.com (端口 25)
    * 同时支持SSL加密方式登录,此时需要更改一下端口号。
    * 接收服务器端口:995
    * 发送服务器端口:465
    * IMAP协议
    * 接收邮件服务器:imap.exmail.qq.com
    * 如果使用SSL加密方式,接收服务器端口是: 993
    */
    private final static String HOST = "smtp.exmail.qq.com";    
    private final static String SENDTYPE = "smtp";
    public static void sendTxtMail(String from,String password,String to,File file){
        
        /* 
         * SMTP 的全称是“Simple Mail Transfer Protocol
         * 即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。
         * SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。
         * SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。
         * SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。
         * 增加 SMTP认证的目的是为了使用户避免受到垃圾邮件的侵扰
         */
        /*
         * IMAP全称是Internet Mail Access Protocol,
         * 即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。
         * 不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,
         * 如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。
         * 所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。
         */
        //设置邮件参数
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", SENDTYPE);//邮件传输协议方式
        props.put("mail.smtp.host", HOST);//腾讯smtp服务器地址
        props.put("mail.smtp.auth", true);//是否需要smtp验证
        /*
         * 此处需要集成Authenticator类,重写getPasswordAuthentication方法
         */
        MailAuthenticator myauth = new MailAuthenticator(from,password);//验证账户和密码
        Session session = Session.getInstance(props,myauth);
        session.setDebug(true);//打开debug模式,会打印发送细节到console 
        /*
         * message是邮件的载体,一封完整的邮件包括:
         * 发件人,接收人,发送方式(TO - 收件人;CC - 抄送人;BCC - 暗送人),标题(subject),内容(content)
         * 
         */
        Message message =new MimeMessage(session);
        try{
            //设置邮件标题
            message.setSubject("配送表发送");
            //设置邮件发送人
            message.setFrom(new InternetAddress(from));
            //设置邮件收件人
            InternetAddress target = new InternetAddress(to);
            message.setRecipient(Message.RecipientType.TO,target);
            /*
             * Message表示一个邮件,messgaes.getContent()返回一个Multipart对象    
             * 一个Multipart对象包含一个或多个BodyPart对象,来组成邮件的正文部分(包括附件)
             * Multipart是一个容器它转载多个body Part(正文、附件或内嵌资源)
             */
            Multipart multipart = new MimeMultipart();
            BodyPart bodyPart = new MimeBodyPart();
            bodyPart.setContent("","text/html;charset=utf8");
            multipart.addBodyPart(bodyPart);
            /*
             * 添加附件
             */
            bodyPart = new MimeBodyPart();
            DataSource dataSource = new FileDataSource(file.getAbsolutePath());
            DataHandler dataHandler = new DataHandler(dataSource);
            bodyPart.setDataHandler(dataHandler);            
            /*
             * 邮件头(参见RFC822,RFC2047)只能包含US-ASCII字符。邮件头中任何包含非US-ASCII字符的部分必须进行编码,使其只包含US-ASCII字符。
             * 所以使用java mail发送中文邮件必须经过编码,否则别人收到你的邮件只能是乱码一堆。
             * 不过使用java mail 包的解决方法很简单,用它自带的MimeUtility工具中encode开头的方法(如encodeText)对中文信息进行编码就可以了。
             * 通常对邮件头的编码方式有2种,一种是base64方式编码,一种是QP(quoted-printable)方式编码,javamail根据具体情况来选择编码方式。
             */
            String name =  MimeUtility.encodeText(file.getName(),"gb2312","B");
            bodyPart.setFileName(name);
            multipart.addBodyPart(bodyPart);
            
            message.setContent(multipart);
            //方式一
//            Transport transport = session.getTransport(SENDTYPE);
//            transport.connect("smtp.exmail.qq.com",25,from, password);
//            transport.sendMessage(message, message.getAllRecipients());
//            transport.close();
            //方式二
            Transport.send(message);
        }catch(MessagingException  e){
            System.out.println(e.getMessage()); 
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
    public static void sendTxtMail(String from,String password,String to)  
    {  
       Properties props = new Properties();  
       props.put("mail.smtp.host", HOST); //smtp服务器地址  
       props.setProperty("mail.transport.protocol", "smtp");
       props.put("mail.smtp.auth", false);  //是否需要认证  
         
       /**实例化一个验证里,继承abstract Authenticator 
        * 实现     
        *   protected PasswordAuthentication getPasswordAuthentication(){ 
        *       return new PasswordAuthentication(userName,password); 
        *   } 
        */   
//       MailAuthenticator myauth = new MailAuthenticator("admin@guoguoda.net","zaq12wsx~");  
       //获得一个带有authenticator的session实例  
       Session session = Session.getInstance(props);  
       session.setDebug(true);//打开debug模式,会打印发送细节到console  
       Message message = new MimeMessage(session); //实例化一个MimeMessage集成自abstract Message 。参数为session  
       try  
       {  
       message.setFrom(new InternetAddress(from)); //设置发出方,使用setXXX设置单用户,使用addXXX添加InternetAddress[]  
  
       message.setText("只是一个简简单单的文本内容哟!"); //设置文本内容 单一文本使用setText,Multipart复杂对象使用setContent    
       message.setSubject("只是简简单单的文本标题哟!"); //设置标题   
       message.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); //设置接收方  
       Transport transport = session.getTransport(SENDTYPE);
       transport.connect(HOST,25,from, password);
       transport.sendMessage(message, message.getAllRecipients());
       transport.close();
       
       }catch(AddressException e)  
       {  
           //此处处理AddressException异常  [The exception thrown when a wrongly formatted address is encountered.]   
           System.out.println(e.getMessage());
       }catch(MessagingException e){  
           System.out.println(e.getMessage());
           //此处处理MessagingException异常 [The base class for all exceptions thrown by the Messaging classes ]  
       }catch(RuntimeException e){
           System.out.println(e.getMessage());
       }  
         
    }  
    public static void main(String[] args){
        File file = new File("文件路径");
        SendMail.sendTxtMail("发件人邮箱","发件人邮箱密码","收件人邮箱",file);
    }
}

 参考博客:http://magician8421.iteye.com/blog/702017

 

posted @ 2015-08-07 17:13  HelloWorld!!!好难啊  阅读(746)  评论(0编辑  收藏  举报