java邮件开发

使用之前,必须了解的基本概念与核心类:Session是邮件操作的接口;Transport是收发邮件所
使用的协议,一般Session会有多个TransportMessage是收发操作的单位;Store是消息的集合,类
似邮件客户端。每个Store包含一系列的FolderMessage,每个Folder又包含一系列的FolderMessage

Session 需要使用 java,mail.util.Properties 来构造,常用的用来构造 Session 的属性:

属性名
含义
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
SMTPjava,mail 使用的 Email 地址,用来设置邮件的 return 地址。缺省是 Message.getFrom() InternetAddress.getLocalAddress() 。注意: java,mail.smtp.user 优先使用
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。注意:以下的示例代码不带异常处理。
- 发送不带附件的邮件:

Properties props= new Properties();
// 如果使用 connect 包含用户名和密码
// 仍然连接不上,那么有可能是这个属性没有设置。
// 导致服务器不验证
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.auth", "true");
Session session= Session.getDefaultInstance( props);
// 也可实现一个自定义的 Authenticator ,并调用
//getDefaultInstance(java.util.Properties props, Authenticator authenticator)
// 来完成验证。个人觉得不如使用 connect 方便。
Transport transport= session.getTransport("smtp");
MimeMessage message= new MimeMessage( session);
InternetAddress from= new InternetAddress( "[email protected]", "James.Hu");
message.setFrom( from);
InternetAddress to= new InternetAddress("[email protected]");
// 指定收件人的类型
message.setRecipient( MimeMessage.RecipientType.TO, to);
message.setSubject( "This is a test.");
// 文本内容,就直接使用这个函数。
// 如果内容不是纯文本,那么使用 setContent 指定 mime type
message.setText( " 检查文件 ");
// 加上这句话表示邮件完成
message.saveChanges();
// 连接并验证
transport.connect("mail.chinacodeline.com", "[email protected]", " 密码 ");
transport.sendMessage( message, message.getAllRecipients());
transport.close();

- 发送带附件的邮件:

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( "[email protected]", "foxgem"));
msg.setRecipient( MimeMessage.RecipientType.TO
, new InternetAddress("[email protected]"));
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
DataSource fileDs= new FileDataSource( "d:/test.txt");
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", "[email protected]", " 密码 ");
transport.sendMessage( msg, msg.getAllRecipients());
transport.close();

接收邮件
接收邮件涉及的类:Session、Store、Folder和MimeMessage。如果发送带附件的邮件还会
涉及:MimeMultipart、DataSource和DataHandler。注意:以下的示例代码不带异常处理。
- 接收不带附件的邮件:

Properties props= new Properties();
Session session= Session.getDefaultInstance( props);
Store store= session.getStore( "pop3");
store.connect( "pop.mail.yahoo.co.uk", "foxgem_magic", " 密码 ");
// 找到缺省的目录
Folder root= store.getDefaultFolder();
// 也可指定打开的目录,如 Folder inbox= root.getFolder( “inbox”);
Folder[] folders= root.list();
for( int j=0; j< folders.length; j++){
// 打开 folder
folders[j].open( Folder.READ_WRITE);
Message[] msgs= folders[j].getMessages();
for(int i=0; i< msgs.length; i++){
System.out.println( "subject:"+ msgs[i].getSubject());
System.out.println( "content:"+ msgs[i].getContent().toString());
}
// 检查是否有新邮件。
System.out.println( folders[j].hasNewMessages());
folders[j].close( false);
}
store.close();

- 接收带附件的邮件:

Properties props= new Properties();
Session session= Session.getDefaultInstance( props);
Store store= session.getStore( "pop3");
store.connect( "pop.mail.yahoo.co.uk", "foxgem_magic", " 密码 ");
Folder root= store.getDefaultFolder();
Folder[] folders= root.list();
for( int i=0; i< folders.length; i++){
folders[i].open( Folder.READ_ONLY);
Message[] msgs= folders[i].getMessages();
for( int j=0; j< msgs.length; j++){
Object content= msgs[j].getContent();
// 注意 Multipart 并不是判定是否是附件的标准
if( content instanceof Multipart){
int count= ((Multipart)content).getCount();
for( int k=0; k< count; k++){
BodyPart part= ((Multipart)content).getBodyPart(k);
String disposition= part.getDisposition();
// 判断是否是附件
if( null!= disposition &&
disposition.equalsIgnoreCase( Part.ATTACHMENT)){
BufferedReader br= new BufferedReader( new InputStreamReader(
part.getInputStream()));
for( String line= br.readLine(); null!= line; line= br.readLine()){
System.out.println( line);
}
}
}
}
}
}
store.close();

其他操作
接收和发送是最通常的邮件操作,除此之外,一般还有:
- 复制、删除和移动邮件:这些操作都必须要Folder以读写方式打开,且是在Folder关闭
之后起作用。

// 删除
folder.open(Folder.READ_WRITE);
message.setFlag(Flags.Flag.DELETED, true);
folder.close(true);
// 移动,另一种形式的设置消息标志位。
inbox.copyMessages(xml_msgs, xml_dev);
Flags delete_flag = new Flags(Flags.Flag.DELETED);
inbox.setFlags(xml_msgs, delete_flag, true);
inbox.expunge();

考虑实现通过交互性更强的形式来进行这些操作,如显示邮件列表的web页,为了对指定
的邮件进行操作,需要使用Message的Message number。注意,它的值并不是一定,会因为其
他邮件(如另一人从另一个界面删除了一个邮件)的被删除而改变。因此,在实际使用时还
需要辅助其他的手段。
- 回复邮件

//false ,只回复给发件人; true ,是回复全体。
MimeMessage reply = (MimeMessage)message.reply(false);
reply.setFrom(new InternetAddress("[email protected]"));
reply.setText("Thanks");
Transport.send(reply);

- 消息转发:创建一个新邮件的BodyPart,将要转发的消息复制到新邮件的一个BodyPart中。
2着结合成一个MultiPart,作为新邮件的内容发出。

Message forward = new MimeMessage(session);
forward.setSubject("Fwd: " + message.getSubject());
forward.setFrom(new InternetAddress(from));
forward.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
// 创建新邮件的内容
Multipart multipart = new MimeMultipart();
// 创建新邮件的 BodyPart
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText( "Here you go with the original message:\n\n");
multipart.addBodyPart(messageBodyPart);
// 复制要转发的邮件,
messageBodyPart = new MimeBodyPart();
// 要将一条消息内容复制到另一条,只要复制 DataHandler 就可以了
messageBodyPart.setDataHandler(message.getDataHandler());
multipart.addBodyPart(messageBodyPart);
forward.setContent(multipart);
Transport.send(forward);

- 查找邮件,使用SearchTerm来进行。具体的SearchTerm查看相应的文档。

SearchTerm to = new RecipientStringTerm(Message.RecipientType.TO,
SearchTerm cc = new RecipientStringTerm(Message.RecipientType.CC,
SearchTerm xml_search = new OrTerm(to, cc);
Messages[] xml_msgs = inbox.search(xml_search);

- 邮件的编码主要用于非英文的支持。(注意,上述的例子中有中文,但是没有这么做就
成功地接收并显示了中文文字的内容。具体的使用还有待尝试)

编码:
String foreign_str = ".....";
String usable_str = MimeUtility.encodeText(foreign_str);
message.setText(usable_str);
解码:
String msg_str = message.getText();
String foreign_str = MimeUtility.decodeText(msg_str);
textfield.setText(foreign_str);

你可能感兴趣的:(java邮件开发)