封装Email发送多个附件以及多个发件人随机发送(附带一些微小注意点)

封装Email发送多个附件以及多个发件人随机发送
1.多个发件人进行随机选取
2.多个附近发送

代码铺设

	//appendixs 多个附件*(路径)
	//from(多个发件人-随机发送)
	//toFrom 收件人
	//title 标题
	//content 内容
	//fromHost 指定发送邮件的主机为
	//mailCC 多个抄送人
	public boolean uploadExam(List appendixs, List from, String toFrom, String title, String content,String fromHost,List mailCC)throws GeneralSecurityException {
		boolean boo= false;
		if(from==null || from.size()<=0 || StringUtils.isBlank(toFrom)){
			return boo;
		}
		Double ans = Math.floor(Math.random()*from.size());
//这个是我测试了下随机数字的准确性 忽略
//		for(int i =0;i<100;i++){
//			System.out.println( Math.floor(Math.random()*5));
//
//		}
		// 发件人电子邮箱
		String account =from.get(ans.intValue()).getAccount();
		//发件人电子邮箱密码
		String passWord=from.get(ans.intValue()).getPassword();
		//指定发送邮件的主机为 smtp.163.com或者其他
		String host =fromHost;
		// 获取系统属性
		Properties properties = System.getProperties();
		// 设置邮件服务器
		properties.setProperty("mail.smtp.host", host);
		properties.put("mail.smtp.auth", "true");
		MailSSLSocketFactory sf = new MailSSLSocketFactory();
		sf.setTrustAllHosts(true);
		properties.put("mail.smtp.ssl.enable", "true");
		properties.put("mail.smtp.ssl.socketFactory", sf);
		// 获取默认session对象
		Session session = Session.getInstance(properties, new Authenticator() {
			public PasswordAuthentication getPasswordAuthentication() { // qq邮箱服务器账户、第三方登录授权码
				return new PasswordAuthentication(account, passWord); // 发件人邮件用户名、密码
			}
		});
		try {
			//处理乱码
			System.setProperty("mail.mime.splitlongparameters","false");
			// 创建默认的 MimeMessage 对象  两个账号随机发送
			MimeMessage message = new MimeMessage(session);
			// Set 发件人
			message.setFrom(new InternetAddress(account));
			// Set 接收人
			message.addRecipient(Message.RecipientType.TO, new InternetAddress(toFrom));
			Integer size= 0;
			if(mailCC!=null && mailCC.size()>0){
				size = mailCC.size();
			}
			Address addressesCC[] = new Address[size+1];
			if( mailCC!=null && mailCC.size()>0) {
				//循环抄送人
				for (int i = 0; i < mailCC.size(); i++) {
					addressesCC[i] = (Address) new InternetAddress(mailCC.get(i)).clone();
				}
			}
			//抄送自己 为了避免成为垃圾邮件
			if(mailCC!=null && mailCC.size()>0){
				addressesCC[size] = (Address) new InternetAddress(account).clone();
			}else{
				addressesCC[0] = (Address) new InternetAddress(account).clone();
			}

			message.addRecipients(Message.RecipientType.CC, addressesCC);//设置抄送人
			//set 抄送人 为了避免成为垃圾邮件
			//message.setRecipients(Message.RecipientType.CC, account);
			// Set Subject: 主题文字
			if(StringUtils.isNotBlank(title)){
			//我是尝试了utf-8不行 ,才统一用GB2312
				message.setSubject(title,"GB2312");
			}else{
				message.setSubject("您好,您有一封邮件待查收","GB2312");
			}
			// 创建消息部分
			BodyPart messageBodyPart = new MimeBodyPart();
			if(StringUtils.isNotBlank(content)){
				// 消息
				//messageBodyPart.setText(content);
				//尝试GB2312解决正文乱码问题
				messageBodyPart.setContent(content, "text/plain;charset=GB2312"); // !!!注意设置编码
			}else{
				// 消息
				messageBodyPart.setContent("您好,您有封邮件请查收。", "text/plain;charset=GB2312"); // !!!注意设置编码
			}

			// 创建多重消息
			Multipart multipart = new MimeMultipart();
			// 设置文本消息部分
			multipart.addBodyPart(messageBodyPart);
			//业务逻辑代码 多个附件添加 路径
			for(String s :appendixs)
				if (!"".equals(s)) {
					// 附件部分
					messageBodyPart = new MimeBodyPart();
					// 设置要发送附件的文件路径
					DataSource source = new FileDataSource(s);
					//String S= ((FileDataSource) source).getFile().getName();
					messageBodyPart.setDataHandler(new DataHandler(source));
					// 处理附件名称中文(附带文件路径)乱码问题 不管用,未找到好的解决方法 压缩包尽量避免中文
					//messageBodyPart.setFileName(MimeUtility.encodeText(((FileDataSource) source).getFile().getName()));
					//就只这行可以防止乱码 尝试解决中文乱码问题
					messageBodyPart.setFileName(MimeUtility.encodeText(((FileDataSource) source).getFile().getName(),"utf-8",null));
					multipart.addBodyPart(messageBodyPart);
				}
			// 发送完整消息
			//message.setContent(multipart);
			// 发送完整消息 尝试解决中文乱码问题 尝试utf-8失败 改用GB2312
			message.setContent(multipart,"text/html;charset=GB2312");
			// 发送消息
			Transport.send(message);
			boo =true;
		} catch (Exception e) {
			e.printStackTrace();
			boo =false;
		}
		return boo;
	}

要注意一下几点
1.程序发送邮件 必须开通权限

封装Email发送多个附件以及多个发件人随机发送(附带一些微小注意点)_第1张图片
封装Email发送多个附件以及多个发件人随机发送(附带一些微小注意点)_第2张图片
2.为什么用getInstance() 而不用getDefaultInstance()方法

如果想要同时使用两个帐号发送javamail,比如使用[email protected]发送1#邮件,使用[email protected]发送2#邮件,这时候,你就需要同时创建两个java.mail.Session对象。
但是如果你仍然使用Session.getDefaultInstance创建session对象的话,你会发现,第二个username:[email protected]创建的session永远都和第一个一样,这是为什么呢?
因为,getDefaultInstance是真正单例模式,而且,里面的username和password属性是final型的,无法更改。所以,你会发现两封email都是由[email protected]发出来的。
所以这个时候你要使用javax.mail.Session.getInstance()方法来创建session对象。

3.为了避免被当做垃圾邮件 解决方法就是抄送自己
message.setRecipients(Message.RecipientType.CC, account);

WX:DBdb_0107欢迎随时指教~

                               				负重前行的不止你一人 ,
                              				暖心寄明月,送与闺中阁。

你可能感兴趣的:(201911)