changeset 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 8848edb0e6bf
children 0581238084ad
files core/src/luan/modules/Binary.luan core/src/luan/modules/BinaryLuan.java core/src/luan/modules/String.luan core/src/luan/modules/StringLuan.java mail/src/luan/modules/mail/SmtpCon.java
diffstat 5 files changed, 66 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/core/src/luan/modules/Binary.luan	Wed Apr 15 08:58:54 2015 -0600
+++ b/core/src/luan/modules/Binary.luan	Wed Apr 15 11:32:30 2015 -0600
@@ -3,3 +3,4 @@
 
 byte = BinaryLuan.byte_
 binary = BinaryLuan.binary
+to_string = BinaryLuan.to_string
--- a/core/src/luan/modules/BinaryLuan.java	Wed Apr 15 08:58:54 2015 -0600
+++ b/core/src/luan/modules/BinaryLuan.java	Wed Apr 15 11:32:30 2015 -0600
@@ -62,4 +62,8 @@
 		return bytes;
 	}
 
+	public static String to_string(byte[] binary) {
+		return new String(binary);
+	}
+
 }
--- a/core/src/luan/modules/String.luan	Wed Apr 15 08:58:54 2015 -0600
+++ b/core/src/luan/modules/String.luan	Wed Apr 15 11:32:30 2015 -0600
@@ -14,5 +14,6 @@
 rep = StringLuan.rep
 reverse = StringLuan.reverse
 sub = StringLuan.sub
+to_binary = StringLuan.to_binary
 trim = StringLuan.trim
 upper = StringLuan.upper
--- a/core/src/luan/modules/StringLuan.java	Wed Apr 15 08:58:54 2015 -0600
+++ b/core/src/luan/modules/StringLuan.java	Wed Apr 15 11:32:30 2015 -0600
@@ -70,6 +70,10 @@
 		return new String(a);
 	}
 
+	@LuanMethod public static byte[] to_binary(String s) {
+		return s.getBytes();
+	}
+
 	public static int len(LuanState luan,String s) throws LuanException {
 		Utils.checkNotNull(luan,s);
 		return s.length();
--- 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() )