Java實現郵件推送功能

程序own發表於2024-03-21

java 實現郵件推送

Java實現郵件推送功能

一、引入依賴

 <dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.4</version>
</dependency>

二、郵件來源使用者資訊

private static Logger log = Log.getLogger();
private static ThreadPoolExecutor threadPool;
private static String emailServer;
private static String userName;
private static String password;
private static String emailEncoding;
private static String emailFrom;
private static String sysEmailFromName;
private static String encoding;

private static void initMail(Email mail) throws EmailException {
mail.setHostName(emailServer);
mail.setAuthentication(userName, password);
mail.setCharset(emailEncoding);
mail.setFrom(emailFrom, sysEmailFromName);
}

三、執行緒池非同步

static {
threadPool = new ThreadPoolExecutor(5, 10, 3L, TimeUnit.SECONDS, new ArrayBlockingQueue(50), new ThreadPoolExecutor.DiscardPolicy());
//郵箱伺服器地址
emailServer = "smtp.163.com";
//使用者名稱
userName = "****";
//使用者密碼
password = "****";
//編碼格式
emailEncoding = "GBK";
//郵件來源
emailFrom = "*****.com.cn";
//郵件來源使用者名稱稱
sysEmailFromName = "****";
//編碼格式
encoding = "UTF-8";
}

四、非同步傳送

 private static void sendMail(Email mail) {
threadPool.execute(new Runnable() {
@Override
public void run() {
try {
mail.send();
} catch (EmailException var2) {
log.error("[郵件抄送失敗]-", var2);
}
}
});
}

五 完整傳送

import org.apache.commons.lang.StringUtils;
import org.apache.commons.mail.*;
import org.slf4j.Logger;

import javax.mail.internet.MimeUtility;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
* 郵件傳送工具
*/
public class MailUtil {

private static Logger log = Log.getLogger();
private static ThreadPoolExecutor threadPool;
private static String emailServer;
private static String userName;
private static String password;
private static String emailEncoding;
private static String emailFrom;
private static String sysEmailFromName;
private static String encoding;

private static void initMail(Email mail) throws EmailException {
mail.setHostName(emailServer);
mail.setAuthentication(userName, password);
mail.setCharset(emailEncoding);
mail.setFrom(emailFrom, sysEmailFromName);
}

static {
threadPool = new ThreadPoolExecutor(5, 10, 3L, TimeUnit.SECONDS,
new ArrayBlockingQueue(50),
new ThreadPoolExecutor.DiscardPolicy());
//郵箱伺服器地址
emailServer = "mailha.sinosafe.local";
//使用者名稱
userName = "****";
//使用者密碼
password = "****";
//編碼格式
emailEncoding = "GBK";
//郵件來源
emailFrom = "*****.com.cn";
//郵件來源使用者名稱稱
sysEmailFromName = "****";
//編碼格式
encoding = "UTF-8";
}

/**
* 非同步傳送郵件
*/
private static void sendMail(Email mail) {
threadPool.execute(new Runnable() {
@Override
public void run() {
try {
mail.send();
} catch (EmailException var2) {
log.error("[郵件抄送失敗]-", var2);
}
}
});
}

/**
* 抄送郵件
*/
public static void bccHtmlEmail(String subject, String html, List<String> users) throws Exception {
HtmlEmail email = new HtmlEmail();
initMail(email);
email.setSubject(subject);
for (String r : users){
email.addBcc(r);
}
email.setHtmlMsg(html);
email.setTextMsg("Your email client does not support HTML messages");
sendMail(email);
}

/**
* 單附件郵件
*/
public static void sendEmailWithFile(String subject, String html, List<String> receivers,
File file) throws UnsupportedEncodingException {
//附件
EmailAttachment att1 = new EmailAttachment();
att1.setPath(file.getPath());
att1.setDisposition(EmailAttachment.ATTACHMENT);
att1.setDescription("attachemnt description gril 中文");
att1.setName(MimeUtility.encodeText(file.getName()));
MultiPartEmail email = new MultiPartEmail();
email.setHostName(emailServer);
email.setAuthentication(userName, password);
email.setCharset(emailEncoding);
email.setSubject(subject);
try {
email.setMsg(html);
for (String user : receivers) {
email.addTo(user);
}
email.setFrom(emailFrom, sysEmailFromName);
email.attach(att1);
email.send();
} catch (EmailException e1) {
e1.printStackTrace();
}
}

public static void sendEmailMultifile(String subject, String html, List<String> receivers,
List<File> files){
HtmlEmail email = new HtmlEmail();
email.setHostName(emailServer);
email.setAuthentication(userName, password);
email.setCharset(emailEncoding);
email.setSubject(subject);
try {
for (String user : receivers) {
email.addTo(user);
}
email.setFrom(emailFrom, sysEmailFromName);
email.setHtmlMsg(html);
//附件
for(File f : files){
EmailAttachment att1 = new EmailAttachment();
att1.setPath(f.getPath());
att1.setDisposition(EmailAttachment.ATTACHMENT);
att1.setDescription("attachemnt description gril 中文"); //附件描述
//防止附件名亂碼
att1.setName(MimeUtility.encodeText(f.getName()));
email.attach(att1);
}
email.send();
}catch (EmailException | UnsupportedEncodingException e1) {
e1.printStackTrace();
}
}

/**
* 抄送郵件
*/
public static void ccHtmlEmail(String subject, String html, String receiver, String cc)
throws Exception {
ccHtmlEmail(subject, html, Arrays.asList(receiver.split(",")), cc, null);
}

/**
* 抄送郵件帶附件
*/
public static void ccHtmlEmail(String subject, String html, String receiver, String cc, File file)
throws Exception {
ccHtmlEmail(subject, html, Arrays.asList(receiver.split(",")), cc, file);
}

}

五、總結

Java實現郵件傳送,可以非同步使用執行緒池批次傳送多人,減小伺服器的壓力,可以傳送單頁面(可以是html語言寫的頁面),也可以單附件或者多附件傳送郵件。

相關文章