javamail(1.5.2)无法获取网易邮箱的邮件列表(IMAP协议)

javamail(1.5.2)无法获取网易邮箱的邮件列表(IMAP协议),第1张

遇到同样的问题,,A3 NO SELECT The login is not safe! Please update your mail client: >pop3由于本身不提供Flag的功能,所以一般来说没有办法判断通过pop3得到的message是否已读
但是有些服务商会在header里面加入message是否已读的信息
可以尝试用messagegetHeader(String name)得到header的信息,比如用
messagegetHeader("Status")
或许可以得到是否已读的信息(或许而已,因为这条语句成功与否取决于服务商是否加入该信息,以及使用的名字是否为"Status")
如果需要查看所有的header来判断这个服务商是否加入了message的状态信息,可以用
messagegetAllHeaders() (返回的是Enumeration<Header>)
来获取所有的header然后一个个检查,如果里面没有的话,就没有办法了

imap提供Flag,可以用
messagegetFlags()getSystemFlags();
得到 Flag[], 然后去看其是否不为空,并且包括FlagSEEN ,如果是,则为已读,反之则未读
例如下面这个method可以返回message已读的状态 (true=已读,false=未读):
需要的imports:
import javaxmailMessage;
import javaxmailMessagingException;
import javaxmailFlagsFlag;
代码:
private boolean isRead(Message message)
throws MessagingException {
Flag[] flags = messagegetFlags()getSystemFlags();
for (Flag f : flags) {
if (fequals(FlagSEEN))
return true;
}
return false;
}
希望这些可以帮到你

package comghyutil;

import javaioBufferedInputStream;
import javaioBufferedOutputStream;

import javaioFile;
import javaioFileOutputStream;
import javaioIOException;
import javaioInputStream;

import javatextSimpleDateFormat;
import javautilDate;
import javautilProperties;

import javaxmailBodyPart;
import javaxmailFlags;
import javaxmailFolder;
import javaxmailMessage;
import javaxmailMessagingException;
import javaxmailMultipart;

import javaxmailPart;
import javaxmailSession;
import javaxmailStore;
import javaxmailinternetInternetAddress;
import javaxmailinternetMimeMessage;
import javaxmailinternetMimeUtility;

public class PraseMimeMessage{
private MimeMessage mimeMessage=null;
private String saveAttachPath="";//附件下载后的存放目录
private StringBuffer bodytext=new StringBuffer();
//存放邮件内容的StringBuffer对象
private String dateformat="yy-MM-dd HH:mm";//默认的日前显示格式
/
 构造函数,初始化一个MimeMessage对象
/
public PraseMimeMessage() {
}
public PraseMimeMessage(MimeMessage mimeMessage) {
thismimeMessage=mimeMessage;
}
public void setMimeMessage(MimeMessage mimeMessage){
thismimeMessage=mimeMessage;
}
/
 获得发件人的地址和姓名
/
public String getFrom1()throws Exception{
InternetAddress address[]=(InternetAddress[])mimeMessagegetFrom();
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"---密送人地址
@throws Exception /
public String getMailAddress(String type){
String mailaddr="";
try {
String addtype=typetoUpperCase();
InternetAddress []address=null;
if(addtypeequals("TO")||addtypeequals("CC")||addtypeequals("BBC")){
if(addtypeequals("TO")){
address=(InternetAddress[])mimeMessagegetRecipients(MessageRecipientTypeTO);
}
else if(addtypeequals("CC")){
address=(InternetAddress[])mimeMessagegetRecipients(MessageRecipientTypeCC);
}
else{
address=(InternetAddress[])mimeMessagegetRecipients(MessageRecipientTypeBCC);
}
if(address!=null){
for (int i = 0; i < addresslength; i++) {
String email=address[i]getAddress();
if(email==null)email="";
else{
email=MimeUtilitydecodeText(email);
}
String personal=address[i]getPersonal();
if(personal==null)personal="";
else{
personal=MimeUtilitydecodeText(personal);
}
String compositeto=personal+"<"+email+">";
mailaddr+=","+compositeto;
}
mailaddr=mailaddrsubstring(1);
}
}
else{
}
} catch (Exception e) {
// TODO: handle exception
}
return mailaddr;
}
/
获得邮件主题
/
public String getSubject()
{
String subject="";
try {
subject=MimeUtilitydecodeText(mimeMessagegetSubject());
if(subject==null)subject="";
} catch (Exception e) {
// TODO: handle exception
}
return subject;
}
/
获得邮件发送日期
/
public String getSendDate()throws Exception{
Date senddate=mimeMessagegetSentDate();
SimpleDateFormat format=new SimpleDateFormat(dateformat);
return formatformat(senddate);
}
/
解析邮件,把得到的邮件内容保存到一个StringBuffer对象中,解析邮件
主要是根据MimeType类型的不同执行不同的 *** 作,一步一步的解析
/
public void getMailContent(Part part)throws Exception{
String contenttype=partgetContentType();
int nameindex=contenttypeindexOf("name");
boolean conname=false;
if(nameindex!=-1)conname=true;
if(partisMimeType("text/plain")&&!conname){
bodytextappend((String)partgetContent());
}else if(partisMimeType("text/html")&&!conname){
bodytextappend((String)partgetContent());
}
else if(partisMimeType("multipart/")){
Multipart multipart=(Multipart)partgetContent();
int counts=multipartgetCount();
for(int i=0;i<counts;i++){
getMailContent(multipartgetBodyPart(i));
}
}else if(partisMimeType("message/rfc822")){
getMailContent((Part)partgetContent());
}
else{}
}
/
 获得邮件正文内容
/
public String getBodyText(){
return bodytexttoString();
}
/
判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"

@throws MessagingException /
public boolean getReplySign() throws MessagingException{
boolean replysign=false;
String needreply[]=mimeMessagegetHeader("Disposition-Notification-To");
if(needreply!=null){
replysign=true;
}
return replysign;
}
/
 获得此邮件的Message-ID
@throws MessagingException /
public String getMessageId() throws MessagingException{
return mimeMessagegetMessageID();
}

/
 判断此邮件是否已读,如果未读返回返回false,反之返回true
@throws MessagingException /
public boolean isNew() throws MessagingException{
boolean isnew =false;
Flags flags=((Message)mimeMessage)getFlags();
FlagsFlag[]flag=flagsgetSystemFlags();
for (int i = 0; i < flaglength; i++) {
if(flag[i]==FlagsFlagSEEN){
isnew=true;
break;
}
}
return isnew;
}
/
 判断此邮件是否包含附件
@throws MessagingException /
public boolean isContainAttach(Part part) throws Exception{
boolean attachflag=false;
String contentType=partgetContentType();
if(partisMimeType("multipart/")){
Multipart mp=(Multipart)partgetContent();
//获取附件名称可能包含多个附件
for(int j=0;j<mpgetCount();j++){
BodyPart mpart=mpgetBodyPart(j);
String disposition=mpartgetDescription();
if((disposition!=null)&&((dispositionequals(PartATTACHMENT))||(dispositionequals(PartINLINE)))){
attachflag=true;
}else if(mpartisMimeType("multipart/")){
attachflag=isContainAttach((Part)mpart);
}else{
String contype=mpartgetContentType();
if(contypetoLowerCase()indexOf("application")!=-1) attachflag=true;
if(contypetoLowerCase()indexOf("name")!=-1) attachflag=true;
}
}
}else if(partisMimeType("message/rfc822")){
attachflag=isContainAttach((Part)partgetContent());
}
return attachflag;
}
/
 保存附件
@throws Exception
@throws IOException
@throws MessagingException
@throws Exception /
public void saveAttachMent(Part part) throws Exception {
String fileName="";
if(partisMimeType("multipart/")){
Multipart mp=(Multipart)partgetContent();
for(int j=0;j<mpgetCount();j++){
BodyPart mpart=mpgetBodyPart(j);
String disposition=mpartgetDescription();
if((disposition!=null)&&((dispositionequals(PartATTACHMENT))||(dispositionequals(PartINLINE)))){
fileName=mpartgetFileName();
if(fileNametoLowerCase()indexOf("GBK")!=-1){
fileName=MimeUtilitydecodeText(fileName);
}
saveFile(fileName,mpartgetInputStream());
}
else if(mpartisMimeType("multipart/")){
fileName=mpartgetFileName();
}
else{
fileName=mpartgetFileName();
if((fileName!=null)){
fileName=MimeUtilitydecodeText(fileName);
saveFile(fileName,mpartgetInputStream());
}
}
}
}
else if(partisMimeType("message/rfc822")){
saveAttachMent((Part)partgetContent());
}
}
/
 设置附件存放路径
/
public void setAttachPath(String attachpath){
thissaveAttachPath=attachpath;
}

/
 设置日期显示格式
/
public void setDateFormat(String format){
thisdateformat=format;
}

/
 获得附件存放路径
/

public String getAttachPath()
{
return saveAttachPath;
}
/
 真正的保存附件到指定目录里
/
private void saveFile(String fileName,InputStream in)throws Exception{
String osName=SystemgetProperty("osname");
String storedir=getAttachPath();
String separator="";
if(osName==null)osName="";
if(osNametoLowerCase()indexOf("win")!=-1){
//如果是window *** 作系统
separator="/";
if(storedir==null||storedirequals(""))storedir="c:\tmp";
}
else{
//如果是其他的系统
separator="/";
storedir="/tmp";
}
File strorefile=new File(storedir+separator+fileName);
BufferedOutputStream bos=null;
BufferedInputStream bis=null;
try {
bos=new BufferedOutputStream(new FileOutputStream(strorefile));
bis=new BufferedInputStream(in);
int c;
while((c=bisread())!=-1){
boswrite(c);
bosflush();
}
} catch (Exception e) {
// TODO: handle exception
}finally{
bosclose();
bisclose();
}
}
/
 PraseMimeMessage类测试

@throws Exception /
public static void main(String[] args) throws Exception {
String host="pop3sinacomcn";
String username="guohuaiyong70345";
String password="071120";
Properties props=new Properties();
Session session=SessiongetDefaultInstance(props,null);
Store store=sessiongetStore("pop3");
storeconnect(host,username,password);
Folder folder=storegetFolder("INBOX");
folderopen(FolderREAD_ONLY);
Message message[]=foldergetMessages();
PraseMimeMessage pmm=null;
for (int i = 0; i < messagelength; i++) {
Systemoutprintln("第"+(i+1)+"封邮件");
pmm=new PraseMimeMessage((MimeMessage)message[i]);
Systemoutprintln("主题 :"+pmmgetSubject());
pmmsetDateFormat("yy年MM月dd日 HH:mm");
Systemoutprintln("发送时间 :"+pmmgetSendDate());
Systemoutprintln("是否回执 :"+pmmgetReplySign());
Systemoutprintln("是否包含附件 :"+pmmisContainAttach((Part)message[i]));
Systemoutprintln("发件人 :"+pmmgetFrom1());
Systemoutprintln("收件人 :"+pmmgetMailAddress("TO"));
Systemoutprintln("抄送地址 :"+pmmgetMailAddress("CC"));
Systemoutprintln("密送地址 :"+pmmgetMailAddress("BCC"));
Systemoutprintln("邮件ID :"+i+":"+pmmgetMessageId());
pmmgetMailContent((Part)message[i]); //根据内容的不同解析邮件
pmmsetAttachPath("c:/tmp/mail"); //设置邮件附件的保存路径
pmmsaveAttachMent((Part)message[i]); //保存附件
Systemoutprintln("邮件正文 :"+pmmgetBodyText());
Systemoutprintln("第"+(i+1)+"封邮件结束");
}
}
}

你的这行代码attachName=new String(attachNamegetBytes("gb2312"),"ISO8859-1");应该修改成attachName=new String(attachNamegetBytes("ISO8859-1"),"gb2312");还有就是邮件中文乱码问题。在界面传递时,中文通过一定编码格式编码后在传给另外一个界面,接收界面如果要正确的显示中文,应该正确的解码。可以使用jdk16提供MimeUtility类。将 FileDataSource fds=new FileDataSource(filename);修改为:
FileDataSource fds=new FileDataSource(MimeUtilityencodeText(filename));这样的话应该能解决附件乱码问题。这只是自己肤浅的认识,可能有些地方还有漏洞,往高手看后指点!!
=====================================================================
下面是敝人一段中文处理的代码,可以做参考
public class Demo3
{
/
复杂邮件含附件+中文附件名_回信地址_友好名称
@param args
/
public static void main(String[] args) throws Exception
{

//配置环境
Properties pros = new Properties();
prossetProperty("mailsmtpauth", "true");
prossetProperty("mailtransportprotocol", "smtp");
Session session = SessiongetInstance(pros);
sessionsetDebug(true);
//创建卫星
Message msg = new MimeMessage(session);
//设置msg的一些信息--发件人、主题、内容
msgsetFrom(new InternetAddress("\""+MimeUtilityencodeText("超越")+"\" <hjflbc1990@sinacom>"));
msgsetRecipients(RecipientTypeTO,
InternetAddressparse(MimeUtilityencodeText("毕老师")+" <bg@sinacom>,"+MimeUtilityencodeText("王老师")+" <wxz@sinacom>")
);
msgsetReplyTo(InternetAddressparse("ss@sohucom"));

MimeMultipart bodyMultipart = new MimeMultipart("mixed");
msgsetContent(bodyMultipart);

MimeBodyPart appurt1 = new MimeBodyPart();
MimeBodyPart appurt2 = new MimeBodyPart();
MimeBodyPart contentPart = new MimeBodyPart();

bodyMultipartaddBodyPart(appurt1);
bodyMultipartaddBodyPart(appurt2);
bodyMultipartaddBodyPart(contentPart);

appurt1setDataHandler(new DataHandler(new FileDataSource("")));
appurt1setFileName("");//重要

appurt2setDataHandler(new DataHandler(new FileDataSource("")));
appurt2setFileName("");
MimeMultipart contentMultipart = new MimeMultipart("related");
contentPartsetContent(contentMultipart);

MimeBodyPart picPart = new MimeBodyPart();
MimeBodyPart htmlPart = new MimeBodyPart();
contentMultipartaddBodyPart(picPart);
contentMultipartaddBodyPart(htmlPart);

picPartsetDataHandler(new DataHandler(new FileDataSource("")));
picPartsetHeader("Content-Location", ">

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12600773.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存