Java實(shí)現(xiàn)批量發(fā)送帶附件的郵件代碼
前言
新功能上線時(shí)要經(jīng)常發(fā)包到測試或生產(chǎn)服務(wù)器進(jìn)行模塊部署,但由于安全限制只能通過郵件傳輸小于10M的附件這種方式把jar包上傳到服務(wù)器。所以往往要發(fā)送幾十個(gè)郵件手動發(fā)送比較麻煩,偷懶寫了個(gè)粘貼即用的Demo,如有不足,請多指教!
實(shí)體類(注意注釋)
代碼詳情如下:
package Email;
/*
* 參數(shù)實(shí)體類
* */
public class EmailParameter {
//發(fā)信郵箱
private String fromMailbox;
//發(fā)信郵箱密碼(獨(dú)立郵箱填寫密碼,163或qq等第三方郵箱填寫授權(quán)碼)
private String fromMailboxPWD;
//收信郵箱
private String toMailbox;
//附件在本機(jī)下的目錄路徑
private String enclosurePath;
//郵箱主機(jī)(如QQ郵箱是smtp.qq.com、163郵箱是smtp.163.com)
private String host;
//與上一次發(fā)送郵件間隔時(shí)間 默認(rèn)5秒
private long sleepTime = 5000;
//郵件發(fā)送成功后給本地文件打的成功標(biāo)識
private String successTag;
public String getSuccessTag() {
return successTag;
}
public void setSuccessTag(String successTag) {
this.successTag = successTag;
}
public String getFromMailbox() {
return fromMailbox;
}
public void setFromMailbox(String fromMailbox) {
this.fromMailbox = fromMailbox;
}
public String getFromMailboxPWD() {
return fromMailboxPWD;
}
public void setFromMailboxPWD(String fromMailboxPWD) {
this.fromMailboxPWD = fromMailboxPWD;
}
public String getToMailbox() {
return toMailbox;
}
public void setToMailbox(String toMailbox) {
this.toMailbox = toMailbox;
}
public String getEnclosurePath() {
return enclosurePath;
}
public void setEnclosurePath(String enclosurePath) {
this.enclosurePath = enclosurePath;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public long getSleepTime() {
return sleepTime;
}
public void setSleepTime(long sleepTime) {
this.sleepTime = sleepTime;
}
@Override
public String toString() {
return "EmailParameter{" +
"fromMailbox='" + fromMailbox + '\'' +
", fromMailboxPWD='" + fromMailboxPWD + '\'' +
", toMailbox='" + toMailbox + '\'' +
", enclosurePath='" + enclosurePath + '\'' +
", host='" + host + '\'' +
", sleepTime=" + sleepTime +
", successTag='" + successTag + '\'' +
'}';
}
}實(shí)現(xiàn)類
在確認(rèn)程序運(yùn)行完或發(fā)送故障報(bào)錯(cuò)后那些本地郵件已被發(fā)送那些本地文件未被發(fā)送時(shí),我代碼中用的是修改文件名的方式。這種方式方便但會有弊端,當(dāng)你要發(fā)送的附件文件為被分卷切分后的文件時(shí),文件名被修改會導(dǎo)致該分卷切分文件不能被正常解壓提取。建議用生成txt文件的方式記錄已發(fā)送文件的文件名。
代碼詳情如下:
package Email;
import com.sun.mail.util.MailSSLSocketFactory;
import org.springframework.util.StringUtils;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.File;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 編輯并發(fā)送郵件Service
* */
public class EmailsServiceImpl {
public String sendEmails(EmailParameter parameter){
if(!this.isMailbox(parameter.getFromMailbox())){
return "發(fā)信郵箱格式不正確";
}
if(!this.isMailbox(parameter.getToMailbox())){
return "收信郵箱格式不正確";
}
try{
//獲取郵件主機(jī)系統(tǒng)屬性
Properties properties = System.getProperties();
//設(shè)置郵件服務(wù)器
properties.setProperty("mail.smtp.host", parameter.getHost());
properties.put("mail.smtp.auth", "true");
MailSSLSocketFactory sslSocketFactory = new MailSSLSocketFactory();
sslSocketFactory.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.ssl.socketFactory", sslSocketFactory);
//獲取session
Session session = Session.getDefaultInstance(properties,new Authenticator(){
public PasswordAuthentication getPasswordAuthentication() {
//發(fā)件人賬號密碼
return new PasswordAuthentication(parameter.getFromMailbox(), parameter.getFromMailboxPWD());
}
});
//附件所在的目錄路徑
File fileUrl = new File(parameter.getEnclosurePath());
//獲取目錄下的所有文件(可以在.listFiles()方法中使用匿名內(nèi)部類重寫accept()方法針對文件名對文件進(jìn)行過濾)
File fileList [] = fileUrl.listFiles();
//已發(fā)送郵件數(shù)
int currentNum = 1;
if(StringUtils.isEmpty(fileList)){
return "文件夾"+parameter.getEnclosurePath()+"內(nèi)容為空";
}
for(File file : fileList){
//待發(fā)送郵件數(shù)
int surplusNum = fileList.length-currentNum;
//創(chuàng)建郵件
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(parameter.getFromMailbox()));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(parameter.getToMailbox()));
//郵件名命名
message.setSubject(file.getName());
//郵件文本
BodyPart messageBodyPart = new MimeBodyPart();
String text=String.format("本次共將發(fā)送郵件%s封-已發(fā)送%s封-待發(fā)送%s封", fileList.length,currentNum,surplusNum);
messageBodyPart.setText(text);
//郵件內(nèi)容
Multipart multipart = new MimeMultipart();
//將郵件文本放進(jìn)郵件內(nèi)容中
multipart.addBodyPart(messageBodyPart);
//郵件附件
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(file);
messageBodyPart.setDataHandler(new DataHandler(source));
//附件名命名
messageBodyPart.setFileName(MimeUtility.encodeText(file.getName()));
//將附件放進(jìn)郵件內(nèi)容中
multipart.addBodyPart(messageBodyPart);
//將郵件內(nèi)容放進(jìn)郵件中
message.setContent(multipart);
//發(fā)送
Transport.send(message);
//發(fā)送成功后將作為附件的本地文件名添加上成功標(biāo)識,防止發(fā)送郵件中程序意外終止后無法區(qū)分已發(fā)送和未發(fā)送(用時(shí)間戳區(qū)分批次順序用currentNum區(qū)分在本批次中的順序)
File newFileName = new File(file.getParent() + File.separator + String.format("%s_%s_%s",parameter.getSuccessTag(),currentNum,file.getName()));
file.renameTo(newFileName);
currentNum++;
System.out.println(text+"|已發(fā)送文件:"+file.getName());
//增加時(shí)間散列防止被第三方郵箱系統(tǒng)檢測為垃圾郵箱
Thread.sleep(parameter.getSleepTime());
}
}catch (Exception e) {
e.printStackTrace();
}
return "發(fā)送成功";
}
//郵箱驗(yàn)證
public boolean isMailbox(String mailbox){
String check = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
Pattern regex = Pattern.compile(check);
Matcher matcher = regex.matcher(mailbox);
boolean result = matcher.matches();
return result;
}
}方法中調(diào)用,詳情如下:
package Email;
public class Email {
public static void main(String[] args) throws Exception {
EmailParameter emailParameter = new EmailParameter();
emailParameter.setFromMailbox("******@163.com");
emailParameter.setFromMailboxPWD("******");
emailParameter.setToMailbox("******@qq.com");
emailParameter.setEnclosurePath("C:\\Users\\ly\\Desktop\\email");
emailParameter.setHost("smtp.163.com");
emailParameter.setSleepTime(5000);
emailParameter.setSuccessTag("ss");
System.out.println(new EmailsServiceImpl().sendEmails(emailParameter));
}
}總結(jié)
到此這篇關(guān)于Java實(shí)現(xiàn)批量發(fā)送帶附件的郵件代碼的文章就介紹到這了,更多相關(guān)Java發(fā)送帶附件的郵件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
servlet下載文件實(shí)現(xiàn)代碼詳解(五)
這篇文章主要為大家詳細(xì)介紹了servlet下載文件的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
Java常用API類之Math System tostring用法詳解
System類代表系統(tǒng),系統(tǒng)級的很多屬性和控制方法都放置在該類的內(nèi)部。該類位于java.lang包,Java 的 Math 包含了用于執(zhí)行基本數(shù)學(xué)運(yùn)算的屬性和方法,如初等指數(shù)、對數(shù)、平方根和三角函數(shù),toString() 方法用于返回以一個(gè)字符串表示的 Number 對象值2021-10-10
SpringMVC中使用bean來接收form表單提交的參數(shù)時(shí)的注意點(diǎn)
本篇文章主要介紹了SpringMVC中使用bean來接收form表單提交的參數(shù)時(shí)的注意點(diǎn),具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-05-05
Java設(shè)置PDF跨頁表格重復(fù)顯示表頭行的步驟詳解
這篇文章主要給大家介紹了關(guān)于Java設(shè)置PDF跨頁表格重復(fù)顯示表頭行的相關(guān)資料,這里使用的是Free Spire.PDF for Java的jar包,Spire.PDF for Java 是一款專門對 PDF 文檔進(jìn)行操作的 Java 類庫,需要的朋友可以參考下2021-07-07
使用java打印心型、圓形圖案的實(shí)現(xiàn)代碼
這篇文章主要介紹了使用java打印心型、圓形圖案的實(shí)現(xiàn)代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12

