1
0
mirror of https://e.coding.net/circlecloud/YumCore.git synced 2024-11-21 01:38:51 +00:00

feat: 添加邮件发送

Signed-off-by: 502647092 <admin@yumc.pw>
This commit is contained in:
502647092 2016-09-27 15:12:25 +08:00
parent 9213170601
commit 931f6e5a8e
5 changed files with 633 additions and 0 deletions

View File

@ -0,0 +1,134 @@
package pw.yumc.YumCore.mail;
import com.google.common.net.HostAndPort;
/**
*
* @since 2016年4月9日 下午5:23:09
* @author
*/
public class MailAPI {
/**
* 快速发信
*
* @param smtp
* SMTP 服务器
* @param from
* 发件人
* @param to
* 收件人
* @param subject
* 主题
* @param content
* 内容
* @return 是否发送成功
*/
public static boolean send(final HostAndPort smtp, final String from, final String to, final String subject, final String content) {
return send(smtp, from, to, subject, content, null, null);
}
/**
* 快速发信
*
* @param smtp
* SMTP 服务器
* @param from
* 发件人
* @param to
* 收件人
* @param subject
* 主题
* @param content
* 内容
* @param username
* 用户名
* @param password
* 密码
* @return 是否发送成功
*/
public static boolean send(final HostAndPort smtp, final String from, final String to, final String subject, final String content, final String username, final String password) {
return send(smtp, from, null, to, subject, content, username, password);
}
/**
* 快速发信
*
* @param smtp
* SMTP 服务器
* @param from
* 发件人
* @param fromName
* 发件人名称
* @param to
* 收件人
* @param subject
* 主题
* @param content
* 内容
* @param username
* 用户名
* @param password
* 密码
* @return 是否发送成功
*/
public static boolean send(final HostAndPort smtp, final String from, final String fromName, final String to, final String subject, final String content, final String username, final String password) {
return send(smtp, from, fromName, to, null, subject, content, username, password);
}
/**
* 快速发信
*
* @param smtp
* SMTP 服务器
* @param from
* 发件人
* @param fromName
* 发件人名称
* @param to
* 收件人
* @param copyto
* 抄送
* @param subject
* 主题
* @param content
* 内容
* @param username
* 用户名
* @param password
* 密码
* @return 是否发送成功
*/
public static boolean send(final HostAndPort smtp, final String from, final String fromName, final String to, final String copyto, final String subject, final String content, final String username, final String password) {
return send(smtp, from, fromName, to, copyto, subject, content, null, username, password);
}
/**
* 快速发信
*
* @param smtp
* SMTP 服务器
* @param from
* 发件人
* @param fromName
* 发件人名称
* @param to
* 收件人
* @param copyto
* 抄送
* @param subject
* 主题
* @param content
* 内容
* @param filename
* 文件名称
* @param username
* 用户名
* @param password
* 密码
* @return 是否发送成功
*/
public static boolean send(final HostAndPort smtp, final String from, final String fromName, final String to, final String copyto, final String subject, final String content, final String[] filename, final String username, final String password) {
return XMail.send(smtp, from, fromName, to, copyto, subject, content, filename, username, password, true);
}
}

View File

@ -0,0 +1,57 @@
package pw.yumc.YumCore.mail;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
/**
* 服务器邮箱登录验证
*
* @author MZULE
*
*/
public class MailAuthenticator extends Authenticator {
/**
* 用户名登录邮箱
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 初始化邮箱和密码
*
* @param username
* 邮箱
* @param password
* 密码
*/
public MailAuthenticator(final String username, final String password) {
this.username = username;
this.password = password;
}
public void setPassword(final String password) {
this.password = password;
}
public void setUsername(final String username) {
this.username = username;
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
String getPassword() {
return password;
}
String getUsername() {
return username;
}
}

View File

@ -0,0 +1,81 @@
package pw.yumc.YumCore.mail;
import java.util.Date;
import javax.mail.Address;
class SimpleMail {
private String subject;
private Object content;
private Date sentDate = null;
private String from = null;
private Address sender;
public SimpleMail(final String subject, final Object content) {
this.subject = subject;
this.content = content;
}
/**
* 内容
*
* @return
*/
public Object getContent() {
return content;
}
public String getFrom() {
return from;
}
public Address getSender() {
return sender;
}
public Date getSentDate() {
return sentDate;
}
/**
* 标题
*
* @return
*/
public String getSubject() {
return subject;
}
/**
* 内容
*
* @param content
*/
public void setContent(final Object content) {
this.content = content;
}
public void setFrom(final String from) {
this.from = from;
}
public void setSender(final Address sender) {
this.sender = sender;
}
public void setSentDate(final Date date) {
this.sentDate = date;
}
/**
* 标题
*
* @param subject
*/
public void setSubject(final String subject) {
this.subject = subject;
}
}

View File

@ -0,0 +1,139 @@
package pw.yumc.YumCore.mail;
import java.util.Properties;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
/**
* 简单邮件发送器可单发群发
*
* @author MZULE
*
*/
public class SimpleMailSender {
/**
* 发送邮件的props文件
*/
private final transient Properties props = System.getProperties();
/**
* 邮件服务器登录验证
*/
private transient MailAuthenticator authenticator;
/**
* 邮箱session
*/
private transient Session session;
/**
* 初始化邮件发送器
*
* @param username
* 发送邮件的用户名(地址)并以此解析SMTP服务器地址
* @param password
* 发送邮件的密码
*/
public SimpleMailSender(final String username, final String password) {
// 通过邮箱地址解析出smtp服务器对大多数邮箱都管用
final String smtpHostName = "smtp." + username.split("@")[1];
init(smtpHostName, username, password);
}
/**
* 初始化邮件发送器
*
* @param smtpHostName
* SMTP邮件服务器地址
* @param username
* 发送邮件的用户名(地址)
* @param password
* 发送邮件的密码
*/
public SimpleMailSender(final String smtpHostName, final String username, final String password) {
init(username, password, smtpHostName);
}
/**
* 群发邮件
*
* @param mail
* 邮件对象
* @param recipients
* 收件人们
* @throws AddressException
* @throws MessagingException
*/
public void send(final SimpleMail mail, final String... recipients) throws AddressException, MessagingException {
// 创建mime类型邮件
final MimeMessage message = new MimeMessage(session);
// 设置发信人
if (mail.getFrom() != null) {
message.setFrom(new InternetAddress(mail.getFrom()));
} else {
message.setFrom(new InternetAddress(authenticator.getUsername()));
}
// 设置收件人们
final int num = recipients.length;
final InternetAddress[] addresses = new InternetAddress[num];
for (int i = 0; i < num; i++) {
addresses[i] = new InternetAddress(recipients[i]);
}
message.setRecipients(RecipientType.TO, addresses);
// 设置主题
message.setSubject(mail.getSubject());
// 设置邮件内容
message.setContent(mail.getContent().toString(), "text/html;charset=utf-8");
if (mail.getSentDate() != null) {
message.setSentDate(mail.getSentDate());
}
if (mail.getSender() != null) {
message.setSender(mail.getSender());
}
// 发送
Transport.send(message);
}
/**
* 群发邮件
*
* @param subject
* 邮件主题
* @param content
* 邮件内容
* @param recipients
* 收件人邮箱地址
* @throws AddressException
* @throws MessagingException
*/
public void send(final String subject, final Object content, final String... recipients) throws AddressException, MessagingException {
this.send(new SimpleMail(subject, content), recipients);
}
/**
* 初始化
*
* @param username
* 发送邮件的用户名(地址)
* @param password
* 密码
* @param smtpHostName
* SMTP主机地址
*/
private void init(final String smtpHostName, final String username, final String password) {
// 初始化props
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", smtpHostName);
// 验证
authenticator = new MailAuthenticator(username, password);
// 创建session
session = Session.getInstance(props, authenticator);
}
}

View File

@ -0,0 +1,222 @@
package pw.yumc.YumCore.mail;
import java.lang.reflect.Field;
import java.util.Date;
import java.util.HashMap;
import java.util.Properties;
import javax.activation.DataContentHandler;
import javax.activation.DataContentHandlerFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
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 com.google.common.net.HostAndPort;
public class XMail {
private static boolean autoRegister = true;
private static final HashMap<String, DataContentHandler> handlers = new HashMap<>();
private static final DataContentHandlerFactory defaultDataContentHandlerFactory;
static {
// todo
// activation.jar
// CommandMap.getDefaultCommandMap中取出已通过addMailcap注册的handler合集
// 通过合集遍历type和class打入map, 以取代手工注册
handlers.put("text/html", new com.sun.mail.handlers.text_html());
handlers.put("text/xml", new com.sun.mail.handlers.text_html());
handlers.put("text/plain", new com.sun.mail.handlers.text_plain());
handlers.put("multipart/mixed", new com.sun.mail.handlers.multipart_mixed());
handlers.put("multipart/*", new com.sun.mail.handlers.multipart_mixed());
handlers.put("message/rfc822", new com.sun.mail.handlers.message_rfc822());
handlers.put("image/gif", new com.sun.mail.handlers.image_gif());
handlers.put("image/jpeg", new com.sun.mail.handlers.image_jpeg());
defaultDataContentHandlerFactory = new DataContentHandlerFactory() {
@Override
public DataContentHandler createDataContentHandler(final String type) {
final DataContentHandler handler = handlers.get(type);
if (handler != null) {
return handler;
}
System.out.println("************* Unknown Type: " + type + " *************");
return null;
}
};
}
public static void addDataContentHandler(final String type, final DataContentHandler handler) {
handlers.put(type, handler);
}
public static boolean isAutoRegister() {
return autoRegister;
}
public static boolean registerDefaultDataContentHandlerFactory() {
try {
DataHandler.setDataContentHandlerFactory(defaultDataContentHandlerFactory);
return true;
} catch (final Exception e) {
}
return false;
}
/**
* 快速发信
*
* @param smtp
* SMTP 服务器
* @param from
* 发件人
* @param fromName
* 发件人名称
* @param to
* 收件人
* @param copyto
* 抄送
* @param subject
* 主题
* @param content
* 内容
* @param filename
* 文件名称
* @param username
* 用户名
* @param password
* 密码
* @param needAuth
* 是否需要验证
* @return 是否发送成功
*/
public static boolean send(final HostAndPort smtp, final String from, String fromName, final String to, final String copyto, final String subject, final String content, final String[] filename, final String username, final String password, final boolean needAuth) {
try {
if (isAutoRegister()) {
unregisterDefaultDataContentHandlerFactory();
registerDefaultDataContentHandlerFactory();
}
final Properties props = new Properties();
props.put("mail.smtp.host", smtp.getHostText());
props.put("mail.smtp.port", smtp.getPort());
props.put("mail.smtp.socketFactory.port", smtp.getPort());
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", needAuth);
final Session mailSession = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
if (fromName == null) {
fromName = from;
}
final MimeMessage mimeMsg = new MimeMessage(mailSession);
mimeMsg.setSubject(subject);
final MimeMultipart mp = new MimeMultipart();
if (content != null) {
try {
final BodyPart bp = new MimeBodyPart();
bp.setContent("" + content, "text/html;charset=GBK");
mp.addBodyPart(bp);
} catch (final Exception e) {
System.err.println("设置邮件正文时发生错误!" + e);
return false;
}
}
if (filename != null) {
for (final String file : filename) {
try {
final BodyPart bp = new MimeBodyPart();
final FileDataSource fileds = new FileDataSource(file);
bp.setDataHandler(new DataHandler(fileds));
bp.setFileName(fileds.getName());
mp.addBodyPart(bp);
} catch (final Exception e) {
System.err.println("增加邮件附件:" + file + "发生错误!" + e);
}
}
}
mimeMsg.setContent(mp);
try {
// 设置发信人
try {
mimeMsg.setFrom(new InternetAddress(from, fromName));
} catch (final Exception e) {
mimeMsg.setFrom(new InternetAddress(from));
}
} catch (final Exception e) {
System.err.println("设置发信人发生错误!");
e.printStackTrace();
return false;
}
try {
mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
} catch (final Exception e) {
System.err.println("设置接收人发生错误!");
e.printStackTrace();
return false;
}
if (copyto != null) {
try {
// 设置抄送人
try {
mimeMsg.setFrom(new InternetAddress(from, fromName));
} catch (final Exception e) {
mimeMsg.setFrom(new InternetAddress(from));
}
} catch (final Exception e) {
System.err.println("设置抄送人发生错误!");
e.printStackTrace();
}
}
mimeMsg.setSentDate(new Date());
mimeMsg.saveChanges();
Transport.send(mimeMsg);
return true;
} catch (final Exception e) {
e.printStackTrace();
} finally {
if (isAutoRegister()) {
unregisterDefaultDataContentHandlerFactory();
}
}
return false;
}
public static void setAutoRegister(final boolean autoRegister) {
XMail.autoRegister = autoRegister;
}
public static Object unregisterDefaultDataContentHandlerFactory() {
try {
final Field field = DataHandler.class.getDeclaredField("factory");
field.setAccessible(true);
final Object object = field.get(null);
field.set(null, null);
return object;
} catch (final Exception e) {
}
return null;
}
}