Java实现批量发送带附件的邮件代码
目录
- 前言
- 实体类(注意注释)
- 实现类
- 方法中调用,详情如下:
- 总结
前言 【Java实现批量发送带附件的邮件代码】新功能上线时要经常发包到测试或生产服务器进行模块部署,但由于安全限制只能通过邮件传输小于10M的附件这种方式把jar包上传到服务器。所以往往要发送几十个邮件手动发送比较麻烦,偷懒写了个粘贴即用的Demo,如有不足,请多指教!
实体类(注意注释) 代码详情如下:
package Email; /** 参数实体类* */public class EmailParameter {//发信邮箱private String fromMailbox; //发信邮箱密码(独立邮箱填写密码,163或qq等第三方邮箱填写授权码)private String fromMailboxPWD; //收信邮箱private String toMailbox; //附件在本机下的目录路径private String enclosurePath; //邮箱主机(如QQ邮箱是smtp.qq.com、163邮箱是smtp.163.com)private String host; //与上一次发送邮件间隔时间 默认5秒private long sleepTime = 5000; //邮件发送成功后给本地文件打的成功标识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; } @Overridepublic String toString() {return "EmailParameter{" +"fromMailbox='" + fromMailbox + '\'' +", fromMailboxPWD='" + fromMailboxPWD + '\'' +", toMailbox='" + toMailbox + '\'' +", enclosurePath='" + enclosurePath + '\'' +", host='" + host + '\'' +", sleepTime=" + sleepTime +", successTag='" + successTag + '\'' +'}'; }}
实现类 在确认程序运行完或发送故障报错后那些本地邮件已被发送那些本地文件未被发送时,我代码中用的是修改文件名的方式。这种方式方便但会有弊端,当你要发送的附件文件为被分卷切分后的文件时,文件名被修改会导致该分卷切分文件不能被正常解压提取。建议用生成txt文件的方式记录已发送文件的文件名。
代码详情如下:
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; /** 编辑并发送邮件Service* */public class EmailsServiceImpl {public String sendEmails(EmailParameter parameter){if(!this.isMailbox(parameter.getFromMailbox())){return "发信邮箱格式不正确"; }if(!this.isMailbox(parameter.getToMailbox())){return "收信邮箱格式不正确"; }try{//获取邮件主机系统属性Properties properties = System.getProperties(); //设置邮件服务器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); //获取sessionSession session = Session.getDefaultInstance(properties,new Authenticator(){public PasswordAuthentication getPasswordAuthentication() {//发件人账号密码return new PasswordAuthentication(parameter.getFromMailbox(), parameter.getFromMailboxPWD()); }}); //附件所在的目录路径File fileUrl = new File(parameter.getEnclosurePath()); //获取目录下的所有文件(可以在.listFiles()方法中使用匿名内部类重写accept()方法针对文件名对文件进行过滤)File fileList [] = fileUrl.listFiles(); //已发送邮件数int currentNum = 1; if(StringUtils.isEmpty(fileList)){return "文件夹"+parameter.getEnclosurePath()+"内容为空"; }for(File file : fileList){//待发送邮件数int surplusNum = fileList.length-currentNum; //创建邮件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("本次共将发送邮件%s封-已发送%s封-待发送%s封", fileList.length,currentNum,surplusNum); messageBodyPart.setText(text); //邮件内容Multipart multipart = new MimeMultipart(); //将邮件文本放进邮件内容中multipart.addBodyPart(messageBodyPart); //邮件附件messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(file); messageBodyPart.setDataHandler(new DataHandler(source)); //附件名命名messageBodyPart.setFileName(MimeUtility.encodeText(file.getName())); //将附件放进邮件内容中multipart.addBodyPart(messageBodyPart); //将邮件内容放进邮件中message.setContent(multipart); //发送Transport.send(message); //发送成功后将作为附件的本地文件名添加上成功标识,防止发送邮件中程序意外终止后无法区分已发送和未发送(用时间戳区分批次顺序用currentNum区分在本批次中的顺序)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+"|已发送文件:"+file.getName()); //增加时间散列防止被第三方邮箱系统检测为垃圾邮箱Thread.sleep(parameter.getSleepTime()); }}catch (Exception e) {e.printStackTrace(); }return "发送成功"; } //邮箱验证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; }}
方法中调用,详情如下:
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)); }}
总结 到此这篇关于Java实现批量发送带附件的邮件代码的文章就介绍到这了,更多相关Java发送带附件的邮件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 事件代理
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Java|Java OpenCV图像处理之SIFT角点检测详解
- Node.js中readline模块实现终端输入
- java中如何实现重建二叉树