最近因毕设需要做一个局域网邮件管理系统,邮件服务器采用的是易邮邮件服务器(貌似不支持imap)。我的思路从邮件服务器读取邮件(采用POP3协议),存入mysql数据库中。自己写的客户端再从数据库里提取数据。
分割线———————————————————————————
问题:每次执行存储操作的时候,从邮件服务器里获取邮件后再插入到数据库就会报错,原因是执行上一次插入操作时已经将原有的数据插入了,字段重复。例如上次操作,从邮件服务器获得了4封邮件,插入了4条数据。当有1封新邮件的时候,从邮件服务器里获得了(4+1)封邮件,插入数据时,原来的4条数据重复。我的思路是:每次从服务器获取完邮件后,就将服务器里的邮件删除或标记为已读。问题随之而来,当使用语句:
message.setFlag(Flags.Flag.DELETED,TRUE);
message.saveChanges();
标记服务器里的邮件Flag时,就会报P0P3Message is  read_only错误。
改用IMAP协议时,也出现IMAPMesage is read only错误。
请问:这问题该怎么解决,有没有更好的思路,这问题困扰了近1个月了。求指导啊!!!!(因代码篇幅太大,无法粘贴)javamail read only 

解决方案 »

  1.   

    POP3协议中,已读标记是无效的。可以通过将邮件服务器中邮件对应的UID和自己数据库中存储邮件对应的UID进行比较,如果不存在则插入,如果存在,就不插入数据。
      

  2.   

    1.P0P3Message is  read_only 这是说明邮件服务器设置了只读操作,不能删除!这样的话你可以改一下邮箱配置,看看能不能改!如果是自己的邮箱服务器肯定是可以改的,如果只是自己的账户应该也是可以改的(目前我用的所有邮箱都可以用协议删除).2.如果你找不到配置,你可以先判断数据库是否有改邮件,如果有则跳过,没有插入!(注:每个邮件都能取得自己的唯一编号)
      

  3.   

    自己稀里糊涂给解决了,问题出在saveChanges()语句上,将其注释掉,也能达到效果。还是谢谢了。