Spring发邮件

1.spring中配置mailSender组件,beans.xml:

<!-- 据spring帮组文档,此处javaMail只需要mail.jar和JAF的activation.jar
      JavaMail1.4之后只需要mail.jar 
      1.创建mailSender--> 
      <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
      <!-- <property name="host" value="smtp.sina.com"/>
      <property name="protocol" value="smtp"/>
      <property name="username" value="kh_itat"/>
      <property name="password" value="password"/>
     -->  
         <property name="javaMailProperties">
          <props>
          <!-- 可以通过这里设置mail的部分私有属性 -->
              <prop key="mail.smtp.auth">true</prop>
              <prop key="mail.debug">true</prop>
          </props>
      </property>
    </bean>
      
      <!-- 正常情况下发送邮件,需要异步发送,否则会把大量的时间浪费在邮件发送上面,
      此时可能造成用户重新刷新,使用spring的ThreadPoolTaskExecutor
      可以方便实现多线程 -->
      <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
      <property name="corePoolSize" value="5" />
      <property name="maxPoolSize" value="10" />
      <property name="queueCapacity" value="25" />
    </bean>

2.外部测试

@Resource(name="mailSender")
    JavaMailSender mailSender;
    
    @Test
    public void test01(){
        try {
            /*创建MimeMessage*/
            MimeMessage msg=mailSender.createMimeMessage();
            /*通过MimeMessageHelper来完成对邮件信息的设置*/
            MimeMessageHelper helper=new MimeMessageHelper(msg,true,"utf-8");
            helper.setFrom("kh_itat@sina.com");
            helper.setTo("zhchl2010@hotmail.com");
            helper.setSubject("spring发送JavaMail邮件");
            /*设置邮件正文*/
            helper.setText("<div style='color:red;font-size:15px;'>JavaMail通过Spring发送邮件</div>"
                    + "<img src='cid:sss'/>", true);
            /*添加附件*/
            helper.addAttachment(MimeUtility.encodeText("日志"),
                    new FileSystemResource("F:/web/test/log4j/zhchl.log"));
            
            /*添加邮件内容中的图片*/
            FileSystemResource fsr=new FileSystemResource("F:/web/test/ImageTrans/Koala.jpg");
            helper.addInline("sss",fsr);
            mailSender.send(msg);
        } catch (MailException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

3.发邮件的内部线程
private class SendMailThread implements Runnable{

        private Message msg;
        private Integer[] userIds;
        private AttachDto ad;
        private String[] newName;
        private String realPath;
        private UserEmail ue;
        
        public SendMailThread(UserEmail _ue,Message msg, Integer[] userIds, AttachDto ad,
                String[] _newName,String _realPath) {
            super();
            this.msg = msg;
            this.userIds = userIds;
            this.ad = ad;
            this.newName=_newName;
            this.realPath=_realPath;
            this.ue=_ue;
        }

        @Override
        public void run() {
            sendMail(ue,msg,userIds,ad,newName,realPath);
        }
        
    }

4.spring多线程发邮件
    @Resource(name="mailSender")
    JavaMailSender mailSender;
    @Resource
    private TaskExecutor taskExecutor;
    /*spring发邮件*/
    //sendMail(msg,userIds,ad);
    /*spring多线程发送邮件,将发送邮件放置到一个线程中,这样就实现了异步处理*/
    taskExecutor.execute(new SendMailThread(ue,msg,userIds,ad,newNames,SystemContext.getRealPath()));

spring发邮件,较为直观的处理代码

public void send(String username, String password, List<String> receives,
			String subject, String content) {
		try{
			JavaMailSenderImpl jms=(JavaMailSenderImpl)mailSender;
			jms.setUsername(username);
			jms.setPassword(password);
			MimeMessage email=jms.createMimeMessage();
			MimeMessageHelper helper=new MimeMessageHelper(email,true,"utf-8");
			//TODO 发送者友好显示
			String domain=jms.getHost();
			helper.setFrom(username+"@"+domain.substring(domain.indexOf(".")+1));
			for(String to:receives){
				helper.addTo(to);
			}
			//TODO 附件添加
			
			/*格式化内容:替换图片和附件*/
			List<String> imgs=listContentImgUrl(content);
			/*必须先设置好内容的值,之后再来设置相应的嵌入附件,否则最后一个图片不会替换
			 * 建议:现设置好内容,之后再一次性添加图片
			 * 先定义一个Map保存cid和图片地址的对应关系*/
			Map<String,String> imgMaps=new HashMap<String,String>();
			int i=0;
			/*完成内容的替换*/
			for(String is:imgs){
				imgMaps.put("x"+i,is);
				content=content.replace(is,"cid:x"+i);
				i++;
			}
			helper.setText(content, true);
			/*添加嵌入式图片,key是cid,value是图片的地址
			 * 如果是本地图片文件(不以http开头),应该使用FileSystemResource传图片
			 * 首先得获取根目录webapp绝对路径*/
			for(String key:imgMaps.keySet()){
				String url=imgMaps.get(key);
				if(url.startsWith("http")){
					DataSource ds=new URLDataSource(new URL(url));
					helper.addInline(key, ds);
				}else{
					String path=request.getSession().getServletContext().ge                                            tRealPath("url");
					helper.addInline(key, new FileSystemResource(path));
				}
			}
			helper.setSubject(subject);
			jms.send(email);
		} catch (MailException e) {
			e.printStackTrace();
		} catch (MessagingException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}
	
	/**格式化内容中的图片,返回内容中所有的img标签条目*/
	protected List<String> listContentImgUrl(String content){
		Pattern p=Pattern.compile("<img.*?\\s+src=['\"](.*?)['\"].*?>");
		Matcher m=p.matcher(content);
		List<String> srcs=new ArrayList<String>();
		while(m.find()){
			srcs.add(m.group(1));
		}
		
		return srcs;
	}


转载于:https://my.oschina.net/686991/blog/346936

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值