jbpm4.4中mailコンポーネントからメールバグ

7094 ワード

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;
  }

}

しかし、JBPM 4は複数のmailサーバを支払うため、複数の要素を構成することができ、これは構成を迂回することに相当し、直接自分でプロファイルを読み取ることができます.もちろん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= "[email protected]" /></field> 
          <field name="password" ><string value= "password"/></field> 
         </authenticator>
      </mail-server>

これもJBPM 4の既存の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サーバを読み取ることができます.