zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【第三章】DI的配置使用(一)
    【第二章】IoC的配置使用(一)
    【第二章】IoC的基础与详解(一)
    【第一章】 Spring概述(二)
    【第一章】 Spring概述(一)
    数据库分库分表思路
    Java的内存模型JVM
    Servlet 单例多线程详细解释
    三极管
    续流二极管
  • 原文地址:https://www.cnblogs.com/LoveHe/p/4711381.html
Copyright © 2011-2022 走看看