JMail接收邮件时显示接收状态和取消接收?

luckyprg 2005-10-19 06:57:20
我想实现的功能如下,在一个“框架页”中点击接收邮件:

1、我想在接收邮件时在状态栏显示共有多少邮件,正在接收第几封,或者用其他的方法显示也行。
2、能在接收的过程中取消邮件收取。(因为第一次收取时有可能邮件太多,或者附件太多,用户需要取消后在闲时收取)

我现在接收邮件的方法是写在一个公用的类中。
我在这个类中写如下代码没有效果
jmail.POP3 jpop3 = new jmail.POP3();
jpop3.Connect(此处略);
for(int i=1;i<=jpop3.Count;i++)
{
HttpContext.Current.Response.Write("<script>window.status='正在接收"+i.ToString()+"/"+jpop.Count.ToString()+"';</script>");
//*****此处不成功,因为在这个循环过程中没有重新展示页面,所以此代码要等到所有代码执行完成后才会Write出来。
//接收存取邮件,已OK。
}

请各位帮忙!谢谢!
...全文
453 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
luckyprg 2005-10-24
  • 打赏
  • 举报
回复
上面是秒,字打错了
System.Threading.Thread.Sleep(tmpI*tmpI); //在这里停顿0-10秒钟,模拟邮件接收时间

已用上面方式开发完成。
非常感谢各位的帮助!
luckyprg 2005-10-21
  • 打赏
  • 举报
回复
因为JMail收信是在服务端运行的,所以客户端在点击收信后马上将收信的窗口关闭,甚至将整个IE关闭,服务器也会将所有邮件收完后才退出。
所以现在不但无法显示进度,连取消都做不到。
luckyprg 2005-10-21
  • 打赏
  • 举报
回复
To:hchxxzx(NET?摸到一点门槛)

我试过,就算在不同的帧里面设置Session的值,那个接收的帧中for循环中的Session值也要等到for循环完成后才能读到有改变。
luckyprg 2005-10-21
  • 打赏
  • 举报
回复
请各位提供思路或代码。谢谢!
luckyprg 2005-10-21
  • 打赏
  • 举报
回复
先把代码公布一下:
点击接收及取消的aspx页面
<BODY>
<div id="mydiv">_</div>
<script language="javascript">
mydiv.innerText = '';
var Cancel = false;

var dots = 0;
var dotmax = 10;
function ShowWait()
{
if(!Cancel)
{
mydiv.innerText = "正在接收第: " + xmlhttp() + " 封邮件!请耐心等候…";
}
}

function StartShowWait()
{
mydiv.style.visibility = 'visible';
window.setInterval('ShowWait()',250);
}

function HideWait()
{
mydiv.style.visibility = 'hidden';
window.clearInterval();
}

function xmlhttp()
{
var result = "";
var xmlHttp = new ActiveXObject("MSXML2.XMLHTTP");
xmlHttp.open("POST", "getmail.aspx", false);
xmlHttp.send("");
result = xmlHttp.responseText;

if(result != "")
{
return(result);
}
else
{
return(0);
}
}

StartShowWait();

</script>
<form id="Form1" method="post" runat="server">
<FONT face="宋体"><INPUT onclick="Cancel = true;alert('已取消!');" type="button" value="取消"></FONT>
<INPUT onclick="Cancel = false;alert('已恢复!');" type="button" value="显示"></form>
</BODY>

getmail.aspx.cs的Page_Load中
Random tmpRand = new Random();
int tmpI = tmpRand.Next(100);
System.Threading.Thread.Sleep(tmpI*tmpI); //在这里停顿0-10分钟,以作测试用
Response.Write(tmpI.ToString());
Response.End();
luckyprg 2005-10-21
  • 打赏
  • 举报
回复
To:goody9807()
-------------------------
有帮助!!!
其实这个例子就是楼上 cuike519(Help you,Help me) 和 hchxxzx(NET?摸到一点门槛) 两位提供的方法的汇总。

我做了一个循环post提交xmlhttp的例子,已实现了进度和取消。
谢谢各位!!!

暂不结贴,期待更完美方案。
goody9807 2005-10-21
  • 打赏
  • 举报
回复
http://goody9807.611.cn/Announce/announce.asp?BoardID=2&ID=2136&Upflag=1&Num=1

看看这个对你有帮助吗
luckyprg 2005-10-21
  • 打赏
  • 举报
回复
期待高手继续提供代码或思路。
luckyprg 2005-10-21
  • 打赏
  • 举报
回复
不过我在测试时没有加入 cuike519(Help you,Help me) 所说的 setTimeout 处理,再试……
luckyprg 2005-10-21
  • 打赏
  • 举报
回复
5555555
还是不行啊。
当按下收信后,如果while没有执行完成,停止根本按不了。
就算我在getmail.aspx中加入
System.Threading.Thread.Sleep(1000);
也不行。
而且在while的过程中
document.all("xx").innerHTML = result;
这个也不会立即在页面显现,要等到while结束后才能显示出来。
luckyprg 2005-10-21
  • 打赏
  • 举报
回复
我先试试,估计应该行。
门槛兄上面的代码中
while(xmlhttp != 0)应为while(xmlhttp() != 0)
不然,就是S循环了。差点中计~~~哈哈~~~
xiaodao2008 2005-10-21
  • 打赏
  • 举报
回复
if(i == 1)
{
//每次收信均检测是否点击了停止,若是,则退出,不再收信
break;
}
这个地方写的有点草率,光脚本知道停止不行呀,这个地方还得用xmlHttp通知服务器停止收邮件
xiaodao2008 2005-10-21
  • 打赏
  • 举报
回复
呵呵,楼上真是热心,大概的脚本都写好了~~~
xiaodao2008 2005-10-21
  • 打赏
  • 举报
回复
“cuike519(Help you,Help me)”说的:目前由服务器主动推到客户端的模式好像还没有,这才是问题的关键,你写的是b/s程序,要想将服务器端程序执行的状态实时反应到客户端,我觉得只有两个方法可以考虑(xmlhttp和Activex),刷新就不要考虑了,会把服务器刷死的,不过Xmlhttp和刷新也没多大区别。
另一个方法就是用Flash的xmlSocket和服务器建立连接,不过不知道Flash能不能控制IE将状态写在状态拦,如果只显示在页面里面,Flash是可以做到的
hchxxzx 2005-10-21
  • 打赏
  • 举报
回复
赞同cuike519的想法
你可以直接在当前页面里面实现这个目标,不需要弹出一个窗口来执行.
以下代码你可以考虑一下,其中要注意的是,在使用xmlhttp至getmail.aspx页面中收取信件时,每次可仅收一条,如此循环往复.



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>

<BODY>
<form name="form1" id="form1" method="post" action="">
<input name="Submit1" type="button" id="Submit1" value="收信" onclick="f();">
<input name="Submit12" type="button" id="Submit12" value="停止" onclick="ff();">
</form>

</BODY>
</HTML>
<SCRIPT LANGUAGE="JavaScript">
<!--
//定义标志
var i = 0;

function f()
{
//每次点击收信,将变量置为0
i = 0;

//开始收信
while(xmlhttp != 0)
{
//如果有收到信,表示还可能有其他信件
if(i == 1)
{
//每次收信均检测是否点击了停止,若是,则退出,不再收信
break;
}
}
}

function ff()
{
//停止收信
i = 1;
}

function xmlhttp()
{
var result = "";
var xmlHttp = new ActiveXObject("MSXML2.XMLHTTP");
xmlHttp.open("POST", "getmail.aspx", false);
xmlHttp.send("");
result = xmlHttp.responseText;

//向父页面用脚本写信息
if(result != "")
{
document.all("xx").innerHTML = result;
return(1);
}
else
{
return(0);
}
}
//-->
</SCRIPT>
cuike519 2005-10-21
  • 打赏
  • 举报
回复
不知道下面的方法可否实现,我在外地所以无法测试,只提供一个思路,希望对你有帮助。
1、首先客户端要有一个轮询的机制,这个可以通过XMLHTTP和setTimeout来实现。
2、有了这个轮询,你需要从客户端获得服务器上的收邮件的状态信息
这个信息(收取数量等)可以放在Session里,或者放在一个被标示的Cache里面
3、在服务器上收取邮件时可以更新Session或者Cache(大概就在循环里),通过客户端的轮询可以读取这个值再写到客户端即可。

这样做需要考虑客户端的轮询时间要能够体现服务器的刷新,这样做可能会给服务器带来额外的压力,很多用户同时做的时候对服务器是一种考验。

目前由服务器主动推到客户端的模式好像还没有,不是通过XMLHTTP就是通过刷新页面,我认为前者更好一些。
hchxxzx 2005-10-21
  • 打赏
  • 举报
回复
你可尝试先抛开实际使用
在某个地方设置一个全局变量,因为session有时候可能会出现延时的现象,但全局变量不会.
在点击停止的时候,改变全局变量,此时,尚在循环中的收取事件,会不会退出循环.
另外,jmail收取邮件的时候,感觉是比较慢.你可尝试使用其他循环,比如说对文本相加(速度比较慢),以相同的方式,看看它会不会停止运行.
moodboy1982 2005-10-20
  • 打赏
  • 举报
回复
不知道呀,还可以消息接受邮件吗?帮你顶好了。
luckyprg 2005-10-20
  • 打赏
  • 举报
回复
晕~~~
楼上是我自己回答的啊。
cansum396 2005-10-20
  • 打赏
  • 举报
回复
楼上说的有理
加载更多回复(3)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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