使用JAVAMAIL收邮件时的问题,望高手们赐教!!!(高分求教)

lostyq 2004-04-16 09:44:41
代码:
BEAN中的代码:
import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import javax.servlet.*;

public void init(ServletRequest request, ServletResponse response){
//初始化内部变量
req = request;
res = response;
try{
out = res.getOutputStream();
}
catch(IOException e){
System.out.println("GetOutputStream Error:"+e.getMessage());
}
}
/**
* 用于邮件获取
*/
public void getMail(MailBean receive_mail) {
Properties props = new Properties();

Session session = Session.getDefaultInstance(props, null);

try {
Store store = session.getStore("pop3");
store.connect(receive_mail.getSmtphost(), receive_mail.getSmtpuser(), receive_mail.getSmtppassword());

Folder folder = store.getFolder("inbox");
folder.open(Folder.READ_ONLY);

Message message[] = folder.getMessages();

///////test
for (int i = 0, n = message.length; i < n; i++) {
out.println(i + ":" + message[i].getFrom()[0]);
out.println(message[i].getSubject());
message[i].writeTo(out);
}
////////////

folder.close(false);
store.close();
}
catch (Exception e) {
System.err.print(e);
}
}

JSP中的代码:
<jsp:useBean id="Mail" scope="session" class="JavaBean.MailBean" />
<jsp:setProperty name="Mail" property="*" />
<jsp:useBean id="ManageMail" scope="session" class="JavaBean.ManageMailBean" />
<jsp:setProperty name="ManageMail" property="*" />
<%
ManageMail.init(request,response);
Mail.setSmtphost("smtp.sina.com.cn");
Mail.setSmtpuser("***");//设置好的
Mail.setSmtppassword("***");//设置好的
ManageMail.getMail(Mail);
%>

平台:winXP+JB9

问题:我使用javamail包来收发邮件,发没问题,可收邮件时收一封时也可以收到,但这次调试时遇到如下报错(测试时我发了好几封邮件)

报错:java.io.CharConversionException: Not an ISO 8859-1 character: 可StandardWrapperValve[debugjsp]: Servlet.service() for servlet debugjsp threw exception

java.lang.IllegalStateException: getOutputStream() has already been called for this response

java.lang.IllegalStateException: getOutputStream() has already been called for this response

at org.apache.catalina.connector.ResponseBase.getWriter(ResponseBase.java:750)

at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:165)

at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:166)

at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:158)

at org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:205)

at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:177)

at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:198)

at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:193)

at org.apache.jsp.ReadMail_0005fJSP$jsp._jspService(ReadMail_0005fJSP$jsp.java:151)

at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:201)

at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:381)

at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:473)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1027)

at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1125)

at java.lang.Thread.run(Thread.java:536)
...全文
191 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
lostyq 2004-04-20
  • 打赏
  • 举报
回复
顶!
lostyq 2004-04-20
  • 打赏
  • 举报
回复
再顶!!!
lostyq 2004-04-20
  • 打赏
  • 举报
回复
先谢谢cn086(清凉小雅),我先研究一下……
Leemaasn 2004-04-20
  • 打赏
  • 举报
回复
哎哟。。。
我都没有写过JavaMail。。。
cn086 2004-04-20
  • 打赏
  • 举报
回复
以上代码绝对有效!
cn086 2004-04-20
  • 打赏
  • 举报
回复
public static String getstr(String str)
{
try {
String temp_p=str;
byte[] temp_t=temp_p.getBytes("ISO8859-1");
String temp=new String(temp_t);
return temp;
}
catch(Exception e)
{
return "";
}
}

public String getsubject(Message m) throws Exception
{
boolean bgetstr;
String temps;
String[] ta1=m.getHeader("Subject");
String _subject;
if (ta1!=null)
_subject=ta1[0];
else
_subject="";
if (_subject.indexOf("=?gb2312")!=-1 || _subject.indexOf("=?GB2312")!=-1 ||

_subject.indexOf("=?GBK")!=-1 || _subject.indexOf("=?utf-8")!=-1)
bgetstr=false;
else
bgetstr=true;
try{
temps=MimeUtility.decodeText(_subject);
}
catch(UnsupportedEncodingException E)
{
return _subject+"1";
}
if (temps.length()==0)
{
temps="(无主题)";
bgetstr=false;
}
if(bgetstr==false)
return temps;
else
return getstr(temps);
}

public String getPart(Part part, int partNum, int msgNum,int x) throws MessagingException,IOException
{
String s="";
String s1=""; //x参数来确定是以html格式显示还是以plain
String s2=new String();
String s3="";
String s5="";
String sct = part.getContentType();
if (sct == null)
{
s="part 无效";
return s;
}
ContentType ct = new ContentType(sct);

if (ct.match("text/html")||ct.match("text/plain"))
{
// display text/plain inline
//s1="<pre>"+(String)part.getContent()+"</pre>";
String cset=ct.getParameter("charset");
if(cset==null){
s1="<pre>"+getstr((String)part.getContent())+"</pre>";}
else{
s1="<pre>"+getStrByCharSet((String)part.getContent(),cset)+"</pre>";
}
}
else if(partNum!=0)
{
String temp="";
if ((temp = part.getFileName()) != null)
{
String tmp=savePart(part);
//s2= "<b>附件:</b><a href=fujian/"+tmp+"> " + getstr(temp) + "</a><br>";
s2= "<b>附件:</b><a href=fujian/"+getstr(temp)+"> " + getstr(temp) + "</a><br>";
}
/*
out.println("<a href=\"" +
HttpUtils.getRequestURL(req) +
"?message=" +
msgNum + "&part=" +
partNum + "\">Display Attachment</a>");

*/

}

if(part.isMimeType("multipart/alternative"))
{
String s6="";
String s7="";
Multipart mp = (Multipart)part.getContent();
int count = mp.getCount();
for (int i = 0; i < count; i++)
{

if(mp.getBodyPart(i).isMimeType("text/plain"))
s7=getPart(mp.getBodyPart(i), i, 3,2);
if(mp.getBodyPart(i).isMimeType("text/html"))
s6=getPart(mp.getBodyPart(i), i, 3,1);
}

if(x==1){s5=s6;}
if(x==2){s5=s7;}
return s5;
}
s=s1+s2;
return s;
}

%>
<%
String host=request.getParameter("host");
String username=request.getParameter("username");
String password=request.getParameter("password");

Properties props = new Properties();
Session getMailSession = Session.getInstance(props,null);

int port =110;
String protocol = "pop3";
String file = "";

getMailSession.setDebug(false);
URLName urln = new URLName(protocol,host,port,file,username,password);
Store store = getMailSession.getStore(urln);
getMailSession.setDebug(true);
try{
store.connect();
}
catch(MessagingException e){
throw new Exception("Cannot log on to host.Please verify the username and password.");
}
try{
String mbox = "INBOX";
Folder folder = store.getFolder(mbox);
folder.open(Folder.READ_WRITE);
Message[] messages = folder.getMessages();
int oldAndnewCount=folder.getMessageCount();//得到所有邮件数
int newCount=folder.getUnreadMessageCount();//得到新邮件数
out.println("您的信箱目前共有<font color=blue><b>"+oldAndnewCount+"</b></font>封邮件!");
int i=0;
for(i=messages.length-1;i>=0;i--){
Message m = messages[i];
Address[] from = (InternetAddress[])m.getFrom();
Address[] to = (InternetAddress[])m.getRecipients(Message.RecipientType.TO);
String s=new String();
String w=new String();

%>
<hr>
<p>邮件号:<font color=blue><b><%= i+1 %></b></font></p>
<p>收件人:<%if(to!=null){for(int tc=0;tc<to.length;tc++){
out.print(getEmailAddress(to[tc]));}}%></p>
<p>发件人:<%=getFrom(m)%></p>
<p>主 题:<%= getsubject(m) %></p>
<p>时 间: <%= messages[i].getSentDate() %></p>
<p>内 容:
<%
//String mmmm = (String)messages[i].getContent();
//if(mmmm==null)mmmm="";

Object o = m.getContent();
if (m.isMimeType("text/plain")||m.isMimeType("text/html"))
{
ContentType ct = new ContentType(m.getContentType());
String cset=ct.getParameter("charset");
if(cset==null){
s="<pre>"+getstr((String)o)+"</pre>";
}
else{
s="<pre>"+getStrByCharSet((String)o,cset)+"</pre>";
}
out.println(s);
}
if (m.isMimeType("multipart/*"))
{
Multipart mp = (Multipart)o;
int cnt = mp.getCount();
for (int j = 0; j < cnt; j++)
{
w=w+"<br>"+getPart(mp.getBodyPart(j), i, 2,1);
}
out.print(w);
}

}

}
catch(Exception e){
throw new Exception("Cannot read message.Please verify your E-mail server has a valid inbox");
}
finally {
store.close();
}
%>
——————————————————————————————————
cn086 2004-04-20
  • 打赏
  • 举报
回复
兄弟,我也不是很懂,只能把我用的接收邮件的代码贴给你研究研究了:)

——————————————————————————————————
getmail.htm如下
=================
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<form name="form1" method="post" action="getmail.jsp">
主机
<input name="host" type="text" id="host" value="mail.cn086.com">
用户
<input name="username" type="text" id="username">
密码
<input name="password" type="password" id="password">
<input type="submit" name="Submit" value="接 收">
</form>
</body>
</html>
——————————————————————————————————————
getmail.jsp代码如下
============================
<%@ page contentType="text/html; charset=gb2312" import="java.util.*, javax.mail.*,

javax.mail.internet.*,java.io.*" %>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<%!
public String getFrom(Message m) throws Exception
{
boolean bgetstr;
String temps;
String[] ta1=m.getHeader("From");
String _from;
String pers=null;
String addr=null;
if (ta1!=null)
_from=ta1[0];
else {
addr="(无发件人)";
return addr;
}

if (_from.indexOf("=?gb2312")!=-1 || _from.indexOf("=?GB2312")!=-1 || _from.indexOf("=?GBK")!=-1 ||

_from.indexOf("=?utf-8")!=-1)
bgetstr=false;
else
bgetstr=true;
Address[] from = (InternetAddress[])m.getFrom();
Address a = from[0];
if(a instanceof InternetAddress && ((pers=((InternetAddress)a).getPersonal())!=null)){
if(bgetstr) pers=getstr(pers);
addr=pers + "<"+((InternetAddress)a).getAddress()+">";
}
else
addr=a.toString();
return addr;
}

private String getEmailAddress(Address a){
try{
String pers=null;
String addr=null;
if(a instanceof InternetAddress && ((pers=((InternetAddress)a).getPersonal())!=null))
addr=((InternetAddress)a).getAddress();
else
addr=a.toString();
return addr;
}
catch(Exception e)
{
return "";
}
}

public static String savePart(Part part){
try {
String filename = getstr(part.getFileName());
File file = new File("E:/oa/app/email/fujian/"+filename);
for(int i=0;file.exists();i++){
int d = filename.lastIndexOf(".");
String tmp = filename.substring(0,d-1) + i + filename.substring(d,filename.length());
filename=tmp;
file = new File("E:/oa/app/email/fujian/"+filename);
}
FileOutputStream myFileoutputstream = new FileOutputStream(file);
int chunk = part.getSize();
//获得附件的大小,不一定很准确。
byte [] buffer = new byte[chunk];
InputStream instream = part.getInputStream();
instream.read(buffer,0,chunk);
myFileoutputstream.write(buffer,0,chunk);
instream.close();
myFileoutputstream.close();
//out.print("<a href = 'fujian/"+filename+"'>"+filename+"</a></p>");
return filename;
}
catch(Exception e)
{
//out.print("无");
return"";
}
}
public static String getStrByCharSet(String str,String cset)
{
try {
String temp_p=str;
byte[] temp_t=temp_p.getBytes(cset);
String temp=new String(temp_t);
return temp;
}
catch(Exception e)
{
return "";
}
}

flyxxxxx 2004-04-20
  • 打赏
  • 举报
回复
应该是字符编码问题:网页中为iso-8859-1,而邮件一般为base64(java mail只会把它转为java的编码),message[i].writeTo输出的不是iso-8859-1编码
hocus 2004-04-20
  • 打赏
  • 举报
回复
代码贴全
lostyq 2004-04-20
  • 打赏
  • 举报
回复
up有分!
qinghui521 2004-04-20
  • 打赏
  • 举报
回复
up一下。给不给分??
紫罗兰Cherry 2004-04-19
  • 打赏
  • 举报
回复
帮你顶,!
scholarwu 2004-04-19
  • 打赏
  • 举报
回复
续顶!
jianyu807 2004-04-19
  • 打赏
  • 举报
回复
跟我的报错一样!好象是说网页里面有两个输出流!java只允许有一个!我也不知道怎么解决!!顶
lostyq 2004-04-18
  • 打赏
  • 举报
回复
再顶!!!
lostyq 2004-04-17
  • 打赏
  • 举报
回复
的确,报错时报了out重复初始化,但我不知如何避免,高手们指点一下!!!
ai92 2004-04-17
  • 打赏
  • 举报
回复
我不懂,我刚想学着东西,结果来了别的任务,只能UP
trust_me 2004-04-17
  • 打赏
  • 举报
回复
虽然对javamail不熟,但是你有没有考虑到发送和响应之间的时间差问题,当你连续发送邮件,而且响应的时候都调用了out = res.getOutputStream();
Kosling 2004-04-17
  • 打赏
  • 举报
回复
老大,我真想帮你,可是我真的不知道啊!
lostyq 2004-04-17
  • 打赏
  • 举报
回复
大虾们帮帮忙啦!
分不够再加
加载更多回复(3)

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧