JavaMail,是Sun发布的用来处理email的API,提供给开发者处理电子邮件相关的编程接口。通过使用它可以方便地执行一些常用的邮件传输。我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序。
在项目中添加JavaMail相关JAR文件
要使用JavaMail可以从Java官网下载JavaMail相关的文件,目前最新的是Download JavaMail 1.4.4。
如果使用Spring框架,也可以从Spring的lib目录中找到需要的JAR文件,具体在:spring目录下的\lib\j2ee文件夹下,需要用到的两个JAR文件是:mail.jar和activation.jar,把他们拷贝到项目中即可。
JavaMail常用的一些方法
JavaMail基本属性设置:
//创建JavaMail需要用到的属性类: Properties props = new Properties(); //设置smtp服务器 props.put("mail.smtp.host", "smtp.qq.com"); //设置验证为true props.put("mail.smtp.auth", "true");
创建验证器
Authenticator authenticator = new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("xxx@qq.com","password"); } };
使用上面的Properties和验证器创建邮件消息需要用到的Session:
Session session = Session.getDefaultInstance(props, authenticator);
创建和设置邮件:
MimeMessage mimeMessage = new MimeMessage(session); //设置发送者 mimeMessage.setFrom(new InternetAddress("xxx@qq.com")); //设置收件人邮箱: mimeMessage.setRecipient(Message.RecipientType.TO, "xxx@qq.com"); //设置标题: mimeMessage.setSubject("来自IT宅的邮件", "GBK"); //设置发送日期: mimeMessage.setSentDate(new Date());
设置内容有两种方法:
纯文本邮件
//创建附件 Multipart multipart = new MimeMultipart(); //创建邮件内容 MimeBodyPart body = new MimeBodyPart(); body.setText("正文:www.itzhai.com", "GBK");
复杂邮件
body.setContent("正文:www.itzhai.com","text/plain;charset=GBK"); multipart.addBodyPart(body);//发件内容
设置和添加附件
//创建附件 MimeBodyPart attache = new MimeBodyPart(); //读取附件attachement(File类型) attache.setDataHandler(new DataHandler(new FileDataSource(attachement))); //获取附件名称 String fileName = attachement.getName(); attache.setFileName(MimeUtility.encodeText(fileName, "GBK", null)); //添加附件 multipart.addBodyPart(attache);
发送邮件
Transport.send(mimeMessage);
如果要使用QQ邮箱,记得关闭独立密码保护功能和在邮箱中设置POP3/IMAP/SMTP服务。
以下是一个比较完整的发送电子邮件的函数
/** * 发送邮件 * @param sender 发送邮箱 * @param password 发送邮箱密码 * @param receivers 接受者邮箱 * @param title 邮件标题 * @param mailContent 邮件内容 * @param attachements 附件 * @param mimetype 对象的MIME类型 * @param charset 字符集 */ public static void sendEmail(final String sender,final String password,String[] receivers, String title, String mailContent, File[] attachements, String mimetype, String charset) { Properties props = new Properties(); //设置smtp服务器地址 //这里使用QQ邮箱,记得关闭独立密码保护功能和在邮箱中设置POP3/IMAP/SMTP服务 props.put("mail.smtp.host", "smtp.qq.com"); //需要验证 props.put("mail.smtp.auth", "true"); //创建验证器 Authenticator authenticator = new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(sender, password); } }; //使用Properties创建Session Session session = Session.getDefaultInstance(props, authenticator); //Set the debug setting for this Session session.setDebug(true); try { //使用session创建MIME类型的消息 MimeMessage mimeMessage = new MimeMessage(session); //设置发件人邮件 mimeMessage.setFrom(new InternetAddress(sender)); //获取所有收件人邮箱地址 InternetAddress[] receiver = new InternetAddress[receivers.length]; for (int i=0; i<receivers.length; i++) { receiver[i] = new InternetAddress(receivers[i]); } //设置收件人邮件 mimeMessage.setRecipients(Message.RecipientType.TO, receiver); //设置标题 mimeMessage.setSubject(title, charset); //设置邮件发送时间 //SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); //mimeMessage.setSentDate(format.parse("2011-12-1")); mimeMessage.setSentDate(new Date()); //创建附件 Multipart multipart = new MimeMultipart(); //创建邮件内容 MimeBodyPart body = new MimeBodyPart(); //设置邮件内容 body.setContent(mailContent, (mimetype!=null && !"".equals(mimetype) ? mimetype : "text/plain")+ ";charset="+ charset); multipart.addBodyPart(body);//发件内容 //设置附件 if(attachements!=null){ for (File attachement : attachements) { MimeBodyPart attache = new MimeBodyPart(); attache.setDataHandler(new DataHandler(new FileDataSource(attachement))); String fileName = getLastName(attachement.getName()); attache.setFileName(MimeUtility.encodeText(fileName, charset, null)); multipart.addBodyPart(attache); } } //设置邮件内容(使用Multipart方式) mimeMessage.setContent(multipart); //发送邮件 Transport.send(mimeMessage); } catch (Exception e) { e.printStackTrace(); } } private static String getLastName(String fileName) { int pos = fileName.lastIndexOf("\\"); if (pos > -1) { fileName = fileName.substring(pos + 1); } pos = fileName.lastIndexOf("/"); if (pos > -1) { fileName = fileName.substring(pos + 1); } return fileName; }