jbpm4.4中使用mail组件发邮件时要求smtp 验证用户,jbpm那个类没有实现权限验证的连接。
注释代码经过修改,实现了smtp验证服务器发邮件。测试成功!
public class MailSessionImpl implements MailSession { private List<MailServer> mailServers; public void send(Collection<Message> emails) { //自定义代码,加载配置文件并读取信息 InputStream is = this.getClass().getResourceAsStream("/jbpm.mail.properties"); Properties props = new Properties(); String user = null; String password = null; String host = null; try { props.load(is); host = props.getProperty("mail.smtp.host"); user = props.getProperty("mail.from"); password = props.getProperty("mail.smtp.password"); } catch (IOException e1) { e1.printStackTrace(); } // Emails need to have the sessions populated. for (Message email : emails) { try { Address[] to = email.getRecipients(RecipientType.TO); Address[] cc = email.getRecipients(RecipientType.CC); Address[] bcc = email.getRecipients(RecipientType.BCC); for (MailServer mailServer : mailServers) { // Need to apply filter. AddressFilter addressFilter = mailServer.getAddressFilter(); if (addressFilter != null) { // Set the email with the new filtered addresses. email.setRecipients(RecipientType.TO, addressFilter.filter(to)); email.setRecipients(RecipientType.CC, addressFilter.filter(cc)); email.setRecipients(RecipientType.BCC, addressFilter.filter(bcc)); } // if sender is not present, use local address Session mailSession = mailServer.getMailSession(); if (email.getFrom() == null) { email.setFrom(InternetAddress.getLocalAddress(mailSession)); } // If there is someone to send it to, then send it. Address[] recipients = email.getAllRecipients(); if (recipients.length > 0) { Transport transport = mailSession.getTransport(recipients[0]); try { //transport.connect();注释掉这行换成下面的 transport.connect(host, user, password); transport.sendMessage(email, recipients); } finally { transport.close(); } } } } catch (MessagingException e) { throw new JbpmException("could not send email: " + email, e); } } } public List<MailServer> getMailServers() { return mailServers; } protected void setMailServers(List<MailServer> mailServers) { this.mailServers = mailServers; } }
但是这样有个不好的地方,因为JBPM4支付多个mail服务器,即可以配置多个<mail-server>元素,这样相当于是绕过了<mail-server>配置,直接自己去读取了配置文件,当然你也可以在jbpm.mail.properties中进行配置多个mail host等,再经过一定的解析,解析出多个mail服务信息,再进行发送。
还有种做法是:
首先配置jbpm.cfg.xml.在这个文件中,默认导入了jbpm.default.cfg.xml. 这个文件里配置了mail的信息,但是没有配置authenticator信息,为了改他的配置,在我们的jbpm.cfg.xml中不再导入jbpm.default.cfg.xml. 这个文件,新建一个jbpm.customer.cfg.xml.文件,把原来jbpm.default.cfg.xml.中的内容拷过来,在其中加入authenticator的配置,如下:
<mail-server> <session-properties resource="jbpm.mail.properties" /> <authenticator class= "com.xtayfjpk.oa.mail.authenticator.MyMailAuthenticator" > <field name="username" ><string value= "user@qq.com" /></field> <field name="password" ><string value= "password"/></field> </authenticator> </mail-server>
这样也是需要覆盖掉JBPM4原有的MailSessionImpl为,作一定的修改,代码如下:
public class MailSessionImpl implements MailSession { private List<MailServer> mailServers; public void send(Collection<Message> emails) { // Emails need to have the sessions populated. for (Message email : emails) { try { Address[] to = email.getRecipients(RecipientType.TO); Address[] cc = email.getRecipients(RecipientType.CC); Address[] bcc = email.getRecipients(RecipientType.BCC); for (MailServer mailServer : mailServers) { // Need to apply filter. AddressFilter addressFilter = mailServer.getAddressFilter(); if (addressFilter != null) { // Set the email with the new filtered addresses. email.setRecipients(RecipientType.TO, addressFilter.filter(to)); email.setRecipients(RecipientType.CC, addressFilter.filter(cc)); email.setRecipients(RecipientType.BCC, addressFilter.filter(bcc)); } // if sender is not present, use local address Session mailSession = mailServer.getMailSession(); if (email.getFrom() == null) { email.setFrom(InternetAddress.getLocalAddress(mailSession)); } // If there is someone to send it to, then send it. Address[] recipients = email.getAllRecipients(); if (recipients.length > 0) { Transport transport = mailSession.getTransport(recipients[0]); try { //这里是修改的地方 Message msg = new MimeMessage(mailSession); try { msg.setText((String) email.getContent()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } msg.setSubject(email.getSubject()); msg.setFrom(email.getFrom()[0]); msg.setReplyTo(email.getReplyTo()); msg.setSentDate(new Date()); Transport.send(msg, recipients); } finally { transport.close(); } } } } catch (MessagingException e) { throw new JbpmException("could not send email: " + email, e); } } } public List<MailServer> getMailServers() { return mailServers; } protected void setMailServers(List<MailServer> mailServers) { this.mailServers = mailServers; } }
至于上面为什么要将email对象中的内容复制到一个新msg对象中,主要是要为msg设置mailSession,不然的话就会报错。
这样的话可以读取到多个mail服务器了。