package com.tencent.service.impl; import java.io.File; import java.sql.Timestamp; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.annotation.Resource; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeUtility; import org.apache.log4j.Logger; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessageHelper; import com.mysql.jdbc.Blob; import com.tencent.dao.IMessageDAO; import com.tencent.dao.impl.MessageDAOImpl; import com.tencent.model.Message; import com.tencent.model.Team; import com.tencent.model.User; import com.tencent.service.IMessageService; public class MessageServiceImpl extends ServiceImpl<Message> implements IMessageService { public static Logger log = Logger.getLogger(MessageServiceImpl.class); @Override public Message findByTopic(String topic) { return ((IMessageService)dao).findByTopic(topic); } private JavaMailSenderImpl mailSender; public JavaMailSenderImpl getMailSender() { return this.mailSender; } public void setMailSender(JavaMailSenderImpl mailSender) { this.mailSender = mailSender; } @Override public List<Message> listOutDate(User user, boolean isOutdate) { return ((IMessageDAO) super.dao).listOutDate(user, isOutdate); } @Override public List<Message> listOutDate(User user, boolean isOutdate, int firstResult, int maxSize) { return ((IMessageDAO) super.dao).listOutDate(user, isOutdate, firstResult, maxSize); } @Override public Message createMessage(User sender, Blob content, Timestamp sendDate, int type, Team... teams) { Message message = new Message(); message.setSender(sender); message.setContent(content); message.setSendDate(sendDate); message.setType(type); message.setOutdate(false); message.getTeams().addAll(Arrays.asList(teams)); int id = ((MessageDAOImpl) super.dao).save(message); message = dao.findById(Message.class, id); if (sendDate == null) { this.sendMessages(message); } return message; } @Override public boolean sendMessages(Message message) { JavaMailSenderImpl senderImpl = new JavaMailSenderImpl(); MimeMessage mailMessage = senderImpl.createMimeMessage(); // 设置UTF-8或GBK编码,否则邮件会有乱码 MimeMessageHelper messageHelper; try { messageHelper = new MimeMessageHelper(mailMessage, true, "utf-8"); } catch (MessagingException e1) { e1.printStackTrace(); return false; } Set<User> users = message.getAcceptors(); Set<Team> teams = message.getTeams(); int size = users.size(); Iterator<Team> iterator = teams.iterator(); while (iterator.hasNext()) { size = size + iterator.next().getMembers().size(); } String[] strAddrs = new String[size]; int i = 0; for (Iterator<User> iUser = users.iterator(); iUser.hasNext(); i++) { strAddrs[i] = iUser.next().getEmail(); } for (Iterator<Team> iTeam = teams.iterator(); iTeam.hasNext();) { for (Iterator<User> _iUser = iTeam.next().getMembers().iterator(); _iUser.hasNext(); i++) { strAddrs[i] = _iUser.next().getEmail(); } } try { messageHelper.setTo(strAddrs);// 接受者 messageHelper.setFrom(message.getSender().getUsername());// 发送者 messageHelper.setSubject(message.getTopic());// 主题 // 邮件内容,注意加参数true messageHelper.setText( "<html><head></head><body><h1>hello!!chao.wang</h1></body></html>", true); // 附件内容 messageHelper.addInline("a", new File("E:/xiezi.jpg")); messageHelper.addInline("b", new File("E:/logo.png")); File file = new File("E:/测试中文文件.rar"); // 这里的方法调用和插入图片是不同的,使用MimeUtility.encodeWord()来解决附件名称的中文问题 messageHelper.addAttachment(MimeUtility.encodeWord(file.getName()), file); mailSender.send(mailMessage); } catch (Exception e) { e.printStackTrace(); return false; } message.setOutdate(true); ((MessageDAOImpl) super.dao).update(message); return true; } @Override public int cancelMessage(int userId, Message message) { if (message.getSender().getId() != userId) { return -1; } else if (message.getOutdate()) { return 0; } ((MessageDAOImpl) super.dao).delete(message); return 1; } @Resource(name="messageDao") public void setDao(IMessageDAO dao) { this.dao = dao; } public IMessageDAO getDao(){ return (IMessageDAO) this.dao; } }