Java實現(xiàn)批量發(fā)送帶附件的郵件代碼
前言
新功能上線時要經(jīng)常發(fā)包到測試或生產(chǎn)服務(wù)器進行模塊部署,但由于安全限制只能通過郵件傳輸小于10M的附件這種方式把jar包上傳到服務(wù)器。所以往往要發(fā)送幾十個郵件手動發(fā)送比較麻煩,偷懶寫了個粘貼即用的Demo,如有不足,請多指教!
實體類(注意注釋)
代碼詳情如下:
package Email; /* * 參數(shù)實體類 * */ public class EmailParameter { //發(fā)信郵箱 private String fromMailbox; //發(fā)信郵箱密碼(獨立郵箱填寫密碼,163或qq等第三方郵箱填寫授權(quán)碼) private String fromMailboxPWD; //收信郵箱 private String toMailbox; //附件在本機下的目錄路徑 private String enclosurePath; //郵箱主機(如QQ郵箱是smtp.qq.com、163郵箱是smtp.163.com) private String host; //與上一次發(fā)送郵件間隔時間 默認5秒 private long sleepTime = 5000; //郵件發(fā)送成功后給本地文件打的成功標識 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 + '\'' + '}'; } }
實現(xiàn)類
在確認程序運行完或發(fā)送故障報錯后那些本地郵件已被發(fā)送那些本地文件未被發(fā)送時,我代碼中用的是修改文件名的方式。這種方式方便但會有弊端,當你要發(fā)送的附件文件為被分卷切分后的文件時,文件名被修改會導致該分卷切分文件不能被正常解壓提取。建議用生成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{ //獲取郵件主機系統(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()方法針對文件名對文件進行過濾) 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(); //將郵件文本放進郵件內(nèi)容中 multipart.addBodyPart(messageBodyPart); //郵件附件 messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(file); messageBodyPart.setDataHandler(new DataHandler(source)); //附件名命名 messageBodyPart.setFileName(MimeUtility.encodeText(file.getName())); //將附件放進郵件內(nèi)容中 multipart.addBodyPart(messageBodyPart); //將郵件內(nèi)容放進郵件中 message.setContent(multipart); //發(fā)送 Transport.send(message); //發(fā)送成功后將作為附件的本地文件名添加上成功標識,防止發(fā)送郵件中程序意外終止后無法區(qū)分已發(fā)送和未發(fā)送(用時間戳區(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()); //增加時間散列防止被第三方郵箱系統(tǒng)檢測為垃圾郵箱 Thread.sleep(parameter.getSleepTime()); } }catch (Exception e) { e.printStackTrace(); } return "發(fā)送成功"; } //郵箱驗證 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實現(xiàn)批量發(fā)送帶附件的郵件代碼的文章就介紹到這了,更多相關(guān)Java發(fā)送帶附件的郵件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java因項目配置不當而引發(fā)的數(shù)據(jù)泄露
這篇文章主要介紹了Java因項目配置不當而引發(fā)的數(shù)據(jù)泄露解決辦法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09Java try()語句實現(xiàn)try-with-resources異常管理機制操作
這篇文章主要介紹了Java try()語句實現(xiàn)try-with-resources異常管理機制操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09java實現(xiàn)把兩個有序數(shù)組合并到一個數(shù)組的實例
今天小編就為大家分享一篇java實現(xiàn)把兩個有序數(shù)組合并到一個數(shù)組的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05Java網(wǎng)絡(luò)編程之UDP協(xié)議詳細解讀
這篇文章主要介紹了Java網(wǎng)絡(luò)編程之UDP協(xié)議詳細解讀,UDP協(xié)議全稱是用戶數(shù)據(jù)報協(xié)議,在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無連接的協(xié)議,在OSI模型中,在第四層——傳輸層,處于IP協(xié)議的上一層,需要的朋友可以參考下2023-12-12springboot發(fā)送request請求的方式小結(jié)
在Java中,發(fā)送HTTP請求是常見需求,hutool工具包和RestTemplate類是實現(xiàn)此功能的兩種主流方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-09-09SpringMVC的組件之HandlerExceptionResolver詳解
這篇文章主要介紹了SpringMVC的組件之HandlerExceptionResolver詳解,不管是在處理請求映射(HandlerMapping),還是在請求被處理(Handler)時拋出的異常,DispatcherServlet都會委托給HandlerExceptionResolver進行異常處理,該接口只有一個方法,需要的朋友可以參考下2023-10-10