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();
    }

    }

    }
  • 相关阅读:
    mac 10.15.7 修改PATH
    oc 属性类型一般用法
    ubuntu解压zip文件名乱码
    telnet 退出
    docker 根据容器创建镜像
    mac android adb device 没有显示设备
    Yii2 查看所有的别名 alias
    Yii2 App Advanced 添加 .gitignore
    ubuntu 18.04 搜狗突然就提示乱码
    An error occured while deploying the file. This probably means that the app contains ARM native code and your Genymotion device cannot run ARM instructions. You should either build your native code to
  • 原文地址:https://www.cnblogs.com/archie2010/p/2098191.html
Copyright © 2011-2022 走看看