zoukankan      html  css  js  c++  java
  • JavaMail接收指定账号邮件

    JavaMail接收指定邮箱账号的邮件

    /**
    *
    *
    @author archie
    * 接收指定账号的邮件
    */
    public class ReceiveMail {

    /**
    * Message实现了Part接口,它表示一个邮件消息,包含一系列的属性和一个消息内容。
    * 消息属性包括了消息址址消息,定义了消息内容的结构(包括内容类型),
    * 消息内容使用DataHandler对象包装实际数据。当邮件消息位于目录(folder)中时,
    * 系统还使用了一个标志位集合来描述它的状态。
    */
    private MimeMessage msg = null;

    private String saveAttchPath = "";//保存附件路径
    private StringBuffer bodytext = new StringBuffer();//邮件内容
    private String dateformate = "yy-MM-dd HH:mm";//日期格式化

    public ReceiveMail(MimeMessage msg){
    this.msg = msg;
    }
    public void setMsg(MimeMessage msg) {
    this.msg = msg;
    }

    /**
    * 获取发送邮件者信息
    *
    @return
    *
    @throws MessagingException
    */
    public String getFrom() throws MessagingException{
    InternetAddress[] address
    = (InternetAddress[]) msg.getFrom();
    String from
    = address[0].getAddress();
    if(from == null){
    from
    = "";
    }
    String personal
    = address[0].getPersonal();
    if(personal == null){
    personal
    = "";
    }
    String fromaddr
    = personal +"<"+from+">";
    return fromaddr;
    }

    /**
    * 获取邮件收件人,抄送,密送的地址和信息。根据所传递的参数不同
    * "to"-->收件人,"cc"-->抄送人地址,"bcc"-->密送地址
    *
    @param type
    *
    @return
    *
    @throws MessagingException
    *
    @throws UnsupportedEncodingException
    */
    public String getMailAddress(String type) throws MessagingException, UnsupportedEncodingException{
    String mailaddr
    = "";
    String addrType
    = type.toUpperCase();
    InternetAddress[] address
    = null;

    if(addrType.equals("TO")||addrType.equals("CC")||addrType.equals("BCC")){
    if(addrType.equals("TO")){
    address
    = (InternetAddress[]) msg.getRecipients(Message.RecipientType.TO);
    }
    if(addrType.equals("CC")){
    address
    = (InternetAddress[]) msg.getRecipients(Message.RecipientType.CC);
    }
    if(addrType.equals("BCC")){
    address
    = (InternetAddress[]) msg.getRecipients(Message.RecipientType.BCC);
    }

    if(address != null){
    for(int i=0;i<address.length;i++){
    String mail
    = address[i].getAddress();
    if(mail == null){
    mail
    = "";
    }
    else{
    mail
    = MimeUtility.decodeText(mail);
    }
    String personal
    = address[i].getPersonal();
    if(personal == null){
    personal
    = "";
    }
    else{
    personal
    = MimeUtility.decodeText(personal);
    }
    String compositeto
    = personal +"<"+mail+">";
    mailaddr
    += ","+compositeto;
    }
    mailaddr
    = mailaddr.substring(1);
    }
    }
    else{
    throw new RuntimeException("Error email Type!");
    }
    return mailaddr;
    }

    /**
    * 获取邮件主题
    *
    @return
    *
    @throws UnsupportedEncodingException
    *
    @throws MessagingException
    */
    public String getSubject() throws UnsupportedEncodingException, MessagingException{
    String subject
    = "";
    /**
    * 指定subject编码为javamail方式编码
    * 编码内容的字符集是系统字符集
    */
    subject
    = MimeUtility.decodeText(msg.getSubject());
    if(subject == null){
    subject
    = "";
    }
    return subject;
    }

    /**
    * 获取邮件发送日期
    *
    @return
    *
    @throws MessagingException
    */
    public String getSendDate() throws MessagingException{
    Date sendDate
    = msg.getSentDate();//邮件发送日期
    SimpleDateFormat smd = new SimpleDateFormat(dateformate);
    return smd.format(sendDate);
    }

    /**
    * 获取邮件正文内容
    *
    @return
    */
    public String getBodyText(){

    return bodytext.toString();
    }

    /**
    * 解析邮件,将得到的邮件内容保存到一个stringBuffer对象中,解析邮件 主要根据MimeType的不同执行不同的操作,一步一步的解析
    *
    @param part
    *
    @throws MessagingException
    *
    @throws IOException
    */
    public void getMailContent(Part part) throws MessagingException, IOException{

    String contentType
    = part.getContentType();
    int nameindex = contentType.indexOf("name");
    boolean conname = false;
    if(nameindex != -1){
    conname
    = true;
    }
    System.out.println(
    "CONTENTTYPE:"+contentType);
    if(part.isMimeType("text/plain")&&!conname){
    bodytext.append((String)part.getContent());
    }
    else if(part.isMimeType("text/html")&&!conname){
    bodytext.append((String)part.getContent());
    }
    else if(part.isMimeType("multipart/*")){
    Multipart multipart
    = (Multipart) part.getContent();
    int count = multipart.getCount();
    for(int i=0;i<count;i++){
    getMailContent(multipart.getBodyPart(i));
    }
    }
    else if(part.isMimeType("message/rfc822")){
    getMailContent((Part) part.getContent());
    }

    }

    /**
    * 判断邮件是否需要回执,如需回执返回true,否则返回false
    *
    @return
    *
    @throws MessagingException
    */
    public boolean getReplySign() throws MessagingException{
    boolean replySign = false;
    String needreply[]
    = msg.getHeader("Disposition-Notification-TO");//回执
    if(needreply != null){
    replySign
    = true;
    }
    return replySign;
    }

    /**
    * 获取此邮件的message-id
    *
    @return
    *
    @throws MessagingException
    */
    public String getMessageId() throws MessagingException{
    return msg.getMessageID();
    }

    /**
    * 判断此邮件是否已读,如果未读则返回false,已读返回true
    *
    @return
    *
    @throws MessagingException
    */
    public boolean isNew() throws MessagingException{
    boolean isnew = false;
    Flags flags
    = ((Message)msg).getFlags();
    Flags.Flag[] flag
    = flags.getSystemFlags();
    System.out.println(
    "flags''s length:"+flag.length);
    for(int i=0;i<flag.length;i++){
    if(flag[i]==Flags.Flag.SEEN){
    isnew
    = true;
    System.out.println(
    "seen message .......");
    break;
    }
    }

    return isnew;
    }

    /**
    * 判断是是否包含附件
    *
    @param part
    *
    @return
    *
    @throws MessagingException
    *
    @throws IOException
    */
    public boolean isContainAttch(Part part) throws MessagingException, IOException{
    boolean flag = false;

    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);
    String dispostion
    = bodypart.getDisposition();
    if((dispostion != null)&&(dispostion.equals(Part.ATTACHMENT)||dispostion.equals(Part.INLINE))){
    flag
    = true;
    }
    else if(bodypart.isMimeType("multipart/*")){
    flag
    = isContainAttch(bodypart);
    }
    else{
    String conType
    = bodypart.getContentType();
    if(conType.toLowerCase().indexOf("appliaction")!=-1){
    flag
    = true;
    }
    if(conType.toLowerCase().indexOf("name")!=-1){
    flag
    = true;
    }
    }
    }
    }
    else if(part.isMimeType("message/rfc822")){
    flag
    = isContainAttch((Part) part.getContent());
    }

    return flag;
    }

    /**
    * 保存附件
    *
    @param part
    *
    @throws MessagingException
    *
    @throws IOException
    */
    public void saveAttchMent(Part part) throws MessagingException, IOException{
    String filename
    = "";
    if(part.isMimeType("multipart/*")){
    Multipart mp
    = (Multipart) part.getContent();
    for(int i=0;i<mp.getCount();i++){
    BodyPart mpart
    = mp.getBodyPart(i);
    String dispostion
    = mpart.getDisposition();
    if((dispostion != null)&&(dispostion.equals(Part.ATTACHMENT)||dispostion.equals(Part.INLINE))){
    filename
    = mpart.getFileName();
    if(filename.toLowerCase().indexOf("gb2312")!=-1){
    filename
    = MimeUtility.decodeText(filename);
    }
    saveFile(filename,mpart.getInputStream());
    }
    else if(mpart.isMimeType("multipart/*")){
    saveAttchMent(mpart);
    }
    else{
    filename
    = mpart.getFileName();
    if(filename != null&&(filename.toLowerCase().indexOf("gb2312")!=-1)){
    filename
    = MimeUtility.decodeText(filename);
    }
    saveFile(filename,mpart.getInputStream());
    }
    }

    }
    else if(part.isMimeType("message/rfc822")){
    saveAttchMent((Part) part.getContent());
    }
    }
    /**
    * 获得保存附件的地址
    *
    @return
    */
    public String getSaveAttchPath() {
    return saveAttchPath;
    }
    /**
    * 设置保存附件地址
    *
    @param saveAttchPath
    */
    public void setSaveAttchPath(String saveAttchPath) {
    this.saveAttchPath = saveAttchPath;
    }
    /**
    * 设置日期格式
    *
    @param dateformate
    */
    public void setDateformate(String dateformate) {
    this.dateformate = dateformate;
    }
    /**
    * 保存文件内容
    *
    @param filename
    *
    @param inputStream
    *
    @throws IOException
    */
    private void saveFile(String filename, InputStream inputStream) throws IOException {
    String osname
    = System.getProperty("os.name");
    String storedir
    = getSaveAttchPath();
    String sepatror
    = "";
    if(osname == null){
    osname
    = "";
    }

    if(osname.toLowerCase().indexOf("win")!=-1){
    sepatror
    = "//";
    if(storedir==null||"".equals(storedir)){
    storedir
    = "d://temp";
    }
    }
    else{
    sepatror
    = "/";
    storedir
    = "/temp";
    }

    File storefile
    = new File(storedir+sepatror+filename);
    System.out.println(
    "storefile''s path:"+storefile.toString());

    BufferedOutputStream bos
    = null;
    BufferedInputStream bis
    = null;

    try {
    bos
    = new BufferedOutputStream(new FileOutputStream(storefile));
    bis
    = new BufferedInputStream(inputStream);
    int c;
    while((c= bis.read())!=-1){
    bos.write(c);
    bos.flush();
    }
    }
    catch (FileNotFoundException e) {
    e.printStackTrace();
    }
    catch (IOException e) {
    e.printStackTrace();
    }
    finally{
    bos.close();
    bis.close();
    }

    }
    /**
    * 接收邮件
    *
    @param part
    *
    @param i
    *
    @throws MessagingException
    *
    @throws IOException
    */
    public void recive(Part part,int i) throws MessagingException, IOException{
    System.out.println(
    "------------------START-----------------------");
    System.out.println(
    "Message"+i+" 主题subject:" + getSubject());
    System.out.println(
    "Message"+i+" 发件人from:" + getFrom());
    System.out.println(
    "Message"+i+" 是否阅读isNew:" + isNew());
    boolean flag = isContainAttch(part);
    System.out.println(
    "Message"+i+" 是否包含附件isContainAttch:" +flag);
    System.out.println(
    "Message"+i+" 是否需要回执replySign:" + getReplySign());
    getMailContent(part);
    System.out.println(
    "Message"+i+" 邮件内容content:" + getBodyText());


    //附件目录不存在则创建该目录
    try {
    if (!(new File("f://temp//"+i).isDirectory())) {
    new File("f://temp//"+i).mkdir();
    }
    }
    catch (SecurityException e) {
    //e.printStackTrace();
    }
    //设置保存附件路径
    setSaveAttchPath("f://temp//"+i);

    if(flag){
    saveAttchMent(part);
    }
    System.out.println(
    "------------------END-----------------------"+i);
    }


    /**
    * 测试主方法
    *
    @param args
    *
    @throws MessagingException
    *
    @throws IOException
    */
    public static void main(String[] args) throws MessagingException, IOException {

    /**
    * 初始化服务器环境
    * session类定义了与远程邮件系统通信的邮件会话
    * 它只是用于存储与服务器建立连接会话相关信息和逻辑。
    */
    Properties props
    = new Properties();
    props.setProperty(
    "mail.smtp.host", "smtp.163.com");
    props.setProperty(
    "mail.smtp.auth", "true");
    Session session
    = Session.getDefaultInstance(props,null);
    /**
    * 第1个参数为接受协议,第2个参数为邮件接收服务器的地址,
    * 第三个参数为pop3协议的端口,最后两个为用户名和密码
    */
    URLName urlname
    = new URLName("pop3","pop.163.com",110,null,"zhangjie7275019@163.com*******","13938");

    /**
    * java.mail.Store 该类实际特定邮件协议上的读,写,监视,查找等操作
    */
    Store store
    = session.getStore(urlname);
    store.connect();
    //连接邮件服务器
    Folder folder = store.getFolder("INBOX");//收件箱
    folder.open(Folder.READ_ONLY);//以只读方式打开收件箱
    Message msgs[] = folder.getMessages();//得到文件夹信息,获取邮件列表
    int count = msgs.length;
    System.out.println(
    "Message Count:"+count);
    ReceiveMail rm
    = null;

    System.out.println(
    "该账号邮件数目:"+count);

    for(int i=0;i<count;i++){
    rm
    = new ReceiveMail((MimeMessage) msgs[i]);
    rm.recive(msgs[i],i);;
    System.out.println(
    "=============================邮件分隔线========================");
    }
    // 释放资源
    try {
    if (folder != null)
    folder.close(
    false);
    if (store != null)
    store.close();
    }
    catch (Exception ex) {
    ex.printStackTrace();
    }

    }

    }
  • 相关阅读:
    redis
    dom4j-1.6.1.jar与dom4j-1.4.jar
    runoob
    session失效后,登录页面嵌入iframe框架
    log4j.properties 详解与配置步骤
    maven+swagger
    Eclipse建立Maven项目后无法建立src/main/java资源文件夹
    vue 3.x 相对于 vue 2.x 的重大修改
    面试准备
    JS系列
  • 原文地址:https://www.cnblogs.com/archie2010/p/2098191.html
Copyright © 2011-2022 走看看