java 邮件 接收与发送
阅读原文时间:2023年07月08日阅读:1

package com.e6soft;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.search.BodyTerm;
import javax.mail.search.SearchTerm;
import javax.mail.Address;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import org.quartz.impl.jdbcjobstore.DBSemaphore;

import com.e6soft.base.service.JService;
import com.sun.mail.imap.IMAPMessage;
import com.sun.mail.imap.IMAPFolder;
import com.sun.mail.imap.IMAPStore;

public class MainTest extends JService{

static String HOST = "smtp.163.com"; // smtp服务器  
static String FROM = "\*\*\*\*@163.com"; // 发件人地址

//static String TO = "\*\*\*\*\*\*@qq.com"; // 收件人地址  
//static String AFFIX = "E:\\\\安装手册-6.3.5.doc"; // 附件地址  
//static String AFFIXNAME = "安装手册-6.3.5.doc"; // 附件名称

static String USER = "\*\*\*\*\*\*"; // 用户名  
static String PWD = "\*\*\*\*\*\*\*\*\*\*"; // 163的授权码

//static String SUBJECT = "您愿望单中的 2 件物品正在促销!"; // 邮件标题  
//static String\[\] TOS = TO.split(",");

public static void main(String\[\] args) {  
    MainTest mainTest=new MainTest();  
    //mainTest.send("123456@qq.com","Your registration is complete!","注册验证您好 123456@qq.com!欢迎注册码云,请将验证码填写到注册页面。验证码:\*\*\*\*\*\*","");  

     //(以上是) 发送的邮箱,标题,内容,
//mainTest.send("请尽快配合申请工作");
mainTest.getEmailList();
}

/\* 发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- 收件人  
      本质上就是:  
            编写MUA把邮件发到MTA;  
            编写MUA从MDA上收邮件。  
    发邮件时,MUA和MTA使用的协议就是SMTP:Simple Mail Transfer Protocol,后面的MTA到另一个MTA也是用SMTP协议。  
    收邮件时,MUA和MDA使用的协议有两种:POP:Post Office Protocol

    在MyEclipse中,会自动给web项目导入javax.mail包中的类,但是不全(其实是只有接口,而没有接口的实现类),所以只靠MyEclipse中的类是不能运行java mail项目的,但是如果这时你再去自行导入mail.jar时,就会出现冲突。

    java mail中主要类:javax.mail.Session、javax.mail.internet.MimeMessage、javax.mail.Transport。  
        Session:表示会话,即客户端与邮件服务器之间的会话!想获得会话需要给出账户和密码,当然还要给出服务器名称。在邮件服务中的Session对象,就相当于连接数据库时的Connection对象。  
        MimeMessage:表示邮件类,它是Message的子类。它包含邮件的主题(标题)、内容,收件人地址、发件人地址,还可以设置抄送和暗送,甚至还可以设置附件。  
        Transport:用来发送邮件。它是发送器!  
 \*/  
/\* 以下是参考 // 接收  
public static void s() throws IOException{  
    System.out.print("请输入用户名:");  
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));  
    String userName = in.readLine();  
    System.out.print("请输入密码:");  
    String password = in.readLine();  
    BASE64Encoder encoder = new BASE64Encoder();  
    System.out.println("编码后的用户名为:" + encoder.encode(userName.getBytes()));  
    System.out.println("编码后的密码为:" + encoder.encode(password.getBytes()));

    BASE64Decoder decoder = new BASE64Decoder();  
    //邮件主题的Base64编码  
    String emailSubject = "=?GBK?B?08q8/rLiytQ=?=";  
    //邮件文本内容的Base64编码  
    String emailPlainContent = "vPK1pbXE08q8/reiy82y4srUo6E=";  
    //带html标签和邮件内容的Base64编码  
    String emailHtmlContent = "PFA+vPK1pbXE08q8/reiy82y4srUo6E8L1A+";  
    //将使用Base64编码过后的文本内容再使用Base64来解码  
    emailSubject = new String(decoder.decodeBuffer(emailSubject),"GBK");  
    emailPlainContent = new String(decoder.decodeBuffer(emailPlainContent),"GBK");  
    emailHtmlContent = new String(decoder.decodeBuffer(emailHtmlContent),"GBK");  
    System.out.println("邮件标题:"+emailSubject);  
    System.out.println("邮件内容:"+emailPlainContent);  
    System.out.println("带html标签的邮件内容:"+emailHtmlContent);  
}  
// 接收  
public static void ss() throws Exception{  
    //收件人地址  
    String recipientAddress = "xxx@163.com";  
    //收件人账户名  
    String recipientAccount = "xxx";  
    //收件人账户密码  
    String recipientPassword = "xxx";

    //1、连接邮件服务器的参数配置  
    Properties props = new Properties();  
    //设置传输协议  
    props.setProperty("mail.store.protocol", "pop3");  
    //设置收件人的POP3服务器  
    props.setProperty("mail.pop3.host", "pop3.163.com");  
    //2、创建定义整个应用程序所需的环境信息的 Session 对象  
    Session session = Session.getInstance(props);  
    //设置调试信息在控制台打印出来  
    //session.setDebug(true);

    Store store = session.getStore("pop3");  
    //连接收件人POP3服务器  
    store.connect("pop3.163.com", recipientAccount, recipientPassword);  
    //获得用户的邮件账户,注意通过pop3协议获取某个邮件夹的名称只能为inbox  
    Folder folder = store.getFolder("inbox");  
    //设置对邮件账户的访问权限  
    folder.open(Folder.READ\_WRITE);

    //得到邮件账户的所有邮件信息  
    Message \[\] messages = folder.getMessages();  
    for(int i = 0 ; i < messages.length ; i++){  
        //获得邮件主题  
        String subject = messages\[i\].getSubject();  
        //获得邮件发件人  
        Address\[\] from = messages\[i\].getFrom();  
        //获取邮件内容(包含邮件内容的html代码)  
        String content = (String) messages\[i\].getContent();  
    }

    //关闭邮件夹对象

    folder.close(false);

    //关闭连接对象  
    store.close();  
}  
\*/

/\*\*  
 \* 发送邮件  
 \*     sjrdz 收件人地址  
 \*     bt 标题  
 \*     context 内容  
 \* @param host  
 \* @param user  
 \* @param pwd  
 \*/  
public static void send(String sjrdz,String bt,String context,String fjId) {  
    MainTest MainTest=new MainTest();  
    String \[\]TOS=sjrdz.split(",");  
    Properties props = new Properties(); // Session 对象利用了java.util.Properties对象获得了邮件服务器、用户名、密码信息  和整个应用程序都要使用到的 共享信息  
    props.put("mail.smtp.host", HOST);//设置发送邮件的邮件服务器的属性(这里使用网易的smtp服务器)  
    props.put("mail.smtp.auth", "true");  //需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有这一条)  
    Session session = Session.getDefaultInstance(props);//用props对象构建一个session  
    session.setDebug(true);  
    MimeMessage message = new MimeMessage(session);//用session为参数定义消息对象  
    try {  
        message.setFrom(new InternetAddress(FROM));// 加载发件人地址  
        InternetAddress\[\] sendTo = new InternetAddress\[TOS.length\]; // 加载收件人地址  
        for (int i = 0; i < TOS.length; i++) {  
            sendTo\[i\] = new InternetAddress(TOS\[i\]);  
        }  
        message.addRecipients(Message.RecipientType.TO,sendTo);  
        message.addRecipients(MimeMessage.RecipientType.CC, InternetAddress.parse(FROM));//设置在发送给收信人之前给自己(发送方)抄送一份,不然会被当成垃圾邮件,报554错  
        message.setSubject(bt);//加载标题  
        Multipart multipart = new MimeMultipart();//向multipart对象中添加邮件的各个部分内容,包括文本内容和附件  
        BodyPart contentPart = new MimeBodyPart();//设置邮件的文本内容  
        contentPart.setText(context);  
        multipart.addBodyPart(contentPart);

        if(!fjId.isEmpty()){//添加附件  
            String sqlString="select t.file\_extend,t.file\_info\_id,t.file\_filename,t.file\_url from T\_P\_FILE\_INFO t where t.file\_index='"+fjId+"' ";  
            List<Map<String, Object>> list=MainTest.dBSelect(sqlString);  
             for(int i=0;i<list.size();i++){  
                 BodyPart messageBodyPart = new MimeBodyPart();  
                 String AFFIX=System.getProperty("catalina.home")+"/webapps/webdav/"+list.get(i).get("file\_info\_id")+"."+list.get(i).get("file\_extend");  
                 String AFFIXNAME=list.get(i).get("file\_filename").toString();  
                 DataSource source = new FileDataSource(AFFIX);  
                 messageBodyPart.setDataHandler(new DataHandler(source));//添加附件的内容  
                 sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();//添加附件的标题  
                 messageBodyPart.setFileName("=?GBK?B?"+ enc.encode(AFFIXNAME.getBytes()) + "?=");  
                 multipart.addBodyPart(messageBodyPart);  
             }

        }  
        message.setContent(multipart);//将multipart对象放到message中  
        message.saveChanges(); //保存邮件  
        Transport transport = session.getTransport("smtp");//发送邮件  
        transport.connect(HOST, USER, PWD);//连接服务器的邮箱  
        transport.sendMessage(message, message.getAllRecipients());//把邮件发送出去  
        transport.close();//关闭连接  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
}

//获取邮件列表  
public void getEmailList(){  
    Properties props = new Properties(); //1、连接邮件服务器的参数配置

    props.put("mail.store.protocol", "imap"); //设置传输协议  
    props.put("mail.imap.host", "imap.163.com"); //设置收件人的POP3服务器  
    //props.put("mail.imap.port", "143");  
    props.put("mail.imap.auth.plain.disable","true");  
    Session session = Session.getDefaultInstance(props); //2、创建定义整个应用程序所需的环境信息的 Session 对象  
    Store store;  
    try {  
        store = session.getStore("imap"); //连接收件人POP3服务器  
        store.connect("imap.163.com",USER, PWD);  
        Folder folder = store.getFolder("INBOX"); //获得用户的邮件账户,注意通过pop3协议获取某个邮件夹的名称只能为inbox  
        folder.open(Folder.READ\_WRITE); //设置对邮件账户的访问权限  
        //SearchTerm search= new BodyTerm("test");  
        //Message\[\] messages = folder.search(search);  //得到邮件账户的所有邮件信息  
        Message\[\] messages = folder.getMessages();  
        for (int i = 0 ; i < messages.length; i++){  
            Message msg = messages\[i\];

            InternetAddress address =  (InternetAddress) msg.getFrom()\[0\];  
            System.out.println(" \[ #" + i + " \] ");  
            System.out.println( "Subject : " + msg.getSubject()); // 回复的标题  
                //Subject : 回复:Your registration is complete!  
            System.out.println("From : " + address.getPersonal() + "<" + address.getAddress() + ">"); // 回复人的名称和邮箱  
                //From : " Follow your heart "<935220462@qq.com>  
            System.out.println("ContentType : " + msg.getContentType());  //内容类型  
                //ContentType : multipart/alternative;  
                //    boundary="----=\_NextPart\_5CA330D9\_0A968A68\_5C0E2915"  
            //Message表示一个邮件,msg.getContent()返回一个Multipart对象。一个Multipart对象包含一个或多个BodyPart对象,来组成邮件的正文部分(包括附件)。  
            System.out.println("Content Detail : " + msg.getContent().toString()); // 内容细节  
                //Content Detail : javax.mail.internet.MimeMultipart@12bc6874  
            System.out.println("时间 : " + msg.getSentDate()); // 日期和时间 

            if(msg.isMimeType("multipart/\*")){  
                Multipart mp = (Multipart)msg.getContent();  
                int bodynum = mp.getCount();  
                for(int j=0; j<bodynum; j++){  
                    if(mp.getBodyPart(j).isMimeType("text/html")){  
                        String content = (String)mp.getBodyPart(j).getContent();  
                        System.out.print("邮件内容:"+content);  
                    }  
                }  
            }else{  
                System.out.println("不支持的邮件类型!");  
            }  
        }  
        folder.close(false);  
        store.close();  
    } catch (NoSuchProviderException e) {  
        // TODO Auto-generated catch block  
        e.printStackTrace();  
    } catch (MessagingException e) {  
        // TODO Auto-generated catch block  
        e.printStackTrace();  
    } catch (IOException e) {  
        // TODO Auto-generated catch block  
        e.printStackTrace();  
    }

}

/\*\*  
 \* 解析综合数据  
 \* @param part  
 \* @throws Exception  
 \*/  
private static void getAllMultipart(Part part) throws Exception{  
 String contentType = part.getContentType();  
 int index = contentType.indexOf("name");  
 boolean conName = false;  
 if(index!=-1){  
  conName=true;  
 }  
 //判断part类型  
 if(part.isMimeType("text/plain") && ! conName) {  
  System.out.println((String) part.getContent());  
 }else if (part.isMimeType("text/html") && ! conName) {  
  System.out.println((String) part.getContent());  
 }else if (part.isMimeType("multipart/\*")) {  
  Multipart multipart = (Multipart) part.getContent();  
  int counts = multipart.getCount();  
  for (int i = 0; i < counts; i++) {  
   //递归获取数据  
   getAllMultipart(multipart.getBodyPart(i));  
   //附件可能是截图或上传的(图片或其他数据)  
   if (multipart.getBodyPart(i).getDisposition() != null) {  
    //附件为截图  
    if (multipart.getBodyPart(i).isMimeType("image/\*")) {  
     InputStream is = multipart.getBodyPart(i)  
       .getInputStream();  
     String name = multipart.getBodyPart(i).getFileName();  
     String fileName;  
     //截图图片  
     if(name.startsWith("=?")){  
      fileName = name.substring(name.lastIndexOf(".") - 1,name.lastIndexOf("?="));  
     }else{  
      //上传图片  
      fileName = name;  
     }

     FileOutputStream fos = new FileOutputStream("D:\\\\"  
       + fileName);  
     int len = 0;  
     byte\[\] bys = new byte\[1024\];  
     while ((len = is.read(bys)) != -1) {  
      fos.write(bys,0,len);  
     }  
     fos.close();  
    } else {  
     //其他附件  
     InputStream is = multipart.getBodyPart(i)  
       .getInputStream();  
     String name = multipart.getBodyPart(i).getFileName();  
     FileOutputStream fos = new FileOutputStream("D:\\\\"  
       + name);  
     int len = 0;  
     byte\[\] bys = new byte\[1024\];  
     while ((len = is.read(bys)) != -1) {  
      fos.write(bys,0,len);  
     }  
     fos.close();  
    }  
   }  
  }  
 }else if (part.isMimeType("message/rfc822")) {  
  getAllMultipart((Part) part.getContent());  
 }  
}

/\*\*  
 \* 解析附件内容  
 \* @param part  
 \* @throws Exception  
 \*/  
private static void getAttachmentMultipart(Part part) throws Exception{  
 if(part.isMimeType("multipart/\*")){  
  Multipart multipart = (Multipart) part.getContent();  
  int count = multipart.getCount();  
  for (int i = 0; i < count; i++) {  
   BodyPart bodyPart = multipart.getBodyPart(i);  
   if(bodyPart.getDisposition()!=null){  
    InputStream is = bodyPart.getInputStream();  
    FileOutputStream fos=new FileOutputStream("路径+文件名");  
    int len=0;  
    byte\[\] bys=new byte\[1024\];  
    while((len=is.read(bys))!=-1){  
     fos.write(bys, 0, len);  
    }  
    fos.close();  
   }  
  }  
 }

}  
/\*\*  
 \* 解析图片内容  
 \* @param part  
 \* @throws Exception  
 \*/  
private static void getPicMultipart(Part part) throws Exception{  
 if(part.isMimeType("multipart/\*")){  
  Multipart multipart = (Multipart) part.getContent();  
  int count = multipart.getCount();  
  for (int i = 0; i < count; i++) {  
   BodyPart bodyPart = multipart.getBodyPart(i);  
   if(bodyPart.isMimeType("image/\*")){  
    InputStream is = bodyPart.getInputStream();  
    FileOutputStream fos=new FileOutputStream("路径+文件名");  
    int len=0;  
    byte\[\] bys=new byte\[1024\];  
    while((len=is.read(bys))!=-1){  
     fos.write(bys, 0, len);  
    }  
    fos.close();  
   }  
  }  
 }  
}  
/\*\*  
 \* 解析文本内容  
 \* @param part  
 \* @throws Exception  
 \*/  
private static void getTextMultipart(Part part) throws Exception{  
 if(part.isMimeType("text/html")){  
  String content = (String) part.getContent();  
  System.out.println(content);  
 }else if(part.isMimeType("text/plain")){  
  String content = (String) part.getContent();  
  System.out.println(content);  
 }

}

}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器