jbpm4.4中mailコンポーネントからメールバグ
jbpm4.4でmailコンポーネントを使用してメールを送るときにsmtpにユーザーを検証するように要求し、jbpmのクラスには権限検証の接続がありません.コメントコードは修正され、smtp検証サーバからメールが送信されます.テストに成功しました.
しかし、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の構成を追加します.以下のようにします.
これもJBPM 4の既存のMailSessionImplを上書きするために、一定の修正を行う必要があります.コードは以下の通りです.
上記の理由で、emailオブジェクトの内容を新しいmsgオブジェクトにコピーする理由については、主にmsgにmailSessionを設定します.そうしないと、エラーが発生します.
これで複数のmailサーバを読み取ることができます.
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を構成する.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サーバを読み取ることができます.