- 浏览: 267251 次
文章分类
最新评论
-
tanghui:
那在实际的项目中 不可能让客户去该浏览器啊 怎么实现了 我e ...
web.xml 中显示错误页面 -
Leevencial:
终于找个能看得明白的.
左外连接,右外连接,全连接,内连接。四种连接的差异 -
jyjava:
bucsfdffffffffff
JavaScript中confirm,alert,prompt的用法 -
jyjava:
[b][/b][/i][i][/i][i][i][/i]
引 ...
JavaScript中confirm,alert,prompt的用法 -
isy:
THX!!
<c:forEach > 判断是否为最后一条记录
public boolean sendMailWithPic(String from, String to, String subject,
String content,
int subscribeid) {
// try {
// content = new String(content.getBytes("ISO-8859-1"),
// "GBK");
// } catch (UnsupportedEncodingException ex) {
// logger.error(ex.getMessage());
// }
Properties props = new Properties();
logger.info("服务器" + host);
props.put("mail.smtp.host", host); // 指定SMTP服务器
props.put("mail.smtp.auth", "true"); // 指定是否需要SMTP验证
try {
logger.info("收件人: " + to);
Session mailSession = Session.getDefaultInstance(props);
mailSession.setDebug(true); // 是否在控制台显示debug信息
LinkedList attachList = this.getLinkedlist(con); // 附件的list,它的element都是byte[],即图片的二进制流
logger.info("attachList的值为::::"+attachList.size());
Message message = new MimeMessage(mailSession);
message.setFrom(new InternetAddress(from)); // 发件人
message.addRecipient(Message.RecipientType.TO, new InternetAddress(
to)); // 收件人
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
message.setSubject("=?GB2312?B?" + enc.encode(subject.getBytes()) +
"?=");
// 新建一个MimeMultipart对象用来存放BodyPart对象(事实上可以存放多个)
MimeMultipart mmt = new MimeMultipart();
// 新建一个存放信件内容的BodyPart对象
BodyPart mbp = new MimeBodyPart();
mbp.setContent(content, "text/html; charset=GBK");
// 这句很重要,千万不要忘了
mmt.setSubType("related");
mmt.addBodyPart(mbp);
// add the attachments
for (int i = 0; i < attachList.size(); i++) {
logger.info("i的值为::::::::::::"+i);
// 新建一个存放附件的BodyPart
MimeBodyPart mdp = new MimeBodyPart();
DataHandler dh = new DataHandler(new ByteArrayDataSource((byte[])
attachList.get(i), "application/octet-stream"));
mdp.setDataHandler(dh);
// 加上这句将作为附件发送,否则将作为信件的文本内容
mdp.setFileName(new Integer(i).toString() + ".jpg");
mdp.setHeader("Content-ID", "<IMG" + new Integer(i).toString()+">");
logger.info("jdjdjdjdjdjdjdjdj"+"<IMG" + new Integer(i).toString()+">");
// 将含有附件的BodyPart加入到MimeMultipart对象中
mmt.addBodyPart(mdp);
}
// 把mm作为消息对象的内容
message.setContent(mmt);
message.saveChanges();
// Multipart mm = new MimeMultipart();
//
// mm.addBodyPart(mbp); //将BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart)
//
// message.setContent(mm); //把mm作为消息对象的内容
//
// message.saveChanges();
Transport transport = mailSession.getTransport("smtp");
try {
transport.connect(host, user, password);
transport.sendMessage(message, message.getAllRecipients());
} catch (Exception e) {
logger.error(e.getMessage());
boolean bl = DBOperate.executePreparedUpdate(e.getMessage(),
subscribeid, con);
while (bl == false) {
sleep(6000);
if (con != null) {
dboperate.close(con);
}
con = null;
con = getConnection();
bl = DBOperate.executePreparedUpdate(e.getMessage(),
subscribeid, con);
}
return false;
} finally {
transport.close();
}
} catch (Exception e) {
logger.error(e.getMessage());
boolean bl = DBOperate.executePreparedUpdate(e.getMessage(),
subscribeid, con);
while (bl == false) {
sleep(6000);
if (con != null) {
dboperate.close(con);
}
con = null;
con = getConnection();
bl = DBOperate.executePreparedUpdate(e.getMessage(),
subscribeid, con);
}
return false;
}
String sql = "update CSBILLSUBSCRIBE t set SENDTIME=sysdate,SENDSTATUS='发送成功!' where t.SUBSCRIBEID=" +
subscribeid;
boolean bl = DBOperate.executeUpdate(sql, con);
while (bl == false) {
sleep(6000);
if (con != null) {
dboperate.close(con);
}
con = null;
con = getConnection();
bl = DBOperate.executeUpdate(sql, con);
}
logger.info("发送成功");
return true;
}
/**
* 从数据库中去得图片的二进制数组,添加到LinkedList
* @param content String
* @param subscribeid int
* @param con Connection
* @return boolean
*/
public LinkedList getLinkedlist(Connection con) {
PreparedStatement ps = null;
ResultSet rs = null;
LinkedList liklist=new LinkedList();
String sql = "select * from csmpicupload order by PICID";
//String sql = "update CSBILLSUBSCRIBE t set SENDTIME=sysdate,SENDSTATUS=? where t.SUBSCRIBEID=?";
//content="发送失败!,原因:"+content;
logger.info(sql);
try {
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
Blob bb = rs.getBlob("PICSTORE");
long length=bb.length();
byte[] bt=bb.getBytes(1,(int)length);
liklist.add(bt);
}
} catch (SQLException ex2) {
logger.info("数据库异常错误!" + ex2.getMessage());
return null;
} finally {
try {
if (ps != null) {
ps.close();
}
} catch (SQLException ex3) {
logger.info("数据库异常错误!" + ex3.getMessage());
return null;
}
}
return liklist;
}
-------------------------------------------------------------------------------------
邮件的内容如下:
sb = new StringBuffer();
String content = "";
sb.append("<style type=\"text/css\">.font { font-size: 12px; color: #000000}.font3 { font-size: 12px; font-weight: bold; color: #000000}</style><table id=\"printTable\" width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\">");
sb.append("<tr><td align=\"left\" colspan=\"2\"><img src=\"cid:IMG0\" width=\"100\" height=\"30\" border=\"0\"></td><td align=\"right\" colspan=\"4\"><img src=\"cid:IMG1\" width=\"100\" height=\"30\" border=\"0\"></td></tr>");
sb.append(
"<tr><TD colspan=\"3\" align=\"center\" class=\"font3\">电信有限公司").
append(oraName).append("分公司“我的e家”客户帐单<br></TD></tr><tr><TD align=\"left\" class=\"font\" width=\"400\" colspan=\"2\">客户名称:");
sb.append(customerorderbill.getACCTNAME()).append(
"</TD><TD align=\"right\" class=\"font\">计费周期:").
append(customerorderbill.getSTATEDATE()).append("<br>查询时间:").
append(customerorderbill.getCURDATE()).append(
"</TD></tr><tr></table>");
sb.append("<table width=\"540\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"center\"><tr><td align=\"center\" valign=\"top\" colspan=\"3\"><table id=\"sortTable\" width=\"540\" border=\"0\" cellpadding=\"4\" cellspacing=\"1\" bgcolor=\"#CCCCCC\" class=\"a\"><tr><TD class=\"font\" align=\"center\" bgcolor=\"#FFFFFF\" >基础包</TD><TD class=\"font\" align=\"center\" bgcolor=\"#FFFFFF\">");
sb.append(customerorderbill.getPHONE()).append("</TD><TD class=\"font\" align=\"center\" colspan=\"2\" bgcolor=\"#FFFFFF\"></TD></tr><tr><TD class=\"font\" align=\"center\" bgcolor=\"#FFFFFF\" width=\"120\">可选包</TD><TD class=\"font\" align=\"center\" width=\"140\" bgcolor=\"#FFFFFF\">").
append(customerorderbill.getPHS1()).append(" </TD><TD class=\"font\" align=\"center\" width=\"140\" bgcolor=\"#FFFFFF\">");
sb.append(customerorderbill.getPHS2()).append(" </TD><TD class=\"font\" align=\"center\" width=\"140\" bgcolor=\"#FFFFFF\">").
append(customerorderbill.getPHS3()).append(" </TD> </tr></table><table id=\"sortTable2\" width=\"540\" border=\"0\" cellpadding=\"4\" cellspacing=\"1\" bgcolor=\"#CCCCCC\"><tr><TD class=\"font\" align=\"center\" colspan=\"6\">“我的e家”基础包及可选包成员合计费用信息(元)</TD></tr><tr><TD class=\"font\" align=\"center\" bgcolor=\"#FFFFFF\" width=\"130\">费用项目</TD><TD class=\"font\" align=\"center\" bgcolor=\"#FFFFFF\" width=\"50\">费用</TD><TD class=\"font\" align=\"center\" bgcolor=\"#FFFFFF\" width=\"130\">费用项目</TD><TD class=\"font\" align=\"center\" bgcolor=\"#FFFFFF\" width=\"50\">费用</TD><TD class=\"font\" align=\"center\" bgcolor=\"#FFFFFF\" width=\"130\">费用项目</TD><TD class=\"font\" align=\"center\" bgcolor=\"#FFFFFF\" width=\"50\">费用</TD></tr>");
logger.info("-------------开始循环-----------");
int num = list.size(); //费用总条数
for (Iterator it = list.iterator(); it.hasNext(); ) {
Acctitem acct = new Acctitem();
acct = (Acctitem) it.next();
// logger.info(acct.getACCTITEMTYPENAME() +
// ":::::::&&&&&&&&&&&&&&&&&&&&&&&&&:::::::::" +
// acct.getACCTITEMCHARGE());
}
//logger.info("list.size--------------" + num);
int hang = num / 3; //行数
if (num % 3 > 0) {
hang = hang + 1;
}
int m = 1;
logger.info("-------------开始费用总计-----------");
while (m <= hang) {
int k = 1;
sb.append("<tr>");
for (int b = 0; b < hang * 3; b++) {
//for (Iterator it = list.iterator(); it.hasNext(); ) {
// logger.info("-------------bean 循环-----------");
String paraname = "";
double paravalue = 0;
if (k == m) {
if (b < list.size()) {
Acctitem acct = new Acctitem();
acct = (Acctitem) list.get(b);
paraname = acct.getACCTITEMTYPENAME();
paravalue = acct.getACCTITEMCHARGE();
}
int dian = paraname.indexOf("、"); //判断是否缩进。
if (dian == -1) {
sb.append(
"<td align=\"left\" bgcolor=\"#FFFFFF\" class=\"font\"> ").
append(paraname).append(
"</td><td align=\"center\" bgcolor=\"#FFFFFF\" class=\"font\">").
append(paravalue).append("</td>");
} else {
sb.append(
"<td align=\"left\" bgcolor=\"#FFFFFF\" class=\"font3\">").
append(paraname).append(
"</td><td align=\"center\" bgcolor=\"#FFFFFF\" class=\"font\">").
append(paravalue).append("</td>");
}
} else if (k == m + hang) {
if (b < list.size()) {
Acctitem acct = new Acctitem();
acct = (Acctitem) list.get(b);
paraname = acct.getACCTITEMTYPENAME();
paravalue = acct.getACCTITEMCHARGE();
}
int dian = paraname.indexOf("、"); //判断是否缩进。
if (dian == -1) {
sb.append(
"<td align=\"left\" bgcolor=\"#FFFFFF\" class=\"font\"> ").
append(paraname).append(
"</td><td align=\"center\" bgcolor=\"#FFFFFF\" class=\"font\">").
append(paravalue).append("</td>");
} else {
sb.append(
"<td align=\"left\" bgcolor=\"#FFFFFF\" class=\"font3\">").
append(paraname).append(
"</td><td align=\"center\" bgcolor=\"#FFFFFF\" class=\"font\">").
append(paravalue).append("</td>");
}
} else if (k == hang * 2 + m) {
if (b < list.size()) {
Acctitem acct = new Acctitem();
acct = (Acctitem) list.get(b);
paraname = acct.getACCTITEMTYPENAME();
paravalue = acct.getACCTITEMCHARGE();
}
int dian = paraname.indexOf("、"); //判断是否缩进。
if (dian == -1) {
sb.append(
"<td align=\"left\" bgcolor=\"#FFFFFF\" class=\"font\"> ").
append(paraname).append(
"</td><td align=\"center\" bgcolor=\"#FFFFFF\" class=\"font\">").
append(paravalue).append("</td>");
} else {
sb.append(
"<td align=\"left\" bgcolor=\"#FFFFFF\" class=\"font3\">").
append(paraname).append(
"</td><td align=\"center\" bgcolor=\"#FFFFFF\" class=\"font\">").
append(paravalue).append("</td>");
}
}
k++;
}
sb.append("</tr>");
m++;
}
sb.append("<tr><TD class=\"font\" align=\"center\" bgcolor=\"#FFFFFF\" >本月费用合计</TD> <TD class=\"font\" align=\"center\" colspan=\"5\" bgcolor=\"#FFFFFF\">").
append(customerorderbill.getBILLCHARGE()).append("元</TD></tr></table><table id=\"sortTable3\" width=\"540\" border=\"0\" cellpadding=\"4\" cellspacing=\"1\" bgcolor=\"#CCCCCC\" class=\"a\"><tr><TD class=\"font\" align=\"center\" colspan=\"6\">通信量信息</TD></tr><tr><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\">本地通话时长<br>(分钟)</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\">国内长话时长<br>(分钟)</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\">国际长话时长<br>(分钟)</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\">台港澳长话时长<br>(分钟)</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\">点对点短信<br>(条)</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\">宽带上网时长<br>(小时)</TD></tr><tr><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\">");
sb.append(customerorderbill.getBDDURATION()).append(
"</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\">").
append(customerorderbill.getGNDURATION()).append(
"</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\">").
append(customerorderbill.getGJDURATION()).append(
"</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\">").
append(customerorderbill.getTGODURATION()).append(
"</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\">").
append(customerorderbill.getSMSDURATION()).append(
"</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\">").
append(customerorderbill.getNETDURATION());
sb.append("</TD></tr><tr><TD class=\"font\" align=\"center\" colspan=\"6\">积分信息(分)</TD></tr><tr><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\" width=\"90\">本期新增<br>A</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\" width=\"90\">上期末积余<br>B</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\" width=\"90\">本期使用<br>C</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\" width=\"90\">本期末积余<br>D=A+B-C</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\" width=\"90\"> </TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\" width=\"90\"> </TD></tr>");
sb.append(
"<tr><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\">").
append(customerorderbill.getTACHARGECNT()).append(
"</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\">").
append(customerorderbill.getPECHARGECNT()).append(
"</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\">").
append(customerorderbill.getTTCHARGECNT()).append(
"</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\">").
append(customerorderbill.getTECHARGECNT()).append("</TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\"> </TD><TD class=\"font\" align=\"center\" bgcolor=\"#fafafa\"> </TD></tr>");
sb.append("<tr><TD class=\"font\" align=\"center\" colspan=\"6\" bgcolor=\"#fafafa\">注:本积分统计至上月底,后付费用户未缴费部分的消费积分因未激活,不包含在上述积分中</TD></tr></table></td></tr>");
sb.append("<tr><td align=\"left\"><img src=\"cid:IMG2\" width=\"150\" height=\"30\" border=\"0\"></td><td align=\"right\"><img src=\"cid:IMG3\" width=\"150\" height=\"30\" border=\"0\"></td></tr></table>");
content = sb.toString();
发表评论
-
乱码问题处理汇总
2009-08-11 14:27 826乱码对于使用非英语文字程序员基本上是一直缠绕在身边 ... -
过滤html代码方法
2009-06-09 17:27 1204public static String Html2Text( ... -
对synchronized(this)的一些理解
2009-06-09 10:18 1258一、当两个并发线程访问同一个对象object中的这个synch ... -
java uuid生成方法
2009-03-05 17:51 4613UUID(Universally Unique Identif ... -
java.util.Date和java.sql.Date的区别及应用
2009-03-05 17:02 1203java.util.Date 就是在除了S ... -
log4j的使用
2008-10-24 09:06 869log4j的使用 1、 Log4j是 ... -
java中文件操作大全
2008-05-30 13:59 1403【转】java中文件操作大全 一.获得控制台用户输入的信息 ... -
SimpleDateFormat注意事项
2008-05-28 13:36 1165在使用SimpleDateFormat时格式化时间的 yyyy ... -
使用String.split方法时要注意的问题
2008-05-22 15:16 896【转】使用String.split方 ... -
java基础操作
2008-05-08 10:23 949JAVA数组 java语言中,数 ... -
Web.XML 配置详解
2008-05-06 17:15 2497关于web.xml配置的详细说明 转载于http://blo ... -
HibernateDaoSupport的使用
2008-05-05 12:45 9763转:HibernateDaoSupport的使用 一.“低 ... -
java 基础操作
2008-04-29 16:21 8071.object[] 数组与hashmap的转换 Map< ... -
J2SE5.0中预定义的注释
2008-04-23 14:04 1038一、什么是注释 说起注释,得先提一提什么是 ... -
commons-fileupload-1.0上传组件使用实例.
2007-04-11 18:26 1391commons-fileupload-1.0上传组件使用实例. ... -
jspSmartUpload
2007-04-11 18:28 1473... -
用J2SE API读取Properties文件的方法
2007-04-11 18:31 8551。使用java.util.Properties类的load( ... -
java 操作 excel
2007-04-11 18:41 941jxl.jar下载地址:http://sourceforge. ... -
log4j 的使用
2007-04-19 09:01 1090一//////////////////////////// ... -
登录随机码
2007-05-21 11:49 1277<%@ page contentType="im ...
相关推荐
在Java编程中,发送带有图片和样式的电子邮件是一项常见的任务,尤其对于自动化通知、报告或者营销活动来说。本文将详细讲解如何使用Java实现这个功能,主要涉及JavaMail API的使用和MIME(多用途互联网邮件扩展)...
Java Mail 是一个开源的Java库,它为Java应用程序提供了与各种邮件系统交互的能力。这个"mail-1.4.7.jar"是Java Mail的一个版本,主要用于处理电子邮件的发送和其他相关功能。版本号1.4.7表明这是一个较旧但稳定版本...
3. **MIME支持**:MIME(Multipurpose Internet Mail Extensions)标准允许邮件包含多种类型的内容,如文本、图片、音频、视频等。Java Mail 支持创建和解析MIME格式的邮件,处理嵌入式或附件的多媒体内容。 4. **...
在IT领域,特别是Java开发中,使用Java Mail API发送带有图片的HTML格式邮件是一项常见且实用的功能。本文将深入解析如何利用Java Mail实现这一需求,包括必要的知识点、代码示例及其实现细节。 ### 一、Java Mail ...
这个“java_mail 1.5.zip”压缩包包含的是JavaMail 1.5版本的源代码,对于理解其内部工作原理和自定义扩展功能非常有帮助。 JavaMail API的核心组件包括: 1. **JavaMail Session**: 是JavaMail的核心,负责配置...
MIME(Multipurpose Internet Mail Extensions)标准扩展了邮件格式,支持多种类型的数据,如文本、图片、附件等。JavaMail API 提供了`MimeMessage`类来处理MIME格式的邮件。 9. **邮件认证**: 邮件服务器通常...
标题中的“用Java Mail发送包含图片的HTML”指的是使用JavaMail API来发送带有嵌入式图像的HTML格式电子邮件。在电子邮件中,除了纯文本内容,我们有时需要包含图像以提高信息的可读性和视觉吸引力。JavaMail API是...
`MimeMessage`用于创建和管理邮件消息,而`MimeBodyPart`则用于封装邮件的内容,包括文本、图片、文件等。 以下是一个简单的步骤概述: 1. **配置SMTP服务器信息**:在发送邮件前,你需要设置SMTP服务器的主机名、...
在Java Mail API的帮助下,你可以实现各种复杂的邮件功能,比如添加附件、设置HTML内容、发送带有图片的邮件等。本案例将详细介绍如何使用Java Mail API发送邮件。 在Java中,发送邮件通常涉及以下步骤: 1. 添加...
Java Mail API是Java平台上用于处理电子邮件的标准API,它提供了一组接口和类,使得开发者能够构建应用程序来发送、接收和管理邮件。这个API是Java Community Process(JCP)制定的JSR 919标准的一部分,它允许开发...
2. **MIME(Multipurpose Internet Mail Extensions)**:MIME是一种标准,用于定义非ASCII字符的电子邮件格式,包括文本、图片、音频、视频等多媒体内容。在JavaMail中,MIME技术用于构造复杂格式的邮件,如包含...
Java Mail API支持MIME类型,可以处理文本、图片、音频、视频等各种类型的数据。 8. 错误处理和异常:在使用Java Mail过程中,可能会遇到网络问题、认证失败等异常情况,需要正确捕获和处理这些异常。 9. 关闭资源...
Java Mail 是一个开源的 Java API,它允许开发者在 Java 应用程序中处理电子邮件。这个API提供了丰富的功能,包括发送、接收、读取和管理邮件。在提供的压缩包中,有两个重要的 JAR 文件:mail.jar 和 activation....
Java Mail 是一个开源的Java库,它允许Java开发者在应用程序中发送和接收电子邮件。这个库提供了丰富的API,可以处理各种复杂的邮件操作,如创建、发送、读取、管理邮件等。在你提供的压缩包文件中,包含了三个关键...
2. **MIME Support**:MIME(Multipurpose Internet Mail Extensions)扩展了电子邮件的标准,支持多媒体内容,如图片、音频和视频。JavaMail提供了对MIME的支持,可以创建和解析包含多种类型附件的邮件。 3. **...
4. **MIME类型**:Java Mail API支持MIME标准,这意味着你可以发送包含文本、图片、附件等多种内容类型的邮件。`MimeBodyPart`和`Multipart`类用于构建复杂的邮件结构: ```java MimeBodyPart textPart = new ...
Java Mail 是一个强大的开源库,专门用于在Java应用程序中处理电子邮件。这个组件使得开发者能够方便地执行发送、接收、管理邮件等操作。`javamail-1.4.3` 是一个特定版本的Java Mail库的jar包,包含了实现SMTP...
这个"java-mail-lib"压缩包文件显然包含了JavaMail相关的类库,使得开发者能够轻松地在Java应用程序中集成邮件功能。下面将详细讨论JavaMail库的关键知识点以及如何使用其中的jar包。 1. JavaMail API概述: ...
Java Mail for Android 是一个专为Android平台设计的邮件处理库,它使得在Android应用中实现邮件发送和接收变得更加便捷。这个库包含三个重要的JAR文件:mail.jar、activation.jar和additionnal.jar,它们各自承载了...
Java Mail邮件发送是一个在Java应用程序中发送电子邮件的关键技术。它基于JavaMail API,这是一个开源库,提供了丰富的功能来处理SMTP(简单邮件传输协议)、POP3(邮局协议)和IMAP(因特网消息访问协议)等邮件...