Sorry, I made a wrting mistake. I cannot send the HTML mail with inline image, and cannot send the HTML mail with attachement file, too. (I could send the plain text mail with an attachment image and HTML mail without attachment file)
I think It's only GAE's problem. Do you have any idea? On Dec 31, 11:23 pm, minor-undroid <[email protected]> wrote: > Hi there, > > I reproduced same problem. > I cannotsendattachmentfile and inline image with HTMLmail. > (Of course, I couldsendplain textmailwithoutattachmentand > HTMLmailwithout inline image) > I don't have any idea. It would be very helpful to tell me anything. > > I build the mime message in HtmlMimeMessage#createMimeMessage method. > My code is as follows, > / > *************************************************************************************/ > import java.io.ByteArrayOutputStream; > import java.io.IOException; > import java.io.InputStream; > import java.net.MalformedURLException; > import java.net.URL; > import java.util.ArrayList; > import java.util.regex.Matcher; > import java.util.regex.Pattern; > import java.util.regex.PatternSyntaxException; > > import javax.activation.DataHandler; > import javax.mail.MessagingException; > import javax.mail.internet.MimeBodyPart; > import javax.mail.internet.MimeMessage; > import javax.mail.internet.MimeMultipart; > import javax.mail.util.ByteArrayDataSource; > > import com.mnrngsk.test20091217.mail.CommonData; > import com.mnrngsk.test20091217.mail.DbgLog; > > public class HtmlMimeMessage { > > private static final String CID_DOMAIN = > "@xxxxxxx"; > private static final String REGEX_IMGTAG = > "<img(\"[^\"]*\"|'[^']*'| > [^'\">])*src=(\"[^\"]*\"|'[^']*'|[^'\">])*/?>"; > > private MimeMessage mmHtmlMsg = null; > private MimeMultipart mmpHtmlMail = null; > private String strHtmlSrc = ""; > private boolean bAttach = false; > private String strAttach = ""; > > private ArrayList<ReplacedImgTag> replacedImgTagList > = new > ArrayList<ReplacedImgTag>(); > > // constructor > public HtmlMimeMessage(MimeMessage msg, boolean bAttach) { > this.mmHtmlMsg = msg; > this.bAttach = bAttach; > } > > public void setSource(String strSrc) { > this.strHtmlSrc = strSrc; > } > > public void setAttachment(String strAttach) { > if (this.bAttach) { > this.strAttach = strAttach; > } > } > > private void addInlineImageTo(MimeMultipart mmp) { > int iImgSrcCount = this.replacedImgTagList.size(); > for (int i = 0; i < iImgSrcCount; i++) { > DbgLog.info("HtmlMimeMessage#addInlineImageTo; Inline > Image #" + > Integer.toString(i)); > > ImageMessageBodyFactory imageMbpFactory = new > ImageMessageBodyFactory(this.replacedImgTagList.get(i)); > MimeBodyPart mbpImg = > imageMbpFactory.createMessageBody(); > try { > mmp.addBodyPart(mbpImg); > > DbgLog.info("HtmlMimeMessage#addInlineImageTo;\n > mbpImg#ContentType=" > + mbpImg.getContentType() + > "\n this.mmpHtmlMail#ContentType=" > + mmp.getContentType()); > } catch (MessagingException e) { > e.printStackTrace(); > DbgLog.warning("HtmlMimeMessage#addInlineImageTo; > MessagingException; " + e.getMessage()); > } > } > } > > public boolean createMimeMessage() { > boolean bRes = false; > > try { > TextByHtmlMessageBodyFactory textMbpFactory = new > TextByHtmlMessageBodyFactory(this.strHtmlSrc); > MimeBodyPart mbpText = > textMbpFactory.createMessageBody(); > > HtmlMessageBodyFactory htmlMbpFactory = new > HtmlMessageBodyFactory > (this.strHtmlSrc, replacedImgTagList); > MimeBodyPart mbpHtml = > htmlMbpFactory.createMessageBody(); > > MimeMultipart mmpMixed = null; > MimeBodyPart mbpAttach = null; > > if (this.bAttach) { > > DbgLog.info("HtmlMimeMessage#createMimeMessage; wAttachment > (mixed);"); > > AttachedMessageBodyFactory attachMbpFactory = > new > AttachedMessageBodyFactory(); > > attachMbpFactory.setAttachment(this.strAttach); > mbpAttach = > attachMbpFactory.createMessageBody(); > > mmpMixed = attachMbpFactory.getMultipart(); > } > > MimeMultipart mmpAlter = new > MimeMultipart("alternative"); > > if (mbpText != null) { > mmpAlter.addBodyPart(mbpText); > > DbgLog.info("HtmlMimeMessage#createMimeMessage;" > + "\n mbpText#ContentType=" > + mbpText.getContentType() > + "\n mmpAlter#ContentType=" > + mmpAlter.getContentType() > ); > } > > int iImgSrcCount = this.replacedImgTagList.size(); > if (iImgSrcCount > 0) { > MimeMultipart mmpHtmlAndImg = new > MimeMultipart("related"); > > if (mbpHtml != null) { > mmpHtmlAndImg.addBodyPart(mbpHtml); > > DbgLog.info("HtmlMimeMessage#createMimeMessage;" > + "\n > mbpHtml#ContentType=" + mbpHtml.getContentType() > + "\n > mmpHtmlAndImg#ContentType=" + > mmpHtmlAndImg.getContentType() > ); > } > > addInlineImageTo(mmpHtmlAndImg); > > MimeBodyPart mbpHtmlAndImg = new > MimeBodyPart(); > mbpHtmlAndImg.setContent(mmpHtmlAndImg); > mmpAlter.addBodyPart(mbpHtmlAndImg); > > DbgLog.info("HtmlMimeMessage#createMimeMessage;" > + "\n > mbpHtmlAndImg#ContentType=" + mbpHtmlAndImg.getContentType > () > + "\n mmpAlter#ContentType=" > + mmpAlter.getContentType() > ); > } > else { > if (mbpHtml != null) { > mmpAlter.addBodyPart(mbpHtml); > > DbgLog.info("HtmlMimeMessage#createMimeMessage;" > + "\n > mbpHtml#ContentType=" + mbpHtml.getContentType() > + "\n > mmpAlter#ContentType=" + mmpAlter.getContentType() > ); > } > } > > if (this.bAttach) { > > DbgLog.info("HtmlMimeMessage#createMimeMessage; wAttachment > (mixed);"); > > MimeBodyPart mbpAlter = new MimeBodyPart(); > mbpAlter.setContent(mmpAlter); > > mmpMixed.addBodyPart(mbpAlter); > > DbgLog.info("HtmlMimeMessage#createMimeMessage;" > + "\n mbpAlter#ContentType=" > + mbpAlter.getContentType() > + "\n mmpMixed#ContentType=" > + mmpMixed.getContentType() > ); > > mmpMixed.addBodyPart(mbpAttach); > this.mmHtmlMsg.setContent(mmpMixed); > this.mmHtmlMsg.saveChanges(); > > DbgLog.info("HtmlMimeMessage#createMimeMessage;" > + "\n > this.mmHtmlMsg#ContentType=" + > this.mmHtmlMsg.getContentType() > + "\n===Preamble==>\n" + > mmpMixed.getPreamble() + > "\n<==Preamble===\n" > ); > this.mmpHtmlMail = mmpMixed; > } > else { > > DbgLog.info("HtmlMimeMessage#createMimeMessage; w/oAttachment;"); > > this.mmHtmlMsg.setContent(mmpAlter); > this.mmHtmlMsg.saveChanges(); > > DbgLog.info("HtmlMimeMessage#createMimeMessage;" > + "\n > this.mmHtmlMsg#ContentType=" + > this.mmHtmlMsg.getContentType() > + "\n===Preamble==>\n" + > mmpAlter.getPreamble() + > "\n<==Preamble===\n" > ); > this.mmpHtmlMail = mmpAlter; > } > > } catch (MessagingException e) { > e.printStackTrace(); > DbgLog.warning("HtmlMimeMessage#createHtmlMessage; > MessagingException; " + e.getMessage()); > } > > return bRes; > } > > ////////////////////////////////////////////////////////////////// > > class ReplacedImgTag { > public String strImgTagOrg = ""; > public String strImgTagCID = ""; > public String strImgSrcOrg = ""; > public String strImgSrcCID = ""; > public String strImgSrcFilename = ""; > > // constructor > public ReplacedImgTag(String tagOrg, String srcOrg) { > this.strImgTagOrg = tagOrg; > this.strImgSrcCID = getImageContentId(srcOrg); > this.strImgTagCID = "<img src=\"cid:" + > this.strImgSrcCID + "\" />"; > > this.strImgSrcOrg = srcOrg; > this.strImgSrcFilename = > getFilename(this.strImgSrcOrg); > } > > private String getImageContentId(String strFilename) { > int hashFilename = strFilename.hashCode(); > String strRes = Integer.toHexString(hashFilename) + > CID_DOMAIN; > return strRes; > } > > private String getFilename(String strImgSrcOrg) { > String strTmp = new String(strImgSrcOrg); > String strFile[] = strTmp.split("[/|\\\\]"); > String strFilename = strTmp; > if (strFile.length > 0) { > strFilename = strFile[strFile.length - 1]; > } > return strFilename; > } > } > > ////////////////////////////////////////////////////////////////// > > class TextByHtmlMessageBodyFactory { > > private String strHtmlSrc = ""; > > // constructor > public TextByHtmlMessageBodyFactory (String strHtmlSrc) { > this.strHtmlSrc = strHtmlSrc; > } > > private String convertHtmlTag(String strMsgbody, String regex, > String str) { > String strRes = strMsgbody; > Pattern p = Pattern.compile(regex); > > Matcher m = p.matcher(strMsgbody); > while (m.find()) { > } > strRes = m.replaceAll(str); > > return strRes; > } > > private String createPlainText(String strHtmlSrc) { > String strRes = convertHtmlTag(strHtmlSrc, > REGEX_IMGTAG, "[img]"); > strRes = convertHtmlTag(strRes, "<br\\s?/?>", "\n"); > strRes = convertHtmlTag(strRes, > "<(\"[^\"]*\"|'[^']*'|[^'\">])*>", > ""); > > return strRes; > } > > public MimeBodyPart createMessageBody() { > > MimeBodyPart mbp = null; > TextMessageBodyFactory txtMbpFactory = new > TextMessageBodyFactory > (); > > txtMbpFactory.setText(createPlainText(this.strHtmlSrc)); > mbp = txtMbpFactory.createMessageBody(); > > try { > > DbgLog.info("TextByHtmlMessageBodyFactory#createMessageBody;\n > mbp#ContentType=" > + mbp.getContentType()); > } catch (MessagingException e) { > e.printStackTrace(); > } > > return mbp; > } > } > > ////////////////////////////////////////////////////////////////// > > class ImageMessageBodyFactory { > > private static final String REGEX_HTTP = > "^https?://.*"; > > private ReplacedImgTag replacedImgTag = null; > > // constructor > public ImageMessageBodyFactory (ReplacedImgTag > replacedImgTag) { > this.replacedImgTag = replacedImgTag; > } > > private byte[] getImageByteArray() { > String strImgSrc = this.replacedImgTag.strImgSrcOrg; > byte[] rawData = null; > > if (strImgSrc.matches(REGEX_HTTP)) { > URL url = null; > ByteArrayOutputStream output = null; > try { > url = new > URL("https://www.google.com/accounts/ah/ > appengine.jpg"); > InputStream in; > in = url.openStream(); > > int len; > byte[] buffer = new byte[8192]; > output = new ByteArrayOutputStream(); > > while ((len = in.read(buffer, 0, > buffer.length)) != -1) { > output.write(buffer, 0, len); > } > rawData = output.toByteArray(); > > } catch (MalformedURLException e) { > e.printStackTrace(); > > DbgLog.warning("ImageMessageBodyFactory#getImageDataHandler; > MalformedURLException; " + e.getMessage()); > } catch (IOException e) { > e.printStackTrace(); > > DbgLog.warning("ImageMessageBodyFactory#getImageDataHandler; > IOException; " + e.getMessage()); > } > } > else { > } > > return rawData; > } > ... > > read more » -- You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
