使用 JavaMail 收发邮件只需要下载两个开源的 jar 文件, mail.jar 和 activation.jar, 这两个 jar 包可以很容易的在网上找到,这里就不提供下载链接了。
下面是发送邮件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"; //发送方邮箱地址(如[email protected].) 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(); } } }