Java怎么实现批量发送带附件的邮件

Java怎么实现批量发送带附件的邮件

这篇文章主要讲解了“Java怎么实现批量发送带附件的邮件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么实现批量发送带附件的邮件”吧!

实体类(注意注释)

代码详情如下:

Java怎么实现批量发送带附件的邮件

packageEmail;/**参数实体类**/publicclassEmailParameter{//发信邮箱privateStringfromMailbox;//发信邮箱密码(独立邮箱填写密码,163或qq等第三方邮箱填写授权码)privateStringfromMailboxPWD;//收信邮箱privateStringtoMailbox;//附件在本机下的目录路径privateStringenclosurePath;//邮箱主机(如QQ邮箱是smtp.qq.com、163邮箱是smtp.163.com)privateStringhost;//与上一次发送邮件间隔时间默认5秒privatelongsleepTime=5000;//邮件发送成功后给本地文件打的成功标识privateStringsuccessTag;publicStringgetSuccessTag(){returnsuccessTag;}publicvoidsetSuccessTag(StringsuccessTag){this.successTag=successTag;}publicStringgetFromMailbox(){returnfromMailbox;}publicvoidsetFromMailbox(StringfromMailbox){this.fromMailbox=fromMailbox;}publicStringgetFromMailboxPWD(){returnfromMailboxPWD;}publicvoidsetFromMailboxPWD(StringfromMailboxPWD){this.fromMailboxPWD=fromMailboxPWD;}publicStringgetToMailbox(){returntoMailbox;}publicvoidsetToMailbox(StringtoMailbox){this.toMailbox=toMailbox;}publicStringgetEnclosurePath(){returnenclosurePath;}publicvoidsetEnclosurePath(StringenclosurePath){this.enclosurePath=enclosurePath;}publicStringgetHost(){returnhost;}publicvoidsetHost(Stringhost){this.host=host;}publiclonggetSleepTime(){returnsleepTime;}publicvoidsetSleepTime(longsleepTime){this.sleepTime=sleepTime;}@OverridepublicStringtoString(){return"EmailParameter{"+"fromMailbox='"+fromMailbox+'\''+",fromMailboxPWD='"+fromMailboxPWD+'\''+",toMailbox='"+toMailbox+'\''+",enclosurePath='"+enclosurePath+'\''+",host='"+host+'\''+",sleepTime="+sleepTime+",successTag='"+successTag+'\''+'}';}}

实现类

在确认程序运行完或发送故障报错后那些本地邮件已被发送那些本地文件未被发送时,我代码中用的是修改文件名的方式。这种方式方便但会有弊端,当你要发送的附件文件为被分卷切分后的文件时,文件名被修改会导致该分卷切分文件不能被正常解压提取。建议用生成txt文件的方式记录已发送文件的文件名。

代码详情如下:

packageEmail;importcom.sun.mail.util.MailSSLSocketFactory;importorg.springframework.util.StringUtils;importjavax.activation.DataHandler;importjavax.activation.DataSource;importjavax.activation.FileDataSource;importjavax.mail.*;importjavax.mail.internet.*;importjava.io.File;importjava.util.Properties;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/**编辑并发送邮件Service**/publicclassEmailsServiceImpl{publicStringsendEmails(EmailParameterparameter){if(!this.isMailbox(parameter.getFromMailbox())){return"发信邮箱格式不正确";}if(!this.isMailbox(parameter.getToMailbox())){return"收信邮箱格式不正确";}try{//获取邮件主机系统属性Propertiesproperties=System.getProperties();//设置邮件服务器properties.setProperty("mail.smtp.host",parameter.getHost());properties.put("mail.smtp.auth","true");MailSSLSocketFactorysslSocketFactory=newMailSSLSocketFactory();sslSocketFactory.setTrustAllHosts(true);properties.put("mail.smtp.ssl.enable","true");properties.put("mail.smtp.ssl.socketFactory",sslSocketFactory);//获取sessionSessionsession=Session.getDefaultInstance(properties,newAuthenticator(){publicPasswordAuthenticationgetPasswordAuthentication(){//发件人账号密码returnnewPasswordAuthentication(parameter.getFromMailbox(),parameter.getFromMailboxPWD());}});//附件所在的目录路径FilefileUrl=newFile(parameter.getEnclosurePath());//获取目录下的所有文件(可以在.listFiles()方法中使用匿名内部类重写accept()方法针对文件名对文件进行过滤)FilefileList[]=fileUrl.listFiles();//已发送邮件数intcurrentNum=1;if(StringUtils.isEmpty(fileList)){return"文件夹"+parameter.getEnclosurePath()+"内容为空";}for(Filefile:fileList){//待发送邮件数intsurplusNum=fileList.length-currentNum;//创建邮件MimeMessagemessage=newMimeMessage(session);message.setFrom(newInternetAddress(parameter.getFromMailbox()));message.addRecipient(Message.RecipientType.TO,newInternetAddress(parameter.getToMailbox()));//邮件名命名message.setSubject(file.getName());//邮件文本BodyPartmessageBodyPart=newMimeBodyPart();Stringtext=String.format("本次共将发送邮件%s封-已发送%s封-待发送%s封",fileList.length,currentNum,surplusNum);messageBodyPart.setText(text);//邮件内容Multipartmultipart=newMimeMultipart();//将邮件文本放进邮件内容中multipart.addBodyPart(messageBodyPart);//邮件附件messageBodyPart=newMimeBodyPart();DataSourcesource=newFileDataSource(file);messageBodyPart.setDataHandler(newDataHandler(source));//附件名命名messageBodyPart.setFileName(MimeUtility.encodeText(file.getName()));//将附件放进邮件内容中multipart.addBodyPart(messageBodyPart);//将邮件内容放进邮件中message.setContent(multipart);//发送Transport.send(message);//发送成功后将作为附件的本地文件名添加上成功标识,防止发送邮件中程序意外终止后无法区分已发送和未发送(用时间戳区分批次顺序用currentNum区分在本批次中的顺序)FilenewFileName=newFile(file.getParent()+File.separator+String.format("%s_%s_%s",parameter.getSuccessTag(),currentNum,file.getName()));file.renameTo(newFileName);currentNum++;System.out.println(text+"|已发送文件:"+file.getName());//增加时间散列防止被第三方邮箱系统检测为垃圾邮箱Thread.sleep(parameter.getSleepTime());}}catch(Exceptione){e.printStackTrace();}return"发送成功";}//邮箱验证publicbooleanisMailbox(Stringmailbox){Stringcheck="^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";Patternregex=Pattern.compile(check);Matchermatcher=regex.matcher(mailbox);booleanresult=matcher.matches();returnresult;}}

方法中调用,详情如下:

packageEmail;publicclassEmail{publicstaticvoidmain(String[]args)throwsException{EmailParameteremailParameter=newEmailParameter();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(newEmailsServiceImpl().sendEmails(emailParameter));}}

感谢各位的阅读,以上就是“Java怎么实现批量发送带附件的邮件”的内容了,经过本文的学习后,相信大家对Java怎么实现批量发送带附件的邮件这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

发布于 2022-01-05 23:28:41
收藏
分享
海报
0 条评论
34
上一篇:ecmascript的特性有哪些 下一篇:Python怎么提取音乐高潮部分
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码