這次的郵件發(fā)送功能實(shí)現(xiàn)了,當(dāng)用戶(hù)登錄時(shí),向某個(gè)郵箱發(fā)送登錄異常的郵件,還處在學(xué)習(xí)階段,過(guò)程可供參考
發(fā)送郵箱的相關(guān)設(shè)置
需要打開(kāi)郵箱的SMTP,POP3等服務(wù)器連接,設(shè)置授權(quán)碼,之后的自動(dòng)發(fā)送中可以通過(guò)設(shè)置郵箱名的授權(quán)碼,來(lái)通過(guò)SMTP服務(wù)器發(fā)送郵件(打開(kāi)方法為登錄網(wǎng)頁(yè)版郵箱,在設(shè)置中查找相關(guān)的選項(xiàng)開(kāi)啟)
發(fā)送郵箱前的初始化
在SenMails類(lèi)中首先實(shí)現(xiàn)一個(gè)Bean初始化后的操作,即afterPropertiesSet中的內(nèi)容
@Service
public class SendMails implements InitializingBean {
private JavaMailSenderImpl mailSender;
private static final Logger logger= LoggerFactory.getLogger(SendMails.class) ;
private FreeMarkerConfigurer freeMarkerConfigurer=new FreeMarkerConfigurer();
//mailSender初始化
@Override
public void afterPropertiesSet() throws Exception {
mailSender=new JavaMailSenderImpl();
mailSender.setUsername("xxx@126.com");//設(shè)置發(fā)送郵箱名
mailSender.setPassword("****");//設(shè)置Password
mailSender.setHost("smtp.126.com");//設(shè)置郵箱SMTP服務(wù)器地址(可以在郵箱服務(wù)網(wǎng)站上找到)
mailSender.setPort(465);
//設(shè)置端口號(hào) !??!這里不要按照郵箱網(wǎng)站提供的端口,一開(kāi)始用126提供的25,報(bào)錯(cuò),后來(lái)在StackOverflow上找解決方法,改成465就好使了
mailSender.setProtocol("smtps");//設(shè)置協(xié)議
mailSender.setDefaultEncoding("utf8");//設(shè)置默認(rèn)編碼方式
Properties javaMailProperties=new Properties();
javaMailProperties.put("mail.smtp.auth", "true");
javaMailProperties.put("mail.smtp.ssl.enable", "true");
javaMailProperties.put("mail.smtp.socketFactory.fallback", "true");
mailSender.setJavaMailProperties(javaMailProperties);
}
}
具體郵件發(fā)送功能實(shí)現(xiàn)
//to--發(fā)給誰(shuí) subject---標(biāo)題 template---模板 model---模板中變量的替換
public boolean sendWithHTMLTemplate(String to, String subject, String template, Map<String,Object> model)
{
try
{
String nick = MimeUtility.encodeText("AskMe系統(tǒng)消息");
InternetAddress from = new InternetAddress(nick + "<lily_young@126.com>");//加了一個(gè)昵稱(chēng)的發(fā)件人
MimeMessage mimeMessage = mailSender.createMimeMessage();//創(chuàng)建郵件文本
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);
Configuration configuration=new Configuration();
freeMarkerConfigurer.setConfiguration(configuration);
Template tpl=freeMarkerConfigurer.getConfiguration().getTemplate(template);
String result = FreeMarkerTemplateUtils.processTemplateIntoString(tpl,model);
//設(shè)置郵件發(fā)送的模板,和傳進(jìn)去的相關(guān)參數(shù)model
mimeMessageHelper.setTo(to);
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(result, true);//第二個(gè)參數(shù)true說(shuō)明text是html格式的
mailSender.send(mimeMessage);//發(fā)送
}
catch(Exception e)
{
logger.error("發(fā)送郵件失敗"+e);
return false;
}
return true;
}
發(fā)郵件的Handler
@Component
public class LoginExceptionHandler implements EventHandler{
@Autowired
SendMails sendMails;
@Autowired
UserService userService;
@Override
public void doHandle(EventModel event) {
Map<String,Object> map=new HashMap<String,Object>();
map.put("username",userService.getuserbyid(event.getUserid()).getName());
sendMails.sendWithHTMLTemplate(event.getkeyvalue("mail"),"用戶(hù)登錄異常","/src/main/resources/templates/mails/LoginException.html",map);
}
@Override
public List<EventType> getSupportEventType() {
return Arrays.asList(EventType.LOGIN);
}
}
在登錄頁(yè)面的Controller向異步隊(duì)列添加事件
eventProducer.fireEvent(new EventModel().setkeyvalue("mail","xx@xx.com").setUserid(userservice.getUserByName(username).getId()).setEventype(EventType.LOGIN));