import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.util.Date; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.NoSuchProviderException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; import org.apache.commons.lang.StringUtils; /** * 邮件发送器,方法调用顺序:<code>connect->send->close</code>。 */ public class MailSender { public static final String DEFAULT_MIME_TYPE = "text/html;charset=gb2312"; private String smtp; private String serverName; private String serverPasswd; private String from; private Session session; private Transport transport; /** * 构造器 * * @param smtp * SMTP服务地址 * @param serverName * 服务用户名 * @param serverPasswd * 服务密码 * @param from * 发送邮件的Email */ public MailSender(String smtp, String serverName, String serverPasswd, String from) { super(); this.smtp = smtp; this.serverName = serverName; this.serverPasswd = serverPasswd; this.from = from; } /** * 连接邮件服务器 */ public void connect() throws NoSuchProviderException { // ResourceBundle mailProps = ResourceBundle.getBundle("mail"); // 可以从配置文件读取相应的参数 Properties props = System.getProperties(); // 获得系统属性对象 props.put("mail.smtp.host", smtp); // 设置SMTP主机 props.put("mail.smtp.auth", "true"); // 是否到服务器用户名和密码验证 // 到服务器验证发送的用户名和密码是否正确 MailAutherticator emailAuther = new MailAutherticator(this.serverName, this.serverPasswd); // 设置邮件会话 this.session = Session.getInstance(props, emailAuther); // 设置传输协议 this.transport = session.getTransport("smtp"); } /** * 发送邮件 * * @param toEmails * 邮件接收地址列表 * @param subject * 主题 * @param content * 正文 * @param fileNames * 附件列表(文件名,显示名称). <code>null</code>表示无附件. * @param mimeType * MIME 类型 * @throws MessagingException * @throws UnsupportedEncodingException * 如果读取附件或发送失败 */ public void send(String[] toEmails, String subject, String content, String[] fileNames, String mimeType) throws MessagingException, UnsupportedEncodingException { // 设置from、to等信息 MimeMessage mimeMsg = new MimeMessage(this.session); if (!StringUtils.isEmpty(this.from)) { InternetAddress sentFrom = new InternetAddress(this.from); mimeMsg.setFrom(sentFrom); // 设置发送人地址 } InternetAddress[] sendTo = new InternetAddress[toEmails.length]; for (int i = 0; i < toEmails.length; i++) { sendTo[i] = new InternetAddress(toEmails[i]); } mimeMsg.setRecipients(MimeMessage.RecipientType.TO, sendTo); mimeMsg.setSubject(subject, Charset.defaultCharset().name()); MimeBodyPart messageBodyPart1 = new MimeBodyPart(); messageBodyPart1.setContent(content, mimeType); Multipart multipart = new MimeMultipart();// 附件传输格式 multipart.addBodyPart(messageBodyPart1); if (fileNames != null) { for (int i = 0; i < fileNames.length; i++) { MimeBodyPart messageBodyPart2 = new MimeBodyPart(); String[] strings = fileNames[i].split(","); // 选择出每一个附件名 String fileName = strings[0]; String displayName = strings[1]; // 得到数据源 FileDataSource fds = new FileDataSource(fileName); // 得到附件本身并至入BodyPart messageBodyPart2.setDataHandler(new DataHandler(fds)); // 得到文件名同样至入BodyPart messageBodyPart2.setFileName(MimeUtility .encodeText(displayName)); multipart.addBodyPart(messageBodyPart2); } } mimeMsg.setContent(multipart); // 设置信件头的发送日期 mimeMsg.setSentDate(new Date()); mimeMsg.saveChanges(); // 发送邮件 Transport.send(mimeMsg); } /** * 关闭连接 */ public void close() { try { transport.close(); } catch (MessagingException e) { throw new MailException("关闭连接出错",e); } } /** * 发送邮件(DEFAULT_MIME_TYPE) * * @param toEmails * 邮件接收地址列表 * @param subject * 主题 * @param content * 正文 * @param fileNames * 附件列表(文件名,显示名称). <code>null</code>表示无附件. * * @throws MessagingException * @throws UnsupportedEncodingException * 如果读取附件或发送失败 */ public void send(String[] toEmails, String subject, String content, String[] fileNames) throws MessagingException, UnsupportedEncodingException { this.send(toEmails, subject, content, fileNames, DEFAULT_MIME_TYPE); } /** * 发送邮件(无附件,DEFAULT_MIME_TYPE) * * @param toEmails * 邮件接收地址列表 * @param subject * 主题 * @param content * 正文 * * @throws MessagingException * @throws UnsupportedEncodingException * 如果读取附件或发送失败 */ public void send(String[] toEmails, String subject, String content) throws MessagingException, UnsupportedEncodingException { this.send(toEmails, subject, content, null, DEFAULT_MIME_TYPE); } /** * 发送邮件(无正文,无附件,DEFAULT_MIME_TYPE) * * @param toEmails * 邮件接收地址列表 * @param subject * 主题 * * @throws MessagingException * @throws UnsupportedEncodingException * 如果读取附件或发送失败 */ public void send(String[] toEmails, String subject) throws MessagingException, UnsupportedEncodingException { this.send(toEmails, subject, "", null, DEFAULT_MIME_TYPE); } }
import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; /** * 邮件服务器验证 */ public class MailAutherticator extends Authenticator { private String username; private String userpass; public void setUsername(String username) { this.username = username; } public void setUserpass(String userpass) { this.userpass = userpass; } public MailAutherticator(String username, String userpass) { super(); setUsername(username); setUserpass(userpass); } public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, userpass); } }