首页
|
编程语言
|
网站建设
|
游戏天堂
|
冲浪宝典
|
网络安全
|
操作系统
|
软件时空
|
硬件指南
|
病毒相关
|
IT 认证
软讯网络
>
编程语言
>
Java
> 使用JavaMail收发邮件,解决了中文附件名问题
【标 题】:使用JavaMail收发邮件,解决了中文附件名问题
【关键字】:
JavaMail
【来 源】:http://www.blogjava.net/Cloud-QQ/archive/2006/04/23/42721.html
使用JavaMail收发邮件,解决了中文附件名问题
BlogJava - Cloud-QQ - 使用JavaMail收发邮件,解决了中文附件名问题
Cloud-QQ
BlogJava
首页
新随笔
联系
聚合
管理
随笔-2 评论-2 文章-1 trackbacks-0
使用JavaMail收发邮件,解决了中文附件名问题
? 几天来一直在开发一个项目,其中一部分需要用
JavaMail
收发邮件,于是就在网上找了一些相关的源代码,最后经过整理和修改,终于好使了,希望能够给使用
JavaMail
收发邮件的朋友提供一个参考
J
???
使用
JavaMail
收发邮件只需要下载两个开源的
jar
文件,
mail.jar
和
activation.jar,
这两个
jar
包可以很容易的在网上找到,这里就不提供下载链接了
J
?
下面是发送邮件SendMail.java(含附件)代码:
//
SendMail.java
import
?javax.mail.
*
;
import
?javax.mail.internet.
*
;
import
?java.util.
*
;
import
?javax.activation.
*
;
public
?
class
?SendMail?
{
????
????
public
?
static
?
void
?send(String?customMailBoxAddress,String?username,String?password,String?serverMailBoxAddress,String?subject,String?attachmentPath,String?attachmentName)?
{
????????
//
这里面使用新浪作为发送邮件的邮件服务器,其他的smtp服务器可以到相关网站上查到。
????????String?host?
=
?
"
smtp.sina.com.cn
"
;
????????
//
发送方邮箱地址(如BlogJava2006@blog.com.cn.)
????????String?from?
=
?customMailBoxAddress;
????????
//
收件人邮箱地址
????????String?to?
=
?serverMailBoxAddress;
????????
//
发送者的邮箱用户名
????????String?user?
=
?username;
????????
//
发送者的邮箱密码
????????String?ps?
=
?password;
????????
????????Properties?props?
=
?
new
?Properties();
????????
????????
//
设置发送邮件的邮件服务器的属性(这里使用新浪的smtp服务器)
????????props.put(
"
mail.smtp.host
"
,?host);
????????
//
需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有
//
这一条)
????????props.put(
"
mail.smtp.auth
"
,?
"
true
"
);
????????
????????
//
用刚刚设置好的props对象构建一个session
????????Session?session?
=
?Session.getDefaultInstance(props);
????????
????????
//
有了这句便可以在发送邮件的过程中在console处显示过程信息,供调试使
????????
//
用(有的时候网络连通性不够好,发送邮件可能会有延迟,在这里面会有所
//
提示,所以最好是加上这句,避免盲目的等待)
????????session.setDebug(
true
);
????????
????????
//
定义消息对象
????????MimeMessage?message?
=
?
new
?MimeMessage(session);
????????
try
{
????????????message.setFrom(
new
?InternetAddress(from));
????????????message.addRecipient(Message.RecipientType.TO,
new
?InternetAddress(to));
????????????message.setSubject(subject);
????????????
????????????
//
?向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
????????????Multipart?multipart?
=
?
new
?MimeMultipart();
????????????
//
设置邮件的文本内容
????????????BodyPart?contentPart?
=
?
new
?MimeBodyPart();
????????????contentPart.setText(
"
邮件的具体内容在此
"
);
????????????multipart.?addBodyPart(contentPart);
????????????
//
添加附件
????????????BodyPart?attachmentPart
=
?
new
?MimeBodyPart();
????????????DataSource?source?
=
?
new
?FileDataSource(attachmentPath);
????????????attachmentPart.setDataHandler(
new
?DataHandler(source));
????????????
//
注意:下面定义的enc对象用来处理中文附件名,否则名称是中文的附
//
件在邮箱里面显示的会是乱码,
????????????sun.misc.BASE64Encoder?enc?
=
?
new
?sun.misc.BASE64Encoder();
????????????messageBodyPart.setFileName(
"
=?GBK?B?
"
+
enc.encode(attachmentName.getBytes())
+
"
?=
"
);
????????????multipart.addBodyPart(messageBodyPart);
????????????
????????????
//
将multipart对象放到message中
????????????message.setContent(multipart);
????????????
//
发送邮件
????????????message.saveChanges();
????????????Transport?transport?
=
?session.getTransport(
"
smtp
"
);
????????????transport.connect(host,?username,?password);
????????????transport.sendMessage(message,?message.getAllRecipients());
????????????transport.close();
????????}
catch
(Exception?e)
{
????????????e.printStackTrace();
????????}
????}
}
ReceiveMail.java代码如下:
import
?javax.mail.
*
;
import
?java.util.
*
;
import
?java.io.
*
;
public
?
class
?ReceiveMail?
{
????
//
处理任何一种邮件都需要的方法
????
private
?
void
?handle(Message?msg)?
throws
?Exception?
{
????????System.out.println(
"
邮件主题:
"
?
+
?msg.getSubject());
????????System.out.println(
"
邮件作者:
"
?
+
?msg.getFrom()[
0
].toString());
????????System.out.println(
"
发送日期:
"
?
+
?msg.getSentDate());
????}
????
//
处理文本邮件
????
private
?
void
?handleText(Message?msg)?
throws
?Exception?
{
????????
this
.handle(msg);
????????System.out.println(
"
邮件内容:
"
+
msg.getContent());
????}
????
//
处理Multipart邮件,包括了保存附件的功能
????
private
?
static
?
void
?handleMultipart(Message?msg)?
throws
?Exception?
{
????????String?disposition;
????????BodyPart?part;
????????Multipart?mp?
=
?(Multipart)?msg.getContent();
????????
//
Miltipart的数量,用于除了多个part,比如多个附件
????????
int
?mpCount?
=
?mp.getCount();
????????
for
?(
int
?m?
=
?
0
;?m?
<
?mpCount;?m
++
)?
{
????????????
this
.handle(msg);
????????????part?
=
?mp.getBodyPart(m);
????????????disposition?
=
?part.getDisposition();
????????????
//
判断是否有附件
????????????
if
?(disposition?
!=
?
null
?
&&
?disposition.equals(Part.ATTACHMENT))
????????????
{
????????????????
//
这个方法负责保存附件
????????????????saveAttach(part);
????????????}
?
else
?
{
????????????????
//
不是附件,就只显示文本内容
????????????????System.out.println(part.getContent());
????????????}
????????}
????}
????
private
?
static
?
void
?saveAttach(BodyPart?part)?
throws
?Exception?
{
????????
//
得到未经处理的附件名字
????????String?temp?
=
?part.getFileName();
????????
//
除去发送邮件时,对中文附件名编码的头和尾,得到正确的附件名
????????
//
(请参考发送邮件程序SendMail的附件名编码部分)
????????String?s?
=
?temp.substring(
8
,?temp.indexOf(
"
?=
"
));
????????
//
文件名经过了base64编码,下面是解码
????????String?fileName?
=
?base64Decoder(s);
????????System.out.println(
"
有附件:
"
?
+
?fileName);
????????InputStream?in?
=
?part.getInputStream();
????????FileOutputStream?writer?
=
?
new
?FileOutputStream(
new
?File(
????????????????
"
保存附件的本地路径
"
+
?
"
\\
"
+
fileName));
????????
byte
[]?content?
=
?
new
?
byte
[
255
];
????????
int
?read?
=
?
0
;
????????
while
?((read?
=
?in.read(content))?
!=
?
-
1
)?
{
????????????writer.write(content);
????????}
????????writer.close();
????????in.close();
????}
????
//
base64解码
????
private
?
static
?String?base64Decoder(String?s)?
throws
?Exception?
{
????????sun.misc.BASE64Decoder?decoder?
=
?
new
?sun.misc.BASE64Decoder();
????????
byte
[]?b?
=
?decoder.decodeBuffer(s);
????????
return
?(
new
?String(b));
????}
????
public
?
static
?
void
?receive(String?receiverMailBoxAddress,?String?username,String?password)?
{
????????
//
本人用的是yahoo邮箱,故接受邮件使用yahoo的pop3邮件服务器
????????String?host?
=
?
"
pop.mail.yahoo.com.cn
"
;
????????
try
?
{
????????????
//
连接到邮件服务器并获得邮件
????????????Properties?prop?
=
?
new
?Properties();
????????????prop.put(
"
mail.pop3.host
"
,?host);
????????????Session?session?
=
?Session.getDefaultInstance(prop);
????????????Store?store?
=
?session.getStore(
"
pop3
"
);
????????????store.connect(host,?username,?password);
????????????Folder?inbox?
=
?store.getDefaultFolder().getFolder(
"
INBOX
"
);
????????????
//
设置inbox对象属性为可读写,这样可以控制在读完邮件后直接删除该附件
????????????inbox.open(Folder.READ_WRITE);
????????????Message[]?msg?
=
?inbox.getMessages();
????????????FetchProfile?profile?
=
?
new
?FetchProfile();
????????????profile.add(FetchProfile.Item.ENVELOPE);
????????????inbox.fetch(msg,?profile);
????????????
for
?(
int
?i?
=
?
0
;?i?
<
?msg.length;?i
++
)?
{
????????????????
//
标记此邮件的flag标志对象的DELETED位为true,可以在读完邮件后直接删除该附件,具体执行时间是在调用
????????????????
//
inbox.close()方法的时候
????????????????msg[i].setFlag(Flags.Flag.DELETED,?
true
);
????????????????handleMultipart(msg[i]);
????????????????System.out.println(
"
****************************
"
);
????????????}
????????????
if
?(inbox?
!=
?
null
)?
{
????????????????
//
参数为true表明阅读完此邮件后将其删除,更多的属性请参考mail.jar的API
????????????????inbox.close(
true
);
????????????}
????????????
if
?(store?
!=
?
null
)?
{
????????????????store.close();
????????????}
????????}
?
catch
?(Exception?e)?
{
????????????e.printStackTrace();
????????}
????}
}
希望对大家使用JavaMail收发邮件有所帮助!
posted on 2006-04-23 21:45
成长的心
阅读(54)
评论(1)
编辑
收藏
收藏至365Key
所属分类:
Java&T
开始读书之《代码大全》(1)
:【上一篇】
Java Services Orchestration for Actions(J-SOFA )
:【下一篇】
【相关文章】
javamail的几种安装方法
JavaMail API简介
[收藏]JavaMail - 发送HTML邮件
JavaMail API细节详细解析大全系列之二
JavaMail API细节详细解析大全系列之一
JavaMail访问Hotmail邮箱
Weblogic-JNDI-MailSession-javaMail-java.io.NotSerializableException: javax.mail.Session
邮件解析框架(JavaMail的C++实现)
JavaMail API FAQ
我的JavaMail客户端 - JExp
【随机文章】
Run a DLL as an App是什么东东?
搜索引擎优化 通向成功十步(六)
Windows 2K,XP,2003下搭建Apache2+MySql4+PHP5+phpMyAdmi
利用VB访问Internet
如何正确快速地寻找作业日志
嵌入式系统 Boot Loader 技术内幕
无限无线之WLAN八个常见问题(2)
用photoshop圆你的汽车梦之四
windows Update自动更新下载到哪个文件夹了?
散列学习笔记
【相关评论】
没有相关评论
【发表评论】
姓名:
邮件:
随机码
*
:
评论
*
:
|
首 页
|
版权声明
| 联系我们
|
网站地图
|
CopyRight © 2004-2007
b
b
b
软讯网络 All Rigths Reserved.