[appengine-java] Re: Can't send mail with attachment using JavaMail API
Hi there, I reproduced same problem. I cannot send attachment file and inline image with HTML mail. (Of course, I could send plain text mail without attachment and HTML mail without 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 = @xxx; 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 ArrayListReplacedImgTag replacedImgTagList = new ArrayListReplacedImgTag(); // 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; w Attachment (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= +
[appengine-java] Re: Can't send mail with attachment using JavaMail API
Don't forget to star issue : http://code.google.com/p/googleappengine/issues/detail?id=965 On Dec 31, 3:23 pm, minor-undroid mnrn...@gmail.com wrote: Hi there, I reproduced same problem. I cannot send attachment file and inline image with HTML mail. (Of course, I could send plain text mail without attachment and HTML mail without 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 = @xxx; 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 ArrayListReplacedImgTag replacedImgTagList = new ArrayListReplacedImgTag(); // 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; w Attachment (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);
[appengine-java] Re: Can't send mail with attachment using JavaMail API
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 mnrn...@gmail.com 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 = @xxx; 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 ArrayListReplacedImgTag replacedImgTagList = new ArrayListReplacedImgTag(); // 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(); }
Re: [appengine-java] Re: Can't send mail with attachment using JavaMail API
Thanks your quick response. I didn't find that issue. 2009/12/31 minor-undroid mnrn...@gmail.com 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 mnrn...@gmail.com 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 = @xxx; 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 ArrayListReplacedImgTag replacedImgTagList = new ArrayListReplacedImgTag(); // 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();
[appengine-java] Re: Can't send mail with attachment using JavaMail API
Hi Ikai, So does the order of setDataHandler + setFileName cause problems as I wrote above? Regards On Dec 1, 5:25 am, Ikai L (Google) ika...@google.com wrote: Interesting, so this did not work? attachment.setDataHandler(new DataHandler(mimePartDataSource)); attachment.setFileName(ticker.png); I'll need to do some research into the Java mail spec to see if we are matching it. Could be a bug if we aren't. On Thu, Nov 26, 2009 at 12:48 PM, Don lydonchan...@gmail.com wrote: Thanks Ikai. It did NOT work before because I set the dataHandler before I set the FileName. Just have to set the FileName and then set the DataHandler. attachment.setFileName(ticker.png); attachment.setDataHandler(new DataHandler(mimePartDataSource)); Is this behaviour intentional? Many thanks Don On Nov 24, 10:15 am, Ikai L (Google) ika...@google.com wrote: Don, First, a word of caution: you'll probably want to contact the creators of the site you are trying to fetch the image from if you haven't done so already. Their terms of service prohibit the use of automatic downloading of images:http://support.stockcharts.com/forums/31090/entries/20485 To fetch an image from a URL and send it via the Mail Service, this what you need to do: 1. Fetch your URL 2. Find the content type 3. Read the stream into a byte[] 4. Create a message and a data handler 5. Pass the byte[] into the data source, then into the data handler Example code:http://pastie.org/712159 import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import javax.mail.*; import javax.mail.util.ByteArrayDataSource; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.InternetAddress; import javax.activation.DataHandler; import java.io.IOException; import java.io.InputStream; import java.io.ByteArrayOutputStream; import java.net.URL; import java.util.Properties; public class GetStockServlet extends HttpServlet { private static final String SENDER = your.sen...@domain.com; private static final String RECIPIENT = your.recipi...@domain.com; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { URL url = new URL(http://yoururl.com/image.png;); InputStream in = url.openStream(); byte[] rawData; int len; byte[] buffer = new byte[8192]; ByteArrayOutputStream output = new ByteArrayOutputStream(); try { while ((len = in.read(buffer, 0, buffer.length)) != -1) output.write(buffer, 0, len); rawData = output.toByteArray(); } finally { output.close(); } response.setContentType(image/png); response.getOutputStream().write(rawData); response.getOutputStream().flush(); String htmlBody = Here is the quote you wanted; Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); Message message = new MimeMessage(session); Multipart mp = new MimeMultipart(); MimeBodyPart htmlPart = new MimeBodyPart(); try { message.setFrom(new InternetAddress(SENDER, Stock Service)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(RECIPIENT)); message.setSubject(Stock Quote: + symbol); htmlPart.setContent(htmlBody, text/html); mp.addBodyPart(htmlPart); ByteArrayDataSource dataSource = new ByteArrayDataSource(rawData, image/png); MimeBodyPart attachment = new MimeBodyPart(); attachment.setFileName(symbol + .png); attachment.setDataHandler(new DataHandler(dataSource)); mp.addBodyPart(attachment); message.setContent(mp); Transport.send(message); } catch (MessagingException e) { throw new IOException(e); } } } On Sun, Nov 22, 2009 at 9:04 AM, Don lydonchan...@gmail.com wrote: Hi Ikai, I tried your example code, but I cannot attach an image on the email that I send. There is no conversion error either. Here is snippets of the code, please help.. //Retrieving image: URL url = new URL(http://stockcharts.com/c-sc/sc?s=; + ticker + p=DAILYb=5g=0i=0r=3528); //Sending mail SendMail sendmail = new SendMail(customerEmail, url.openStream()); // send mail function public SendMail(String recipient, InputStream imagestream) { msg.setFrom( new InternetAddress(lydonchan...@gmail.com, dons
Re: [appengine-java] Re: Can't send mail with attachment using JavaMail API
Interesting, so this did not work? attachment.setDataHandler(new DataHandler(mimePartDataSource)); attachment.setFileName(ticker.png); I'll need to do some research into the Java mail spec to see if we are matching it. Could be a bug if we aren't. On Thu, Nov 26, 2009 at 12:48 PM, Don lydonchan...@gmail.com wrote: Thanks Ikai. It did NOT work before because I set the dataHandler before I set the FileName. Just have to set the FileName and then set the DataHandler. attachment.setFileName(ticker.png); attachment.setDataHandler(new DataHandler(mimePartDataSource)); Is this behaviour intentional? Many thanks Don On Nov 24, 10:15 am, Ikai L (Google) ika...@google.com wrote: Don, First, a word of caution: you'll probably want to contact the creators of the site you are trying to fetch the image from if you haven't done so already. Their terms of service prohibit the use of automatic downloading of images:http://support.stockcharts.com/forums/31090/entries/20485 To fetch an image from a URL and send it via the Mail Service, this what you need to do: 1. Fetch your URL 2. Find the content type 3. Read the stream into a byte[] 4. Create a message and a data handler 5. Pass the byte[] into the data source, then into the data handler Example code:http://pastie.org/712159 import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import javax.mail.*; import javax.mail.util.ByteArrayDataSource; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.InternetAddress; import javax.activation.DataHandler; import java.io.IOException; import java.io.InputStream; import java.io.ByteArrayOutputStream; import java.net.URL; import java.util.Properties; public class GetStockServlet extends HttpServlet { private static final String SENDER = your.sen...@domain.com; private static final String RECIPIENT = your.recipi...@domain.com; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { URL url = new URL(http://yoururl.com/image.png;); InputStream in = url.openStream(); byte[] rawData; int len; byte[] buffer = new byte[8192]; ByteArrayOutputStream output = new ByteArrayOutputStream(); try { while ((len = in.read(buffer, 0, buffer.length)) != -1) output.write(buffer, 0, len); rawData = output.toByteArray(); } finally { output.close(); } response.setContentType(image/png); response.getOutputStream().write(rawData); response.getOutputStream().flush(); String htmlBody = Here is the quote you wanted; Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); Message message = new MimeMessage(session); Multipart mp = new MimeMultipart(); MimeBodyPart htmlPart = new MimeBodyPart(); try { message.setFrom(new InternetAddress(SENDER, Stock Service)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(RECIPIENT)); message.setSubject(Stock Quote: + symbol); htmlPart.setContent(htmlBody, text/html); mp.addBodyPart(htmlPart); ByteArrayDataSource dataSource = new ByteArrayDataSource(rawData, image/png); MimeBodyPart attachment = new MimeBodyPart(); attachment.setFileName(symbol + .png); attachment.setDataHandler(new DataHandler(dataSource)); mp.addBodyPart(attachment); message.setContent(mp); Transport.send(message); } catch (MessagingException e) { throw new IOException(e); } } } On Sun, Nov 22, 2009 at 9:04 AM, Don lydonchan...@gmail.com wrote: Hi Ikai, I tried your example code, but I cannot attach an image on the email that I send. There is no conversion error either. Here is snippets of the code, please help.. //Retrieving image: URL url = new URL(http://stockcharts.com/c-sc/sc?s=; + ticker + p=DAILYb=5g=0i=0r=3528); //Sending mail SendMail sendmail = new SendMail(customerEmail, url.openStream()); // send mail function public SendMail(String recipient, InputStream imagestream) { msg.setFrom( new InternetAddress(lydonchan...@gmail.com, dons service)); msg.addRecipient(Message.RecipientType.TO, new InternetAddress (recipient)); msg.setSubject(dons service daily charts); Multipart multipart = new
[appengine-java] Re: Can't send mail with attachment using JavaMail API
Thanks Ikai. It did NOT work before because I set the dataHandler before I set the FileName. Just have to set the FileName and then set the DataHandler. attachment.setFileName(ticker.png); attachment.setDataHandler(new DataHandler(mimePartDataSource)); Is this behaviour intentional? Many thanks Don On Nov 24, 10:15 am, Ikai L (Google) ika...@google.com wrote: Don, First, a word of caution: you'll probably want to contact the creators of the site you are trying to fetch the image from if you haven't done so already. Their terms of service prohibit the use of automatic downloading of images:http://support.stockcharts.com/forums/31090/entries/20485 To fetch an image from a URL and send it via the Mail Service, this what you need to do: 1. Fetch your URL 2. Find the content type 3. Read the stream into a byte[] 4. Create a message and a data handler 5. Pass the byte[] into the data source, then into the data handler Example code:http://pastie.org/712159 import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import javax.mail.*; import javax.mail.util.ByteArrayDataSource; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.InternetAddress; import javax.activation.DataHandler; import java.io.IOException; import java.io.InputStream; import java.io.ByteArrayOutputStream; import java.net.URL; import java.util.Properties; public class GetStockServlet extends HttpServlet { private static final String SENDER = your.sen...@domain.com; private static final String RECIPIENT = your.recipi...@domain.com; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { URL url = new URL(http://yoururl.com/image.png;); InputStream in = url.openStream(); byte[] rawData; int len; byte[] buffer = new byte[8192]; ByteArrayOutputStream output = new ByteArrayOutputStream(); try { while ((len = in.read(buffer, 0, buffer.length)) != -1) output.write(buffer, 0, len); rawData = output.toByteArray(); } finally { output.close(); } response.setContentType(image/png); response.getOutputStream().write(rawData); response.getOutputStream().flush(); String htmlBody = Here is the quote you wanted; Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); Message message = new MimeMessage(session); Multipart mp = new MimeMultipart(); MimeBodyPart htmlPart = new MimeBodyPart(); try { message.setFrom(new InternetAddress(SENDER, Stock Service)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(RECIPIENT)); message.setSubject(Stock Quote: + symbol); htmlPart.setContent(htmlBody, text/html); mp.addBodyPart(htmlPart); ByteArrayDataSource dataSource = new ByteArrayDataSource(rawData, image/png); MimeBodyPart attachment = new MimeBodyPart(); attachment.setFileName(symbol + .png); attachment.setDataHandler(new DataHandler(dataSource)); mp.addBodyPart(attachment); message.setContent(mp); Transport.send(message); } catch (MessagingException e) { throw new IOException(e); } } } On Sun, Nov 22, 2009 at 9:04 AM, Don lydonchan...@gmail.com wrote: Hi Ikai, I tried your example code, but I cannot attach an image on the email that I send. There is no conversion error either. Here is snippets of the code, please help.. //Retrieving image: URL url = new URL(http://stockcharts.com/c-sc/sc?s=; + ticker + p=DAILYb=5g=0i=0r=3528); //Sending mail SendMail sendmail = new SendMail(customerEmail, url.openStream()); // send mail function public SendMail(String recipient, InputStream imagestream) { msg.setFrom( new InternetAddress(lydonchan...@gmail.com, dons service)); msg.addRecipient(Message.RecipientType.TO, new InternetAddress (recipient)); msg.setSubject(dons service daily charts); Multipart multipart = new MimeMultipart(); MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent( url2: , text/html); multipart.addBodyPart(htmlPart); // append png image? ByteArrayDataSource mimePartDataSource = new ByteArrayDataSource (imagestream, image/png); MimeBodyPart attachment = new MimeBodyPart();
Re: [appengine-java] Re: Can't send mail with attachment using JavaMail API
Looks like you're right. As far as I know there are no hidden methods. Another workaround for this limitation could be to store incoming images in the data store on an incoming email, then reference them in the emails that get sent out. It's not ideal, but it may be the solution to what you are looking for. On Wed, Nov 18, 2009 at 3:36 PM, mably fm2...@mably.com wrote: I haven't found a way to set a Content-ID header on a mimebodypart/ attachment using the low-level API. The MailService.Attachment class is quite rudimentary (only filename and data). May be some part of the low level API are still undocumented ? Thanx for all. On Nov 19, 12:25 am, Ikai L (Google) ika...@google.com wrote: That's good information to know. We are not using Sun's JavaMail implementation, so it's possible there are points of incompatibility. There's one last thing you may want to try: http://code.google.com/appengine/docs/java/javadoc/com/google/appengi... The above page documents the Low-Level API. Try creating an email object via that API, setting the Content-ID of the attachment and the HTML tag to point to the cid. You're already doing that in the example you sent using javax.mail, but I'm wondering if the low-level API is capable of doing this. If not, I'll open an issue. On Wed, Nov 18, 2009 at 3:06 PM, mably fm2...@mably.com wrote: Of course, the code above doesn't need to be run in mail handler servlet :-) On Nov 19, 12:01 am, mably fm2...@mably.com wrote: I've written a simple class sending an HTML email with an embedded image (cf. below) via GMail SMTP. It works perfectly fine when run locally from Eclipse. The same code in a GAE mail servlet handler produce the infamous Converting attachment data failed error. So it really seems to be a problem in GAE javamail implementation. /* * Copyright (C) 2009 Francois Masurel * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. */ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.mail.Message; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; /** * @author Francois * */ public class GMailSMTP { private static final String SMTP_HOST_NAME = smtp.gmail.com; private static final int SMTP_HOST_PORT = 465; private static final String SMTP_AUTH_USER = x...@gmail.com; private static final String SMTP_AUTH_PWD = yyy; public static void main(String[] args) throws Exception{ new GMailSMTP().test(); } public void test() throws Exception{ Properties props = new Properties(); props.put(mail.transport.protocol, smtps); props.put(mail.smtps.host, SMTP_HOST_NAME); props.put(mail.smtps.auth, true); // props.put(mail.smtps.quitwait, false); String from = SMTP_AUTH_USER; String to = SMTP_AUTH_USER; String subject = Testing SMTP-SSL; String htmlText = h1Hello/h1img src=\cid:image\; byte[] imgData = this.obtainByteData(enveloppe.gif); Session mailSession = Session.getDefaultInstance(props); mailSession.setDebug(true); Message msg = new MimeMessage(mailSession); msg.setFrom(new InternetAddress(from)); msg.addRecipient(Message.RecipientType.TO, new InternetAddress (to)); msg.setSubject(subject); Multipart mp = new MimeMultipart(related); MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent(htmlText, text/html); mp.addBodyPart(htmlPart); MimeBodyPart attachment = new MimeBodyPart(); attachment.setFileName(test.gif); attachment.setContent(imgData, image/gif); attachment.setHeader(Content-ID,image); mp.addBodyPart(attachment); msg.setContent(mp); Transport transport = mailSession.getTransport();
[appengine-java] Re: Can't send mail with attachment using JavaMail API
Any chance to see this bug fixed in the future ? Is there any documentation on the meaning of Converting attachment data failed error message ? On 19 nov, 20:55, Ikai L (Google) ika...@google.com wrote: Looks like you're right. As far as I know there are no hidden methods. Another workaround for this limitation could be to store incoming images in the data store on an incoming email, then reference them in the emails that get sent out. It's not ideal, but it may be the solution to what you are looking for. On Wed, Nov 18, 2009 at 3:36 PM, mably fm2...@mably.com wrote: I haven't found a way to set a Content-ID header on a mimebodypart/ attachment using the low-level API. The MailService.Attachment class is quite rudimentary (only filename and data). May be some part of the low level API are still undocumented ? Thanx for all. On Nov 19, 12:25 am, Ikai L (Google) ika...@google.com wrote: That's good information to know. We are not using Sun's JavaMail implementation, so it's possible there are points of incompatibility. There's one last thing you may want to try: http://code.google.com/appengine/docs/java/javadoc/com/google/appengi... The above page documents the Low-Level API. Try creating an email object via that API, setting the Content-ID of the attachment and the HTML tag to point to the cid. You're already doing that in the example you sent using javax.mail, but I'm wondering if the low-level API is capable of doing this. If not, I'll open an issue. On Wed, Nov 18, 2009 at 3:06 PM, mably fm2...@mably.com wrote: Of course, the code above doesn't need to be run in mail handler servlet :-) On Nov 19, 12:01 am, mably fm2...@mably.com wrote: I've written a simple class sending an HTML email with an embedded image (cf. below) via GMail SMTP. It works perfectly fine when run locally from Eclipse. The same code in a GAE mail servlet handler produce the infamous Converting attachment data failed error. So it really seems to be a problem in GAE javamail implementation. /* * Copyright (C) 2009 Francois Masurel * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. */ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.mail.Message; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; /** * @author Francois * */ public class GMailSMTP { private static final String SMTP_HOST_NAME = smtp.gmail.com; private static final int SMTP_HOST_PORT = 465; private static final String SMTP_AUTH_USER = x...@gmail.com; private static final String SMTP_AUTH_PWD = yyy; public static void main(String[] args) throws Exception{ new GMailSMTP().test(); } public void test() throws Exception{ Properties props = new Properties(); props.put(mail.transport.protocol, smtps); props.put(mail.smtps.host, SMTP_HOST_NAME); props.put(mail.smtps.auth, true); // props.put(mail.smtps.quitwait, false); String from = SMTP_AUTH_USER; String to = SMTP_AUTH_USER; String subject = Testing SMTP-SSL; String htmlText = h1Hello/h1img src=\cid:image\; byte[] imgData = this.obtainByteData(enveloppe.gif); Session mailSession = Session.getDefaultInstance(props); mailSession.setDebug(true); Message msg = new MimeMessage(mailSession); msg.setFrom(new InternetAddress(from)); msg.addRecipient(Message.RecipientType.TO, new InternetAddress (to)); msg.setSubject(subject); Multipart mp = new MimeMultipart(related); MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent(htmlText, text/html); mp.addBodyPart(htmlPart); MimeBodyPart attachment = new MimeBodyPart();
[appengine-java] Re: Can't send mail with attachment using JavaMail API
I'm just sending a simple mail from my Gmail account with an embedded gif image. I can perfectly read it from my mail servlet handler but when I try to relay it (cf. code from first message) I get this annoying Converting attachment data failed error which seems to be specific to GAE. Here is the mail sent data : MIME-Version: 1.0 Sender: x...@gmail.com Received: by 10.142.204.15 with HTTP; Wed, 18 Nov 2009 13:57:20 -0800 (PST) Date: Wed, 18 Nov 2009 22:57:20 +0100 Delivered-To: x...@gmail.com X-Google-Sender-Auth: c9f34852bdb4f249 Message-ID: 75c1488c0911181357w4e8efdc2r7e82d8e1c3e03...@mail.gmail.com Subject: Test From: Francois MASUREL x...@mably.com To: contact-test contact-t...@webwinewatch.appspotmail.com Content-Type: multipart/related; boundary=001636e90e61aa516e0478ac5398 --001636e90e61aa516e0478ac5398 Content-Type: multipart/alternative; boundary=001636e90e61aa516b0478ac5397 --001636e90e61aa516b0478ac5397 Content-Type: text/plain; charset=UTF-8 [image: ? ui=2view=attth=125094c9bff3199battid=0.1disp=attdrealattid=ii_125094c9bff3199bzw] --001636e90e61aa516b0478ac5397 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable img title=3D? ui=3D2amp;view=3Dattamp;th=3D125094c9bff3199bamp;attid=3D= 0.1amp;disp=3Dattdamp;realattid=3Dii_125094c9bff3199bamp;zw alt=3D?ui= =3D2amp;view=3Dattamp;th=3D125094c9bff3199bamp;attid=3D0.1amp;disp=3Dat= tdamp;realattid=3Dii_125094c9bff3199bamp;zw src=3Dcid:ii_125094c9bff319= 9bbr br --001636e90e61aa516b0478ac5397-- --001636e90e61aa516e0478ac5398 Content-Type: image/gif; name=enveloppe.gif Content-Transfer-Encoding: base64 Content-ID: ii_125094c9bff3199b X-Attachment-Id: ii_125094c9bff3199b R0lGODlhEAAQAPeYAP39/tHR5MrK4fLy99PT6NfX6Nvb6/ f3+ff3+uDg7sPD3fHx9ra206qqyrKy 0eLi8Onp8bCwz +jo8cvL4WVlm7y81cLC2fPz96ysyrCwzcXF3c7O487O4tDQ5Le30+fn8cvL4ufn 8PDw9/Ly+fDw9PLy+N7e66Skx8/ P46mpymBglNLS5KKixoWFsYaGs56ewNXV5pqawKyszuTk7pyc wdra6Pr6/ Ht7qnt7qXl5qry82LGx0MbG3pCQsrOz0qyszZubucjI3eLi7eDg6eDg7X5+rJSUu9zc 54uLtvz8/b+/2KenyPX1+K6uzpmZwOvr9a6uz8XF3Ovr9tLS5uPj8Hx8qvv7/ ZiYwLm50NPT5tjY 6K+v0M7O5IGBqtzc68/ P3mpqnoeHsLCwynJypNjY60ZGgJ2dw1hYjc7O4bi40nh4qWlpnNjY5fn5 +5SUvcTE2oCAqbOz0Le31tzc7L292vj4+sPD2by81unp8s/P5s3N3fPz +VxckqOjyHZ2psLC23p6 pt3d7d7e7PDw+L292JOTu/z8/Kury7Ozyra20ubm8MTE1/b2/Pn5/ Hd3qJCQvOnp876+2tHR5tHR 4oaGrbW10pmZv/7+/v/// wAA ACH5BAEAAJgALAAQABAA AAjlADEJHCiwzSQjamYQXIjAAo0fAq5gWChwgB03PiBdkhDkxgKCITywiLLn0qUkU2A4ESPQRKIm K5iYNIlHCREefg5gMjNBBICZAKx4SUGlQA4smOJw +BAAjaJLABh1aBCITJ8uNmrIuDRAS4Uldwyk OZQFhQIKXxCcEGLSkCBLOKowoKNDARJKmN5AMQmghIBIEfKAICTnURlMFwotuNQogYYHcwJsYDDm DCKBGXZcGiQpgIECf1zwAUJiIIQWI6RwSUAghooeQyi +cPCEwBYwcI5QFMimSCVHgPTsHlgnzJpF OncHBAA7 --001636e90e61aa516e0478ac5398-- On Nov 18, 10:34 pm, Ikai L (Google) ika...@google.com wrote: François, I'm not familiar with any standards with regard to inline images. Do you have this working outside of App Engine? Do you have working code from that? If there are discrepancies in our implementation of javax.mail.* and standard implementations we should be aware. On Mon, Nov 16, 2009 at 10:30 PM, mably fm2...@mably.com wrote: In fact standards attachments works. But it's not what I'm trying do do. I'm need to relay HTML messages with inline images and this is still not working. Is it a kind of limitation of GAE or is it supposed to work ? Thanx for your help. François On 16 nov, 23:09, mably fm2...@mably.com wrote: Hi Ikai, thanx for you help. I've copy pasted your code on my webapp (webwinewatch), I've no error but the mail isn't correctly relayed, all attachements are removed. I've just modified the sender, from and recipient lines : message.setSender(new InternetAddress(myaddress@gmail.com, Relay account)); message.setFrom(message.getSender()); message.setRecipient(Message.RecipientType.TO, message.getSender()); Do you have any clue ? You can test it, sending an email to : contact- t...@webwinewatch.appspotmail.com Thanx again for your help. On 16 nov, 21:35, Ikai L (Google) ika...@google.com wrote: I couldn't reproduce your exact error, but I was able to put together a working example of an inbound email handler to relay messages. I'm going to expand the documentation about processing inbound emails. Here's some working code:http://pastie.org/701517 Does this example help any? Code is also pasted below, but it'll be easier for you to look at the Pastie. import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest;
Re: [appengine-java] Re: Can't send mail with attachment using JavaMail API
What I mean is, is this code working on a different mail server? On Wed, Nov 18, 2009 at 2:00 PM, mably fm2...@mably.com wrote: I'm just sending a simple mail from my Gmail account with an embedded gif image. I can perfectly read it from my mail servlet handler but when I try to relay it (cf. code from first message) I get this annoying Converting attachment data failed error which seems to be specific to GAE. Here is the mail sent data : MIME-Version: 1.0 Sender: x...@gmail.com Received: by 10.142.204.15 with HTTP; Wed, 18 Nov 2009 13:57:20 -0800 (PST) Date: Wed, 18 Nov 2009 22:57:20 +0100 Delivered-To: x...@gmail.com X-Google-Sender-Auth: c9f34852bdb4f249 Message-ID: 75c1488c0911181357w4e8efdc2r7e82d8e1c3e03...@mail.gmail.com Subject: Test From: Francois MASUREL x...@mably.com To: contact-test contact-t...@webwinewatch.appspotmail.com Content-Type: multipart/related; boundary=001636e90e61aa516e0478ac5398 --001636e90e61aa516e0478ac5398 Content-Type: multipart/alternative; boundary=001636e90e61aa516b0478ac5397 --001636e90e61aa516b0478ac5397 Content-Type: text/plain; charset=UTF-8 [image: ? ui=2view=attth=125094c9bff3199battid=0.1disp=attdrealattid=ii_125094c9bff3199bzw] --001636e90e61aa516b0478ac5397 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable img title=3D? ui=3D2amp;view=3Dattamp;th=3D125094c9bff3199bamp;attid=3D= 0.1amp;disp=3Dattdamp;realattid=3Dii_125094c9bff3199bamp;zw alt=3D?ui= =3D2amp;view=3Dattamp;th=3D125094c9bff3199bamp;attid=3D0.1amp;disp=3Dat= tdamp;realattid=3Dii_125094c9bff3199bamp;zw src=3Dcid:ii_125094c9bff319= 9bbr br --001636e90e61aa516b0478ac5397-- --001636e90e61aa516e0478ac5398 Content-Type: image/gif; name=enveloppe.gif Content-Transfer-Encoding: base64 Content-ID: ii_125094c9bff3199b X-Attachment-Id: ii_125094c9bff3199b R0lGODlhEAAQAPeYAP39/tHR5MrK4fLy99PT6NfX6Nvb6/ f3+ff3+uDg7sPD3fHx9ra206qqyrKy 0eLi8Onp8bCwz +jo8cvL4WVlm7y81cLC2fPz96ysyrCwzcXF3c7O487O4tDQ5Le30+fn8cvL4ufn 8PDw9/Ly+fDw9PLy+N7e66Skx8/ P46mpymBglNLS5KKixoWFsYaGs56ewNXV5pqawKyszuTk7pyc wdra6Pr6/ Ht7qnt7qXl5qry82LGx0MbG3pCQsrOz0qyszZubucjI3eLi7eDg6eDg7X5+rJSUu9zc 54uLtvz8/b+/2KenyPX1+K6uzpmZwOvr9a6uz8XF3Ovr9tLS5uPj8Hx8qvv7/ ZiYwLm50NPT5tjY 6K+v0M7O5IGBqtzc68/ P3mpqnoeHsLCwynJypNjY60ZGgJ2dw1hYjc7O4bi40nh4qWlpnNjY5fn5 +5SUvcTE2oCAqbOz0Le31tzc7L292vj4+sPD2by81unp8s/P5s3N3fPz +VxckqOjyHZ2psLC23p6 pt3d7d7e7PDw+L292JOTu/z8/Kury7Ozyra20ubm8MTE1/b2/Pn5/ Hd3qJCQvOnp876+2tHR5tHR 4oaGrbW10pmZv/7+/v/// wAA ACH5BAEAAJgALAAQABAA AAjlADEJHCiwzSQjamYQXIjAAo0fAq5gWChwgB03PiBdkhDkxgKCITywiLLn0qUkU2A4ESPQRKIm K5iYNIlHCREefg5gMjNBBICZAKx4SUGlQA4smOJw +BAAjaJLABh1aBCITJ8uNmrIuDRAS4Uldwyk OZQFhQIKXxCcEGLSkCBLOKowoKNDARJKmN5AMQmghIBIEfKAICTnURlMFwotuNQogYYHcwJsYDDm DCKBGXZcGiQpgIECf1zwAUJiIIQWI6RwSUAghooeQyi +cPCEwBYwcI5QFMimSCVHgPTsHlgnzJpF OncHBAA7 --001636e90e61aa516e0478ac5398-- On Nov 18, 10:34 pm, Ikai L (Google) ika...@google.com wrote: François, I'm not familiar with any standards with regard to inline images. Do you have this working outside of App Engine? Do you have working code from that? If there are discrepancies in our implementation of javax.mail.* and standard implementations we should be aware. On Mon, Nov 16, 2009 at 10:30 PM, mably fm2...@mably.com wrote: In fact standards attachments works. But it's not what I'm trying do do. I'm need to relay HTML messages with inline images and this is still not working. Is it a kind of limitation of GAE or is it supposed to work ? Thanx for your help. François On 16 nov, 23:09, mably fm2...@mably.com wrote: Hi Ikai, thanx for you help. I've copy pasted your code on my webapp (webwinewatch), I've no error but the mail isn't correctly relayed, all attachements are removed. I've just modified the sender, from and recipient lines : message.setSender(new InternetAddress(myaddress@gmail.com, Relay account)); message.setFrom(message.getSender()); message.setRecipient(Message.RecipientType.TO, message.getSender()); Do you have any clue ? You can test it, sending an email to : contact- t...@webwinewatch.appspotmail.com Thanx again for your help. On 16 nov, 21:35, Ikai L (Google) ika...@google.com wrote: I couldn't reproduce your exact error, but I was able to put together a working example of an inbound email handler to relay messages. I'm going to expand the documentation about processing inbound emails. Here's
[appengine-java] Re: Can't send mail with attachment using JavaMail API
Of course, the code above doesn't need to be run in mail handler servlet :-) On Nov 19, 12:01 am, mably fm2...@mably.com wrote: I've written a simple class sending an HTML email with an embedded image (cf. below) via GMail SMTP. It works perfectly fine when run locally from Eclipse. The same code in a GAE mail servlet handler produce the infamous Converting attachment data failed error. So it really seems to be a problem in GAE javamail implementation. /* * Copyright (C) 2009 Francois Masurel * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. */ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.mail.Message; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; /** * @author Francois * */ public class GMailSMTP { private static final String SMTP_HOST_NAME = smtp.gmail.com; private static final int SMTP_HOST_PORT = 465; private static final String SMTP_AUTH_USER = x...@gmail.com; private static final String SMTP_AUTH_PWD = yyy; public static void main(String[] args) throws Exception{ new GMailSMTP().test(); } public void test() throws Exception{ Properties props = new Properties(); props.put(mail.transport.protocol, smtps); props.put(mail.smtps.host, SMTP_HOST_NAME); props.put(mail.smtps.auth, true); // props.put(mail.smtps.quitwait, false); String from = SMTP_AUTH_USER; String to = SMTP_AUTH_USER; String subject = Testing SMTP-SSL; String htmlText = h1Hello/h1img src=\cid:image\; byte[] imgData = this.obtainByteData(enveloppe.gif); Session mailSession = Session.getDefaultInstance(props); mailSession.setDebug(true); Message msg = new MimeMessage(mailSession); msg.setFrom(new InternetAddress(from)); msg.addRecipient(Message.RecipientType.TO, new InternetAddress (to)); msg.setSubject(subject); Multipart mp = new MimeMultipart(related); MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent(htmlText, text/html); mp.addBodyPart(htmlPart); MimeBodyPart attachment = new MimeBodyPart(); attachment.setFileName(test.gif); attachment.setContent(imgData, image/gif); attachment.setHeader(Content-ID,image); mp.addBodyPart(attachment); msg.setContent(mp); Transport transport = mailSession.getTransport(); transport.connect (SMTP_HOST_NAME, SMTP_HOST_PORT, SMTP_AUTH_USER, SMTP_AUTH_PWD); transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO)); transport.close(); } /** * Constructs a byte array and fills it with data that is read from the * specified resource. * @param filename the path to the resource * @return the specified resource as a byte array * @throws java.io.IOException if the resource cannot be read, or the * bytes cannot be written, or the streams cannot be closed */ private byte[] obtainByteData(String filename) throws IOException { InputStream inputStream = getClass().getResourceAsStream (filename); ByteArrayOutputStream outputStream = new ByteArrayOutputStream (1024); byte[] bytes = new byte[512]; // Read bytes from the input stream in bytes.length-sized chunks and write // them into the output stream int readBytes; while ((readBytes = inputStream.read(bytes)) 0) { outputStream.write(bytes, 0, readBytes); } // Convert the contents of the output stream into a byte array byte[] byteData = outputStream.toByteArray(); // Close the streams inputStream.close(); outputStream.close(); return byteData; } } On Nov 18, 11:11 pm, Ikai L (Google) ika...@google.com wrote: What I mean is, is this code working on a different mail server? On Wed, Nov 18, 2009 at 2:00 PM, mably fm2...@mably.com wrote: I'm just sending a simple
Re: [appengine-java] Re: Can't send mail with attachment using JavaMail API
That's good information to know. We are not using Sun's JavaMail implementation, so it's possible there are points of incompatibility. There's one last thing you may want to try: http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/mail/package-summary.html The above page documents the Low-Level API. Try creating an email object via that API, setting the Content-ID of the attachment and the HTML tag to point to the cid. You're already doing that in the example you sent using javax.mail, but I'm wondering if the low-level API is capable of doing this. If not, I'll open an issue. On Wed, Nov 18, 2009 at 3:06 PM, mably fm2...@mably.com wrote: Of course, the code above doesn't need to be run in mail handler servlet :-) On Nov 19, 12:01 am, mably fm2...@mably.com wrote: I've written a simple class sending an HTML email with an embedded image (cf. below) via GMail SMTP. It works perfectly fine when run locally from Eclipse. The same code in a GAE mail servlet handler produce the infamous Converting attachment data failed error. So it really seems to be a problem in GAE javamail implementation. /* * Copyright (C) 2009 Francois Masurel * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. */ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.mail.Message; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; /** * @author Francois * */ public class GMailSMTP { private static final String SMTP_HOST_NAME = smtp.gmail.com; private static final int SMTP_HOST_PORT = 465; private static final String SMTP_AUTH_USER = x...@gmail.com; private static final String SMTP_AUTH_PWD = yyy; public static void main(String[] args) throws Exception{ new GMailSMTP().test(); } public void test() throws Exception{ Properties props = new Properties(); props.put(mail.transport.protocol, smtps); props.put(mail.smtps.host, SMTP_HOST_NAME); props.put(mail.smtps.auth, true); // props.put(mail.smtps.quitwait, false); String from = SMTP_AUTH_USER; String to = SMTP_AUTH_USER; String subject = Testing SMTP-SSL; String htmlText = h1Hello/h1img src=\cid:image\; byte[] imgData = this.obtainByteData(enveloppe.gif); Session mailSession = Session.getDefaultInstance(props); mailSession.setDebug(true); Message msg = new MimeMessage(mailSession); msg.setFrom(new InternetAddress(from)); msg.addRecipient(Message.RecipientType.TO, new InternetAddress (to)); msg.setSubject(subject); Multipart mp = new MimeMultipart(related); MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent(htmlText, text/html); mp.addBodyPart(htmlPart); MimeBodyPart attachment = new MimeBodyPart(); attachment.setFileName(test.gif); attachment.setContent(imgData, image/gif); attachment.setHeader(Content-ID,image); mp.addBodyPart(attachment); msg.setContent(mp); Transport transport = mailSession.getTransport(); transport.connect (SMTP_HOST_NAME, SMTP_HOST_PORT, SMTP_AUTH_USER, SMTP_AUTH_PWD); transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO)); transport.close(); } /** * Constructs a byte array and fills it with data that is read from the * specified resource. * @param filename the path to the resource * @return the specified resource as a byte array * @throws java.io.IOException if the resource cannot be read, or the * bytes cannot be written, or the streams cannot be closed */ private byte[] obtainByteData(String filename) throws IOException { InputStream inputStream = getClass().getResourceAsStream (filename); ByteArrayOutputStream outputStream = new ByteArrayOutputStream (1024);
[appengine-java] Re: Can't send mail with attachment using JavaMail API
I haven't found a way to set a Content-ID header on a mimebodypart/ attachment using the low-level API. The MailService.Attachment class is quite rudimentary (only filename and data). May be some part of the low level API are still undocumented ? Thanx for all. On Nov 19, 12:25 am, Ikai L (Google) ika...@google.com wrote: That's good information to know. We are not using Sun's JavaMail implementation, so it's possible there are points of incompatibility. There's one last thing you may want to try: http://code.google.com/appengine/docs/java/javadoc/com/google/appengi... The above page documents the Low-Level API. Try creating an email object via that API, setting the Content-ID of the attachment and the HTML tag to point to the cid. You're already doing that in the example you sent using javax.mail, but I'm wondering if the low-level API is capable of doing this. If not, I'll open an issue. On Wed, Nov 18, 2009 at 3:06 PM, mably fm2...@mably.com wrote: Of course, the code above doesn't need to be run in mail handler servlet :-) On Nov 19, 12:01 am, mably fm2...@mably.com wrote: I've written a simple class sending an HTML email with an embedded image (cf. below) via GMail SMTP. It works perfectly fine when run locally from Eclipse. The same code in a GAE mail servlet handler produce the infamous Converting attachment data failed error. So it really seems to be a problem in GAE javamail implementation. /* * Copyright (C) 2009 Francois Masurel * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. */ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.mail.Message; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; /** * @author Francois * */ public class GMailSMTP { private static final String SMTP_HOST_NAME = smtp.gmail.com; private static final int SMTP_HOST_PORT = 465; private static final String SMTP_AUTH_USER = x...@gmail.com; private static final String SMTP_AUTH_PWD = yyy; public static void main(String[] args) throws Exception{ new GMailSMTP().test(); } public void test() throws Exception{ Properties props = new Properties(); props.put(mail.transport.protocol, smtps); props.put(mail.smtps.host, SMTP_HOST_NAME); props.put(mail.smtps.auth, true); // props.put(mail.smtps.quitwait, false); String from = SMTP_AUTH_USER; String to = SMTP_AUTH_USER; String subject = Testing SMTP-SSL; String htmlText = h1Hello/h1img src=\cid:image\; byte[] imgData = this.obtainByteData(enveloppe.gif); Session mailSession = Session.getDefaultInstance(props); mailSession.setDebug(true); Message msg = new MimeMessage(mailSession); msg.setFrom(new InternetAddress(from)); msg.addRecipient(Message.RecipientType.TO, new InternetAddress (to)); msg.setSubject(subject); Multipart mp = new MimeMultipart(related); MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent(htmlText, text/html); mp.addBodyPart(htmlPart); MimeBodyPart attachment = new MimeBodyPart(); attachment.setFileName(test.gif); attachment.setContent(imgData, image/gif); attachment.setHeader(Content-ID,image); mp.addBodyPart(attachment); msg.setContent(mp); Transport transport = mailSession.getTransport(); transport.connect (SMTP_HOST_NAME, SMTP_HOST_PORT, SMTP_AUTH_USER, SMTP_AUTH_PWD); transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO)); transport.close(); } /** * Constructs a byte array and fills it with data that is read from the * specified resource. * @param filename the path to the resource * @return the specified resource as a byte array * @throws
[appengine-java] Re: Can't send mail with attachment using JavaMail API
Hi Ikai, thanx for you help. I've copy pasted your code on my webapp (webwinewatch), I've no error but the mail isn't correctly relayed, all attachements are removed. I've just modified the sender, from and recipient lines : message.setSender(new InternetAddress(myaddress@gmail.com, Relay account)); message.setFrom(message.getSender()); message.setRecipient(Message.RecipientType.TO, message.getSender()); Do you have any clue ? You can test it, sending an email to : contact- t...@webwinewatch.appspotmail.com Thanx again for your help. On 16 nov, 21:35, Ikai L (Google) ika...@google.com wrote: I couldn't reproduce your exact error, but I was able to put together a working example of an inbound email handler to relay messages. I'm going to expand the documentation about processing inbound emails. Here's some working code:http://pastie.org/701517 Does this example help any? Code is also pasted below, but it'll be easier for you to look at the Pastie. import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import javax.mail.*; import javax.mail.util.ByteArrayDataSource; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.InternetAddress; import javax.activation.DataHandler; import java.io.IOException; import java.io.InputStream; import java.util.logging.Logger; import java.util.Properties; public class MailHandlerServlet extends HttpServlet { private static final Logger log = Logger.getLogger(MailHandlerServlet.class.getName()); private static final String RECIPIENT = recipi...@gmail.com; private static final String SENDER = sen...@google.com; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); try { MimeMessage message = new MimeMessage(session, request.getInputStream()); Object content = message.getContent(); // You could also probably just use message.getInputStream() here // and avoid the conditional type check if (content instanceof String) { log.info(Received a string); } else if (content instanceof InputStream) { // My somewhat limited testing indicates that this is always getting returned as an // InputStream InputStream inputStream = (InputStream) content; ByteArrayDataSource inboundDataSource = new ByteArrayDataSource(inputStream, message.getContentType()); Multipart inboundMultipart = new MimeMultipart(inboundDataSource); // Set the body with whatever text you want Multipart outboundMultipart = new MimeMultipart(); MimeBodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText(Set your body here); outboundMultipart.addBodyPart(messageBodyPart); // Loop over the multipart message coming in and // append them to the outbound Multipart object for (int i = 0; i inboundMultipart.getCount(); i++) { BodyPart part = inboundMultipart.getBodyPart(i); /* The content-disposition header is optional: http://www.ietf.org/rfc/rfc1806.txt This header specifies the filename and type of a MIME part. */ if(part.getDisposition() == null) { // This is just a plain text email } else { // We have something interesting. Let's parse it. // Create a new ByteArrayDataSource with this part MimeBodyPart inboundMimeBodyPart = (MimeBodyPart) part; InputStream is = part.getInputStream(); ByteArrayDataSource mimePartDataSource = new ByteArrayDataSource(is, inboundMimeBodyPart.getContentType()); // Create a new outbound MimeBodyPart and set this as the handler MimeBodyPart outboundMimeBodyPart = new MimeBodyPart(); outboundMimeBodyPart.setDataHandler(new DataHandler(mimePartDataSource)); outboundMimeBodyPart.setFileName(inboundMimeBodyPart.getFileName()); outboundMultipart.addBodyPart(outboundMimeBodyPart); } } message.setContent(outboundMultipart); } message.setFrom(new
[appengine-java] Re: Can't send mail with attachment using JavaMail API
Hi Ikai, have you been able to reproduce my Converting attachment data failed exception ? I'm still stuck on this strange bug. Thanx for your help. On 11 nov, 00:00, mably fm2...@mably.com wrote: Of course, here is below my email relay servlet class. What I'm willing to do is to hide my customers email addresses by relaying email to them via my google app email adress. I would like to be able to relay html emails with images which is quite common nowadays. I am sending my test emails from a gmail account. Thanx for your help. /* * Copyright (C) 2009 Francois Masurel * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. */ package com.mably.cms.web; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeMessage.RecipientType; import javax.mail.util.ByteArrayDataSource; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.inject.Inject; import com.google.inject.Singleton; import com.mably.cms.model.ContentManager; import com.mably.cms.utils.TraitementStream; /** * @author f.masurel * */ @Singleton public class ContactMailServlet extends HttpServlet { /** serialVersionUID. */ private static final long serialVersionUID = 7131942698661805870L; /** Logger. */ private static final Logger LOG = LoggerFactory.getLogger(ContactMailServlet.class); @Inject private ContentManager contentManager; /** * {...@inheritdoc} */ public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); try { MimeMessage msg = new MimeMessage(session, req.getInputStream ()); String contentType = msg.getContentType(); LOG.info(Mail content type : + contentType); LOG.info(Mail sent to + Arrays.toString( msg.getRecipients(RecipientType.TO))); LOG.info(Mail received from + msg.getSender()); MimeMessage resmsg = new MimeMessage(session); resmsg.setSubject(msg.getSubject()); resmsg.setRecipient(Message.RecipientType.TO, msg.getSender()); Multipart rescontent = new MimeMultipart(); Object content = msg.getContent(); if (content instanceof String) { LOG.info(Content : string); } else if (content instanceof Multipart) { LOG.info(Content : multipart); Multipart mpcontent = (Multipart) msg.getContent(); for (int i = 0; i mpcontent.getCount(); i++) { BodyPart part = mpcontent.getBodyPart(i); MimeBodyPart respart = new MimeBodyPart(); respart.setContent( part.getContent(), part.getContentType()); rescontent.addBodyPart(respart); } } else if (content instanceof InputStream) { LOG.info(Content : inputstream); InputStream inputStream = (InputStream) content; ByteArrayDataSource ds = new
[appengine-java] Re: Can't send mail with attachment using JavaMail API
François, Do you have a code snippet, log entries or a stack trace? -- Ikai Lan Developer Programs Engineer, Google App Engine --~--~-~--~~~---~--~~ 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 google-appengine-java@googlegroups.com To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~--~~~~--~~--~--~---