Mercurial Hosting > luan
diff mail/src/luan/modules/mail/SmtpCon.java @ 360:cbb94a7c7a9e
allow mail attachments;
add String.to_binary and Binary.to_string;
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 15 Apr 2015 11:32:30 -0600 |
parents | ae7ae2755b48 |
children | e2e70d27c258 |
line wrap: on
line diff
--- a/mail/src/luan/modules/mail/SmtpCon.java Wed Apr 15 08:58:54 2015 -0600 +++ b/mail/src/luan/modules/mail/SmtpCon.java Wed Apr 15 11:32:30 2015 -0600 @@ -1,5 +1,6 @@ package luan.modules.mail; +import java.io.IOException; import java.util.Map; import java.util.HashMap; import java.util.Properties; @@ -9,6 +10,7 @@ import javax.mail.Transport; import javax.mail.Message; import javax.mail.MessagingException; +import javax.mail.Part; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeBodyPart; @@ -39,10 +41,10 @@ } else if( port instanceof Number ) { Integer i = Luan.asInteger(port); if( i == null ) - throw luan.exception( "parameter 'port' is must be an integer" ); + throw luan.exception( "parameter 'port' must be an integer" ); s = i.toString(); } else { - throw luan.exception( "parameter 'port' is must be an integer" ); + throw luan.exception( "parameter 'port' must be an integer" ); } props.setProperty("mail.smtp.socketFactory.port", s); props.setProperty("mail.smtp.port", s); @@ -111,9 +113,12 @@ msg.setSubject(subject); Object body = mailParams.remove("body"); + Object attachments = mailParams.remove("attachments"); + Part bodyPart = attachments==null ? msg : new MimeBodyPart(); + if( body != null ) { if( body instanceof String ) { - msg.setText((String)body); + bodyPart.setText((String)body); } else if( body instanceof LuanTable ) { LuanTable bodyTbl = (LuanTable)body; Map<Object,Object> map = new HashMap<Object,Object>(bodyTbl.asMap()); @@ -132,9 +137,55 @@ } if( !map.isEmpty() ) throw luan.exception( "invalid body types: " + map ); - msg.setContent(mp); + bodyPart.setContent(mp); } else - throw luan.exception( "parameter 'body' is must be a string or table" ); + throw luan.exception( "parameter 'body' must be a string or table" ); + } + + if( attachments != null ) { + if( !(attachments instanceof LuanTable) ) + throw luan.exception( "parameter 'attachments' must be a table" ); + LuanTable attachmentsTbl = (LuanTable)attachments; + if( !attachmentsTbl.isList() ) + throw luan.exception( "parameter 'attachments' must be a list" ); + MimeMultipart mp = new MimeMultipart("mixed"); + if( body != null ) + mp.addBodyPart((MimeBodyPart)bodyPart); + for( Object attachment : attachmentsTbl.asList() ) { + if( !(attachment instanceof LuanTable) ) + throw luan.exception( "each attachment must be a table" ); + Map<Object,Object> attachmentMap = new HashMap<Object,Object>(((LuanTable)attachment).asMap()); + Object obj; + + obj = attachmentMap.remove("filename"); + if( obj==null ) + throw luan.exception( "an attachment is missing 'filename'" ); + if( !(obj instanceof String) ) + throw luan.exception( "an attachment filename must be a string" ); + String filename = (String)obj; + + obj = attachmentMap.remove("content_type"); + if( obj==null ) + throw luan.exception( "an attachment is missing 'content_type'" ); + if( !(obj instanceof String) ) + throw luan.exception( "an attachment content_type must be a string" ); + String content_type = (String)obj; + + Object content = attachmentMap.remove("content"); + if( content==null ) + throw luan.exception( "an attachment is missing 'content'" ); + if( content_type.startsWith("text/") && content instanceof byte[] ) + content = new String((byte[])content); + + if( !attachmentMap.isEmpty() ) + throw luan.exception( "unrecognized attachment parameters: "+attachmentMap ); + + MimeBodyPart part = new MimeBodyPart(); + part.setContent(content,content_type); + part.setFileName(filename); + mp.addBodyPart(part); + } + msg.setContent(mp); } if( !mailParams.isEmpty() )