仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 588|回复: 10
打印 上一主题 下一主题

[学习教程] JAVA教程之用Java Mail发送带有图片附件的html格局...

[复制链接]
谁可相欹 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:25:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
如果你学习的是市场营销,是销售,也许参加大课堂的学习会更合适,因为你的工作能力中有个基础就是搭建自己的人脉,用JavaMail发送带有图片的html格局的邮件,针关于显现图片,一样平常有两种办法。

1.图片存在于服务器上,我们只必要把图片在服务器的的链接放出来便可。
这类发式对照复杂,可是这类办法有些缺点:
图片不撑持离线扫瞄;
每次扫瞄邮件必要会见web服务,增添服务器包袱;
若图片以二进制的体例存在于数据库或是静态天生的,则没法无效的办理。

2.把图片以附件的体例发送进来,这类体例十分合用于图片存在于数据库中的情形。
本文也次要会商这类情形。

关于JavaMail的基本常识,请看http://www.yesky.com/SoftChannel/72348977504190464/20020713/1620276.shtml,
本文不作先容了。

说到邮件中的附件,我不能不说一说MiniMultipart类,供应了在邮件中到场附加的完成办法。
一个多部分邮件是一个内容范例(content-type)被设置为MiniMultipart的Message对象。
MiniMultipart类是一个容器类,包括MimeBodyPart范例的对象。
我们能够用一个MimeBodyPart包括html源代码,其他的MimeBodyPart包括二进制的图片附件。

可是这里有个不测情形,我们先看MimeBodyPart的初始化代码:

MimeBodyPartmdp=newMimeBodyPart();//新建一个寄存附件的BodyPart
DataHandlerdh=newDataHandler(...);
mdp.setDataHandler(dh);//给BodyPart对象设置内容为dh
个中当DataHandler初始化时必要DataSource的子类

/**fromJDKDoc*/
publicDataHandler(DataSourceds)
CreateaDataHandlerinstancereferencingthespecifiedDataSource.
Thedataexistsinabytestreamform.TheDataSourcewillprovideanInputStreamtoaccessthedata.
Parameters:ds-theDataSource

在JDK1.4中,DataSource是个Interface,DataSource唯一MimePartDataSource,URLDataSource,FileDataSource三个子类,
而在这三个类中没有一个能间接用二进制流(byte[])创立实例。固然我们能够把内存中的二进制流写到文件中,再让FileDataSource读出去。
可是如许会给服务器带来而外的硬盘读写,若操纵频仍,会形成服务器功能下落。侥幸的是我再网上发明了这么一个类,能够间接用二进制流间接创立实例。

importjava.io.*;
importjavax.activation.*;
publicclassByteArrayDataSourceimplementsDataSource
{
/***Datatowrite.*/
privatebyte[]_data;
/***Content-Type.*/
privateString_type;

/*Createadatasourcefromaninputstream*/
publicByteArrayDataSource(InputStreamis,Stringtype)
{
_type=type;
try
{
ByteArrayOutputStreamos=newByteArrayOutputStream();
intch;

//XXX:mustbemademoreefficientby
//doingbufferedreads,ratherthanonebytereads
while((ch=is.read())!=-1)
os.write(ch);
_data=os.toByteArray();
}
catch(IOExceptionioe)
{
}
}
/*Createadatasourcefromabytearray*/
publicByteArrayDataSource(byte[]data,Stringtype)
{
_data=data;
_type=type;
}
/*CreateadatasourcefromaString*/
publicByteArrayDataSource(Stringdata,Stringtype)
{
try
{
//Assumptionthatthestringcontainsonlyascii
//characters!Elsejustpassinacharsetintothis
//constructoranduseitingetBytes()
_data=data.getBytes("iso-8859-1");
}
catch(UnsupportedEncodingExceptionuee)
{
}
_type=type;
}
publicInputStreamgetInputStream()
throwsIOException
{
if(_data==null)
thrownewIOException("nodata");
returnnewByteArrayInputStream(_data);
}
publicOutputStreamgetOutputStream()
throwsIOException
{
thrownewIOException("cannotdothis");
}
publicStringgetContentType()
{
return_type;
}
publicStringgetName()
{
return"dummy";
}
}

有了下面ByteArrayDataSource类,我们就能够发送图片附件的邮件了。
{
StringsmtpHost=...;
Stringto=...;
Stringfrom=...;
Stringname=...;
Stringpassword=...;
Stringsubject=...;
StringBuffercontent=...;//邮件的html源代码
LinkedListattachList=...;//附件的list,它的element都是byte[],即图片的二进制流

Propertiesprops=newProperties();
props.put("mail.smtp.host",smtpHost);
props.put("mail.smtp.auth","true");
Sessionsession=Session.getDefaultInstance(props,null);

MimeMessagemessage;
InternetAddress[]address={newInternetAddress(to)};

message=newMimeMessage(session);
message.setFrom(newInternetAddress(from));
message.setRecipients(Message.RecipientType.TO,address);
message.setSubject(subject);
message.setSentDate(newDate());
//新建一个MimeMultipart对象用来寄存BodyPart对象(现实上能够寄存多个)
MimeMultipartmm=newMimeMultipart();
//新建一个寄存函件内容的BodyPart对象
BodyPartmdp=newMimeBodyPart();
//给BodyPart对象设置内容和格局/编码体例
mdp.setContent(content.toString(),"text/html;charset=GBK");
//这句很主要,万万不要忘了
mm.setSubType("related");

mm.addBodyPart(mdp);

//addtheattachments
for(inti=0;i<attachList.size();i++)
{
//新建一个寄存附件的BodyPart
mdp=newMimeBodyPart();
DataHandlerdh=newDataHandler(newByteArrayDataSource((byte[])attachList.get(i),"application/octet-stream"));
mdp.setDataHandler(dh);
//加上这句将作为附件发送,不然将作为函件的文本内容
mdp.setFileName(newInteger(i).toString()+".jpg");
mdp.setHeader("Content-ID","IMG"+newInteger(i).toString());
//将含有附件的BodyPart到场到MimeMultipart对象中
mm.addBodyPart(mdp);
}
//把mm作为动静对象的内容
message.setContent(mm);

message.saveChanges();
javax.mail.Transporttransport=session.getTransport("smtp");
transport.connect(smtpHost,name,password);
transport.sendMessage(message,message.getAllRecipients());
transport.close();
}

在上述代码中需注重的是这句代码:
mdp.setHeader("Content-ID","IMG"+newInteger(i).toString());
它形貌了附件图片的绝对路径,
当i=1时,代码就是mdp.setHeader("Content-ID","IMG1");

我们的html源代码中,也就是上述的content中,需包括
<tdalign=centervalign=middle>
<divalign="center">
<ahref="http://www.test.com"target="_blank">
<imgsrc="cid:IMG1"width="60"height="45"border="0">
</a>
</div>
</td>
就可以在邮件中显现图片。



有了这样一个呼声:让java代替C语言成为基本语言。这些足以说明java简单易学的这个优点。其次,java的功能强大,前面我也提到了,EJB3.0的推出使java成为了大型项目的首选。
柔情似水 该用户已被删除
沙发
发表于 2015-1-18 17:49:38 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
若相依 该用户已被删除
板凳
发表于 2015-1-22 18:42:36 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
飘灵儿 该用户已被删除
地板
发表于 2015-2-2 13:12:25 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
冷月葬花魂 该用户已被删除
5#
发表于 2015-2-9 07:24:41 | 只看该作者
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
变相怪杰 该用户已被删除
6#
发表于 2015-2-27 04:17:53 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
老尸 该用户已被删除
7#
发表于 2015-3-8 19:51:39 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
因胸联盟 该用户已被删除
8#
发表于 2015-3-11 14:26:50 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
谁可相欹 该用户已被删除
9#
 楼主| 发表于 2015-3-13 03:07:10 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
只想知道 该用户已被删除
10#
发表于 2015-3-20 10:44:45 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
兰色精灵 该用户已被删除
11#
发表于 2015-4-14 07:33:59 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 22:40

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表