package com.whf.messagerelayer.utils;
import com.whf.messagerelayer.bean.EmailMessage;
import com.whf.messagerelayer.confing.Constant;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/**
* Created by WHF on 2017/3/25.
*/
public class EmailRelayerManager {
public static final int CODE_SUCCESS = 0x1;
public static final int CODE_FAILE = 0x0;
private static final String PORT_SSL = "465";
private static final String HOST_QQ = "smtp.qq.com";
private static final String HOST_163 = "smtp.163.com";
private static final String HOST_126 = "smtp.126.com";
private static final String HOST_GMAIL = "smtp.gmail.com";
private static final String HOST_OUTLOOK = "smtp.outlook.com";
//发送短信至目标邮件
public static int relayEmail(NativeDataManager dataManager,String content) {
Properties props = new Properties();
User user = getSenderUser(dataManager);
EmailMessage emailMessage = creatEmailMessage(content,dataManager);
setHost(dataManager,props);
//是否开启SSL
if (dataManager.getEmailSsl()){
if(dataManager.getEmailServicer()==Constant.EMAIL_SERVICER_OTHER){
setSslMode(props,PORT_SSL);
}else{
String port = dataManager.getEmailPort();
if(port!=null){
setSslMode(props,port);
}
}
}
setSenderToPro(props,user);
props.put("mail.smtp.auth", true);//如果不设置,则报553错误
props.put("mail.transport.protocol", "smtp");
//getDefaultInstace得到的始终是该方法初次创建的缺省的对象,getInstace每次获取新对象
Session session = Session.getInstance(props
,new SmtpAuthenticator(user));
session.setDebug(true);
try {
MimeMessage message = creatMessage(session,emailMessage);
Transport.send(message);
return CODE_SUCCESS;
} catch (MessagingException e) {
e.printStackTrace();
return CODE_FAILE;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return CODE_FAILE;
}
}
/**
* 创建邮件消息对象
* @param session
* @param emailMessage
* @return
* @throws UnsupportedEncodingException
* @throws MessagingException
*/
private static MimeMessage creatMessage(Session session, EmailMessage emailMessage)
throws UnsupportedEncodingException, MessagingException {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(emailMessage.getSenderAccount()
,emailMessage.getSenderName(),"UTF-8"));//发件人
message.setRecipients(MimeMessage.RecipientType.TO,emailMessage.getReceiverAccount());//收件人
message.setSubject(emailMessage.getSubject());//主题
message.setContent(emailMessage.getContent(),"text/html;charset=UTF-8");
return message;
}
/**
* SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果
* 开启了 SSL 连接,需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应
* 邮箱服务的帮助,QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
* @param props
* @param smtpPort
* @return
*/
private static void setSslMode(Properties props, String smtpPort) {
props.setProperty("mail.smtp.port", smtpPort);
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port", smtpPort);
}
/**
* 从本地数据获取发送方账号和密码
* @param dataManager
* @return
*/
private static User getSenderUser(NativeDataManager dataManager){
return new User(dataManager.getEmailAccount(),dataManager.getEmailPassword());
}
/**
* 将发送发的账号和密码设置给配置文件
* @param properties
* @param user
* @return
*/
private static void setSenderToPro(Properties properties, User user){
properties.put("mail.smtp.username", user.account);
properties.put("mail.smtp.password",user.password);
}
/**
* 设置主机
* @param dataManager
* @param props
* @return
*/
private static void setHost(NativeDataManager dataManager, Properties props) {
switch (dataManager.getEmailServicer()) {
case Constant.EMAIL_SERVICER_QQ:
props.put("mail.smtp.host", HOST_QQ);
break;
case Constant.EMAIL_SERVICER_163:
props.put("mail.smtp.host", HOST_163);
break;
case Constant.EMAIL_SERVICER_126:
props.put("mail.smtp.host", HOST_126);
break;
case Constant.EMAIL_SERVICER_OUTLOOK:
props.put("mail.smtp.host", HOST_OUTLOOK);
break;
case Constant.EMAIL_SERVICER_GMAIL:
props.put("mail.smtp.host", HOST_GMAIL);
break;
case Constant.EMAIL_SERVICER_OTHER:
String host = dataManager.getEmailHost();
if(host!=null){
props.put("mail.smtp.host", host);
}
break;
}
}
/**
* 登录认证
*/
private static class SmtpAuthenticator extends Authenticator {
String mUsername ;
String mPassword ;
public SmtpAuthenticator(User user) {
super();
this.mUsername = user.account;
this.mPassword = user.password;
}
@Override
public PasswordAuthentication getPasswordAuthentication() {
if ((mUsername != null) && (mUsername.length() > 0) && (mPassword != null)
&& (mPassword.length() > 0)) {
return new PasswordAuthentication(mUsername, mPassword);
}
return null;
}
}
/**
* 发送方账户密码实体类
*/
private static class User{
String account;
String password;
User(String account,String password){
this.account = account;
this.password = password;
}
}
/**
* 封装消息实体
* @param content
* @param dataManager
* @return
*/
private static EmailMessage creatEmailMessage(String content,NativeDataManager dataManager){
EmailMessage message = new EmailMessage();
message.setContent(content);
message.setSenderAccount(dataManager.getEmailAccount());
message.setSenderName(dataManager.getEmailSenderName());
message.setReceiverAccount(dataManager.getEmailToAccount());
message.setSubject(dataManager.getEmailSubject());
return message;
}
}