//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();
}
}
}
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();
}
}
}