zoukankan      html  css  js  c++  java
  • 使用JavaMail实现发送模板邮件以及保存到发件箱

    需要用到的jar包
    1.freemarker-2.3.19.jar
    2.javax.mail.jar
    3.javax.activation.jar

    本次测试邮箱是腾讯企业邮箱,其他未经测试。
    做这个功能是因为我女朋友每个月都需要手动去发几十个人的考勤、考核邮件,实在是太过重复的做一件很乏味的事情,所以才有了这个程序,不过,界面是使用的控制台,简单一点。

    核心代码展示

    /**
    	 * 发送邮件
    	 * @author hezhao
    	 * @Time   2017年3月13日 上午11:25:15
    	 */
    	public void send() {
    		System.out.println("正在发送邮件至:::["+to+"]  ...");
    		
    		// 设置邮件服务器
    		Properties prop = System.getProperties();
    		prop.put("mail.smtp.host", stmpmailServer);
    		prop.put("mail.smtp.auth", "true");
    		prop.put("mail.transport.protocol", this.send);
    		prop.put("mail.smtp.socketFactory.class",
    				"javax.net.ssl.SSLSocketFactory");
    		prop.put("mail.smtp.socketFactory.port", this.smtpport);
    		prop.put("mail.smtp.socketFactory.fallback", "false");
    
    		// 使用SSL,企业邮箱必需!
    		// 开启安全协议
    		MailSSLSocketFactory sf = null;
    		try {
    			sf = new MailSSLSocketFactory();
    			sf.setTrustAllHosts(true);
    		} catch (GeneralSecurityException e1) {
    			e1.printStackTrace();
    		}
    		prop.put("mail.smtp.starttls.enable", "true");
    		prop.put("mail.smtp.ssl.socketFactory", sf);
    
    		// 获取Session对象
    		Session session = Session.getDefaultInstance(prop, new Authenticator() {
    			// 此访求返回用户和密码的对象
    			@Override
    			protected PasswordAuthentication getPasswordAuthentication() {
    				PasswordAuthentication pa = new PasswordAuthentication(username,
    						password);
    				return pa;
    			}
    		});
    		// 设置session的调试模式,发布时取消
    		session.setDebug(true);
    
    		try {
    			// 封装Message对象
    			Message message = new MimeMessage(session);
    			// message.setFrom(new InternetAddress(from,from)); //设置发件人
    
    			// 设置自定义发件人昵称
    			String nick_from = "";
    			try {
    				nick_from = javax.mail.internet.MimeUtility.encodeText(this.nickname_from);
    			} catch (UnsupportedEncodingException e) {
    				e.printStackTrace();
    			}
    			message.setFrom(new InternetAddress(nick_from + " <" + from + ">"));
    
    			// 设置自定义收件人昵称
    			String nick_to = "";
    			try {
    				nick_to = javax.mail.internet.MimeUtility.encodeText(this.nickname_to);
    			} catch (UnsupportedEncodingException e) {
    				e.printStackTrace();
    			}
    			message.setRecipient(Message.RecipientType.TO, new InternetAddress(nick_to + " <" + to + ">"));// 设置收件人
    			message.setSubject(mailSubject);// 设置主题
    			message.setContent(mailContent, "text/html;charset=utf8");// 设置内容(设置字符集处理乱码问题)
    			message.setSentDate(new Date());// 设置日期
    
    			// 发送
    			Transport.send(message);
    			System.out.println("发送成功...");
    
    			//保存邮件到发件箱
    			saveEmailToSentMailFolder(message);
    			
    			if(mailSubject.contains("考勤")){
    				FileLog.writeLog(this.nickname_to + " <" + to + ">发送成功");
    			}else{
    				FileLog.writeLog(this.nickname_to + " <" + to + ">发送成功");
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    			System.out.println("发送邮件异常...");
    			
    			if(mailSubject.contains("考勤")){
    				FileLog.writeLog(this.nickname_to + " <" + to + ">发送失败");
    			}else{
    				FileLog.writeLog(this.nickname_to + " <" + to + ">发送失败");
    			}
    		}
    	}
    

    保存至发件箱

    /**
    	 * 获取用户的发件箱文件夹
    	 * 
    	 * @param message
    	 *            信息
    	 * @param store
    	 *            存储
    	 * @return
    	 * @throws IOException
    	 * @throws MessagingException
    	 */
    	private Folder getSentMailFolder(Message message, Store store)
    			throws IOException, MessagingException {
    		// 准备连接服务器的会话信息
    		Properties props = new Properties();
    		props.setProperty("mail.store.protocol", get);
    		props.setProperty("mail.imap.host", imapmailServer);
    		props.setProperty("mail.imap.port", "143");
    
    		/** QQ邮箱需要建立ssl连接 */
    		props.setProperty("mail.imap.socketFactory.class",
    				"javax.net.ssl.SSLSocketFactory");
    		props.setProperty("mail.imap.socketFactory.fallback", "false");
    		props.setProperty("mail.imap.starttls.enable", "true");
    		props.setProperty("mail.imap.socketFactory.port", imapport);
    
    		// 创建Session实例对象
    		Session session = Session.getInstance(props);
    		URLName urln = new URLName(get, imapmailServer, 143, null,
    				username, password);
    		// 创建IMAP协议的Store对象
    		store = session.getStore(urln);
    		store.connect();
    
    		// 获得发件箱
    		Folder folder = store.getFolder("Sent Messages");
    		// 以读写模式打开发件箱
    		folder.open(Folder.READ_WRITE);
    
    		return folder;
    	}
    
    	/**
    	 * 保存邮件到发件箱
    	 * 
    	 * @param message
    	 *            邮件信息
    	 */
    	private void saveEmailToSentMailFolder(Message message) {
    
    		Store store = null;
    		Folder sentFolder = null;
    		try {
    			sentFolder = getSentMailFolder(message, store);
    			message.setFlag(Flag.SEEN, true); // 设置已读标志
    			sentFolder.appendMessages(new Message[] { message });
    			
    			System.out.println("已保存到发件箱...");
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    
    			// 判断发件文件夹是否打开如果打开则将其关闭
    			if (sentFolder != null && sentFolder.isOpen()) {
    				try {
    					sentFolder.close(true);
    				} catch (MessagingException e) {
    					e.printStackTrace();
    				}
    			}
    			// 判断邮箱存储是否打开如果打开则将其关闭
    			if (store != null && store.isConnected()) {
    				try {
    					store.close();
    				} catch (MessagingException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    

    获取模板内容

       /**
    	 * 得到模板内容
    	 * @author hezhao
    	 * @Time   2017年3月13日 下午1:01:08
    	 * @param fileName
    	 * @param map
    	 * @return
    	 */
    	public String getMailText(String fileName,Map<String,Object> map){
    		String htmlText = null;
    		try {
    			Template template = config.getTemplate(fileName);
    			htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);
    		} catch (IOException e) {
    			e.printStackTrace();
    		} catch (TemplateException e) {
    			e.printStackTrace();
    		}
    		return htmlText;
    	}
    
    

    替换模板内容

    FreemarkerUtil freemarkerUtil = null;
    try {
         freemarkerUtil = (FreemarkerUtil) context.getBean("freemarkerUtil");
    } catch (Exception e) {
        System.out.println("出现异常!!!");
        e.printStackTrace();
    }			
    String mailContent = freemarkerUtil.getMailText(fileName, map);
    
    

    HTML模板(这个还是景洲帮我实现的)

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    	</head>
    	<style>
    		table{border-collapse:collapse; text-align: center;font-size:12px;}
    		.yellow{background: #FFFF00;}
    		.blod{font-weight: bold;}
    	</style>
    	<body>
    	<table width="1160"  border="1">
    	  <tr>
    	    <td colspan="11" align="center" style="font-size: 22px;">${title}</td>
          </tr>
    	  <tr>
    	    <td rowspan="2" class="yellow">序号</td>
    	    <td rowspan="2" class="yellow">部门</td>
    	    <td rowspan="2" class="yellow">姓名</td>
    	    <td rowspan="2" class="yellow">入职时间</td>
    	    <td colspan="5" class="blod" style="font-size: 14px;">考勤结果汇总</td>
    	    <td> </td>
    	    <td rowspan="2" >备注</td>
          </tr>
    	  <tr>
    	    <td>正常出勤</td>
    	    <td>请假小时</td>
    	    <td>迟到分钟</td>
    	    <td>迟到扣款</td>
    	    <td>旷工天数</td>
    	    <td>休年假天数</td>
          </tr>
    	  <tr>
    	    <td>${no}</td>
    	    <td>${dept}</td>
    	    <td>${name}</td>
    	    <td>${intotime}</td>
    	    <td class="yellow blod">${workday}</td>
    	    <td class="blod">${outhour}</td>
    	    <td class="blod">${deletemin}</td>
    	    <td class="blod">${deletemoney}</td>
    	    <td class="blod">${kg}</td>
    	    <td class="blod">${year}</td>
    	    <td>${remark}</td>
          </tr>
        </table>
        
        <div>
        	<br />
        </div>
        
        <hr style=" 210px; height: 1px;" color="#b5c4df" size="1" align="left">
        
        <div style="font-size: 14px;font-family: 'lucida Grande', Verdana;">
        	<span>${bottom}</span>
        </div>
    		
    	</body>
    </html>
    

    作者:何钊

    来源:博客园

    链接:http://www.cnblogs.com/hezhao/

    CSDN:http://blog.csdn.net/sinat_27403673

    简书:http://www.jianshu.com/u/5ae45d288275

    Email:hezhao_java@163.com

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    读取exec返回值
    List
    面向对象设计原则
    CascadingDropDown省市县无刷新联动
    读写配置文件app.config
    变向实现动态水晶报表
    JS验证是否日期格式
    C#中调用API(转)
    (转自老赵Jeffrey Zhao)The status code returned from the server was: 12031”。(转)
    利用Javascript的“函数重载”实现自定义Alert样式
  • 原文地址:https://www.cnblogs.com/hezhao/p/7389821.html
Copyright © 2011-2022 走看看