IDEMPIERE-1899:EMail : Implement default mail text and allow images within message

This commit is contained in:
hieplq 2014-06-14 09:10:42 +07:00
parent 20776b2519
commit a235318f03
1 changed files with 128 additions and 4 deletions

View File

@ -25,9 +25,9 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.activation.DataSource; import javax.activation.DataSource;
import org.adempiere.webui.AdempiereWebUI; import org.adempiere.webui.AdempiereWebUI;
import org.adempiere.webui.component.AttachmentItem; import org.adempiere.webui.component.AttachmentItem;
import org.adempiere.webui.component.Button; import org.adempiere.webui.component.Button;
@ -497,7 +497,7 @@ public class WEMailDialog extends Window implements EventListener<Event>, ValueC
StringTokenizer st = new StringTokenizer(getTo(), " ,;", false); StringTokenizer st = new StringTokenizer(getTo(), " ,;", false);
String to = st.nextToken(); String to = st.nextToken();
EMail email = m_client.createEMail(getFrom(), to, getSubject(), getMessage(), true); EMail email = m_client.createEMail(getFrom(), to, getSubject(), replaceBASE64Img(getMessage()), true);
String status = "Check Setup"; String status = "Check Setup";
if (email != null) if (email != null)
{ {
@ -671,12 +671,133 @@ public class WEMailDialog extends Window implements EventListener<Event>, ValueC
} }
} }
/**
* convert attach image as base64 and embed to message content for preview in cfEditor
* @param mt
* @param attachment
* @return
*/
public static String embedImgToEmail (MMailText mt, MAttachment attachment){
String origonSign = mt.getMailText(true);
// pattern to get src value of attach image.
Pattern imgPattern = Pattern.compile("\\s+src\\s*=\\s*\"cid:(.*?)\"");
// matcher object to anlysic image tab in sign
Matcher imgMatcher = imgPattern.matcher(origonSign);
// part not include "cid:imageName"
List<String> lsPart = new ArrayList<String> ();
// list image name in sign
List<String> lsImgSrc = new ArrayList<String> ();
// start index of text part not include "cid:imageName"
int startIndex = 0;
// start index of "cid:imageName"
int startIndexMatch = 0;
// end index of "cid:imageName"
int endIndexMatch = 0;
// split sign string to part
// example: acb <img src="cid:image1"/> def <img src="cid:image2"/> ghi
// lsPart will include "acb <img ", "/> def <img ", "/> ghi"
// lsImgSrc wil include "image1", "image2"
while (imgMatcher.find()){
startIndexMatch = imgMatcher.start();
endIndexMatch = imgMatcher.end();
// split text from end last matcher to start matcher
String startString = origonSign.substring(startIndex, startIndexMatch);
lsPart.add(startString);
// get image name
lsImgSrc.add(imgMatcher.group(1).trim());
startIndex = endIndexMatch;
}
// end string not include "cid:imageName"
String startString = origonSign.substring(startIndex);
lsPart.add(startString);
// no image in sign return origon
if (lsPart.size() < 0){
return origonSign;
}
StringBuilder reconstructSign = new StringBuilder();
// no attachment because add server warning and return origon without src value,
// maybe can improve to remove img tag
if(attachment == null){
//TODO: add server warning log
for (String strPart : lsPart){
reconstructSign.append(strPart);
}
return reconstructSign.toString();
}
// resconstruct with image source convert to embed image by base64 encode
for (int i = 0; i < lsImgSrc.size(); i++){
if (i == 0)
reconstructSign.append(lsPart.get(0));
MAttachmentEntry[] entries = attachment.getEntries();
String imageBase64 = null;
// find file attach map with this name
for (MAttachmentEntry entry : entries) {
if (entry.getName().equalsIgnoreCase(lsImgSrc.get(i))){
imageBase64 = javax.xml.bind.DatatypeConverter.printBase64Binary(entry.getData());
break;
}
}
if (imageBase64 == null){
// no attach map with this src value
// add server warning and return origon without src value,
// maybe can improve to remove img tag
//TODO: add server warning log
}else{
// convert image to base64 encode and embed to img tag
reconstructSign.append(" srcSave=\"" + lsImgSrc.get(i) + "\" src=\"data:image/jpeg;base64," + imageBase64 + "\"");
}
reconstructSign.append(lsPart.get(i + 1));
}
return reconstructSign.toString();
}
/**
* remove base64 image encode in message content before sent email
* @param base64
* @return
*/
public static String replaceBASE64Img (String base64){
// pattern map base64 in image
Pattern imgPattern = Pattern.compile(" srcSave=\"(.*?)\" src=\"data:image/jpeg;base64,.*?\"");
// matcher object replace base64
Matcher imgMatcher = imgPattern.matcher(base64);
StringBuffer result = new StringBuffer();
// repace base64 string with origon image name to sent email
while (imgMatcher.find()){
imgMatcher.appendReplacement(result, " src = \"cid:$1\"");
}
if (result.length() > 0){
imgMatcher.appendTail(result);
return result.toString();
}else{
// no base64 in input string
return base64;
}
}
private void addMailText() private void addMailText()
{ {
MMailText mt = (MMailText) MUser.get(Env.getCtx()).getR_DefaultMailText(); MMailText mt = (MMailText) MUser.get(Env.getCtx()).getR_DefaultMailText();
if (mt.get_ID() > 0) { if (mt.get_ID() > 0) {
mt.setPO(MUser.get(Env.getCtx())); mt.setPO(MUser.get(Env.getCtx()));
fMessage.setValue(getMessage() + "\n" + mt.getMailText(true));
MAttachment attachment = MAttachment.get(Env.getCtx(), MMailText.Table_ID, mt.get_ID()); MAttachment attachment = MAttachment.get(Env.getCtx(), MMailText.Table_ID, mt.get_ID());
if (attachment != null) { if (attachment != null) {
MAttachmentEntry[] entries = attachment.getEntries(); MAttachmentEntry[] entries = attachment.getEntries();
@ -693,6 +814,9 @@ public class WEMailDialog extends Window implements EventListener<Event>, ValueC
addAttachment(dataSource, true); addAttachment(dataSource, true);
} }
} }
fMessage.setValue(getMessage() + "\n" + embedImgToEmail(mt, attachment));
} }
} }