javamail操作一
使用之前,必须了解的基本概念与核心类:
Session
是邮件操作的接口;
Transport
是收发邮件所
使用的协议,一般 Session 会有多个 Transport ; Message 是收发操作的单位; Store 是消息的集合,类
似邮件客户端。每个 Store 包含一系列的 Folder 和 Message ,每个 Folder 又包含一系列的 Folder 和 Message 。
使用的协议,一般 Session 会有多个 Transport ; Message 是收发操作的单位; Store 是消息的集合,类
似邮件客户端。每个 Store 包含一系列的 Folder 和 Message ,每个 Folder 又包含一系列的 Folder 和 Message 。
属性名
|
含义
|
java,mail.smtp.user
|
SMTP
的缺省用户名。
|
java,mail.smtp.host
|
要连接的
SMTP
服务器。
|
java,mail.smtp.port
|
要连接的
SMTP
服务器的端口号,如果
connect
没有指明端口号就使用它,缺省值
25
。
|
java,mail.smtp.connectiontimeout
|
Socket
连接超时值,单位毫秒,缺省值不超时。
|
java,mail.smtp.timeout
|
Socket I/O
超时值,单位毫秒,缺省值不超时。
|
java,mail.smtp.from
| |
java,mail.smtp.localhost
|
localhost
名,缺省是
InetAddress.getLocalHost().getHostName()
。如果
JDK
和
name service
正确配置,一般不需设置。
|
java,mail.smtp.ehlo
|
如果为
false
,那么不会尝试使用
EHLO
命令登录,缺省是
true
。通常
EHLO
命令失败,会倒退到
HELO
命令。这个属性只有在服务器没有
fail EHLO
属性或没有实现
EHLO
属性。
|
java,mail.smtp.auth
|
缺省是
false
,如果为
true
,尝试使用
AUTH
命令认证用户。
|
java,mail.host
|
邮件交互的主机。
|
java,mail.transport.protocol
|
要装入
session
的协议(
smtp
、
pop3
、
imap
、
nntp
)。
|
java,mail.user
|
登录邮件服务器的用户名(发送邮件时需要)。
|
java,mail.from
|
发件人地址(发送邮件时需要)。
|
发送邮件
发送邮件主要涉及的类包括:Session、Transport和MimeMessage。如果发送带附件的邮件还会
涉及:MimeMultipart、DataSource和DataHandler。注意:以下的示例代码不带异常处理。
涉及:MimeMultipart、DataSource和DataHandler。注意:以下的示例代码不带异常处理。
- 发送不带附件的邮件:
Properties props= new Properties();
//
如果使用
connect
包含用户名和密码
//
仍然连接不上,那么有可能是这个属性没有设置。
//
导致服务器不验证
props.put("mail.smtp.auth", "true");
//
也可实现一个自定义的
Authenticator
,并调用
//getDefaultInstance(java.util.Properties props, Authenticator authenticator)
//
来完成验证。个人觉得不如使用
connect
方便。
Transport transport= session.getTransport("smtp");
MimeMessage message= new MimeMessage( session);
InternetAddress from= new InternetAddress( "James.Hu@chinacodeline.com", "James.Hu");
message.setFrom( from);
InternetAddress to= new InternetAddress("foxgem_magic@yahoo.com.cn");
//
指定收件人的类型
message.setRecipient( MimeMessage.RecipientType.TO, to);
message.setSubject( "This is a test.");
//
文本内容,就直接使用这个函数。
//
如果内容不是纯文本,那么使用
setContent
指定
mime type
。
message.setText( "
检查文件
");
//
加上这句话表示邮件完成
message.saveChanges();
//
连接并验证
transport.connect("mail.chinacodeline.com", "james.hu@chinacodeline.com", "
密码
");
transport.sendMessage( message, message.getAllRecipients());
transport.close();
props.put("mail.smtp.auth", "true"); Session session= Session.getDefaultInstance( props);
|
- 发送带附件的邮件:
Properties props= new Properties();
props.put("mail.smtp.auth", "true");
Session session= Session.getDefaultInstance( props);
Transport transport= session.getTransport("smtp");
MimeMessage msg= new MimeMessage( session);
msg.setFrom( new InternetAddress( "james.hu@chinacodeline.com", "foxgem"));
msg.setRecipient( MimeMessage.RecipientType.TO
, new InternetAddress("foxgem_magic@yahoo.com.cn"));
msg.setSubject("mail with single file");
//
把邮件内容看作多个组成部分,每部分分别组织自己的内容。最后
//
通过这个类组合起来一起发出。
MimeMultipart content= new MimeMultipart();
MimeBodyPart part1= new MimeBodyPart();
part1.setText("pls check the file");
MimeBodyPart part2= new MimeBodyPart();
//
附件如果是文件,一般都是使用
FileDataSource
//
如果是从其他方面获得,那么使用对应的
DataSource
。
//
如,若是来自
url
,那么就使用
URLDataSource
DataHandler dh= new DataHandler( fileDs);
part2.setDataHandler( dh);
//
标记为附件,否则当邮件客户端(如
OE
)收到后,直接在邮件中显示内容。
part2.setDisposition( MimeBodyPart.ATTACHMENT);
//
设置附件的文件名
part2.setFileName( "test.txt");
content.addBodyPart( part1);
content.addBodyPart( part2);
msg.setContent( content);
msg.saveChanges();
transport.connect("mail.chinacodeline.com", "james.hu@chinacodeline.com", "
密码
");
transport.sendMessage( msg, msg.getAllRecipients());
transport.close();
DataSource fileDs= new FileDataSource( "d:/test.txt");
|