*** empty log message ***
This commit is contained in:
commit
d80b3252a3
28
.cvsignore
Normal file
28
.cvsignore
Normal file
|
@ -0,0 +1,28 @@
|
|||
# CVS default ignores begin
|
||||
tags
|
||||
TAGS
|
||||
.make.state
|
||||
.nse_depinfo
|
||||
*~
|
||||
#*
|
||||
.#*
|
||||
,*
|
||||
_$*
|
||||
*$
|
||||
*.old
|
||||
*.bak
|
||||
*.BAK
|
||||
*.orig
|
||||
*.rej
|
||||
.del-*
|
||||
*.a
|
||||
*.olb
|
||||
*.o
|
||||
*.obj
|
||||
*.so
|
||||
*.exe
|
||||
*.Z
|
||||
*.elc
|
||||
*.ln
|
||||
core
|
||||
# CVS default ignores end
|
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
build
|
||||
dist
|
30
build.bat
Normal file
30
build.bat
Normal file
|
@ -0,0 +1,30 @@
|
|||
@echo off
|
||||
: The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
: (the "License"); you may not use this file except in compliance with the License.
|
||||
; You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
:
|
||||
: Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
: WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
: language governing rights and limitations under the License.
|
||||
:
|
||||
: The Original Code is the Venice Web Community System.
|
||||
;
|
||||
: The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
: for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
: Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
:
|
||||
; Contributor(s):
|
||||
:
|
||||
|
||||
set _CP=%CP%
|
||||
|
||||
rem Identify the custom class path components we need
|
||||
set CP=%TOMCAT_HOME%\lib\ant.jar;%TOMCAT_HOME%\lib\servlet.jar
|
||||
set CP=%TOMCAT_HOME%\lib\jaxp.jar;%TOMCAT_HOME%\lib\parser.jar
|
||||
set CP=%CP%;%JAVA_HOME%\lib\tools.jar
|
||||
|
||||
rem Execute ANT to perform the requird build target
|
||||
java -classpath %CP%;%CLASSPATH% org.apache.tools.ant.Main -Dtomcat.home=%TOMCAT_HOME% %1 %2 %3 %4 %5 %6 %7 %8 %9
|
||||
|
||||
set CP=%_CP%
|
||||
set _CP=
|
26
build.sh
Executable file
26
build.sh
Executable file
|
@ -0,0 +1,26 @@
|
|||
#!/bin/sh
|
||||
# The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
# (the "License"); you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
# WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
# language governing rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Venice Web Community System.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
# for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
# Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
|
||||
# Identify the custom class path components we need
|
||||
CP=$TOMCAT_HOME/lib/ant.jar:$TOMCAT_HOME/lib/servlet.jar
|
||||
CP=$CP:$TOMCAT_HOME/lib/jaxp.jar:$TOMCAT_HOME/lib/parser.jar
|
||||
CP=$CP:$JAVA_HOME/lib/tools.jar
|
||||
|
||||
# Execute ANT to perform the requested build target
|
||||
java -classpath $CP:$CLASSPATH org.apache.tools.ant.Main \
|
||||
-Dtomcat.home=$TOMCAT_HOME "$@"
|
46
build.xml
Normal file
46
build.xml
Normal file
|
@ -0,0 +1,46 @@
|
|||
<?xml version="1.0"?>
|
||||
<!--
|
||||
The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
(the "License"); you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
language governing rights and limitations under the License.
|
||||
|
||||
The Original Code is the Venice Web Communities System - Generic Mail Gateway.
|
||||
|
||||
The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
Copyright (C) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
-->
|
||||
<project name="MailGate" default="jar" basedir=".">
|
||||
|
||||
<!-- Prepare to build the application -->
|
||||
<target name="prep">
|
||||
<mkdir dir="build"/>
|
||||
<mkdir dir="dist"/>
|
||||
</target>
|
||||
|
||||
<!-- Compile all the Java source -->
|
||||
<target name="compile" depends="prep">
|
||||
<javac srcdir="src" destdir="build" debug="on" optimize="off" deprecation="on">
|
||||
<classpath>
|
||||
<fileset dir="lib" includes="**/*.jar"/>
|
||||
</classpath>
|
||||
</javac>
|
||||
<copy todir="build">
|
||||
<fileset dir="src" includes="**/*.properties"/>
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<target name="jar" depends="compile">
|
||||
<jar jarfile="dist/mailgate.jar" basedir="build"/>
|
||||
<copy todir="dist">
|
||||
<fileset dir="lib" includes="**/*.jar"/>
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
</project>
|
5
lib/.gitignore
vendored
Normal file
5
lib/.gitignore
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
bsf.jar
|
||||
jacl.jar
|
||||
js.jar
|
||||
tcljava.jar
|
||||
xmlrpc.jar
|
88
samples/mailgate.js
Normal file
88
samples/mailgate.js
Normal file
|
@ -0,0 +1,88 @@
|
|||
// The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
// (the "License"); you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
//
|
||||
// Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
// WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
// language governing rights and limitations under the License.
|
||||
//
|
||||
// The Original Code is the Venice Web Communities System - Generic Mail Gateway.
|
||||
//
|
||||
// The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
// for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
// Copyright (C) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
//
|
||||
// Contributor(s):
|
||||
|
||||
importPackage(Packages.org.apache.xmlrpc);
|
||||
importPackage(Packages.com.silverwrist.mailgate);
|
||||
|
||||
// get the message to be posted
|
||||
message = bsf.lookupBean("message");
|
||||
|
||||
// create an XML-RPC connection to a Venice server
|
||||
rpc = lib.connectXMLRPC(lib.getConfigParam("url"),false);
|
||||
|
||||
// create a session
|
||||
parms = lib.createVector();
|
||||
sessionid = lib.castString(rpc.execute("venice:session.create",parms));
|
||||
|
||||
// log into the session
|
||||
parms.add(sessionid);
|
||||
parms.add(lib.getConfigParam("username"));
|
||||
parms.add(lib.getConfigParam("password"));
|
||||
rpc.execute("venice:session.login",parms);
|
||||
|
||||
// create the message text
|
||||
text = "[From: " + message.sender + "]\r\n\r\n" + message.text;
|
||||
|
||||
// post the initial message!
|
||||
parms.clear();
|
||||
parms.add(sessionid);
|
||||
parms.add(lib.getConfigParam("community"));
|
||||
parms.add(lib.getConfigParam("conference"));
|
||||
my_topic = lib.castInteger(lib.getConfigParam("topic"));
|
||||
parms.add(my_topic);
|
||||
parms.add(message.subject);
|
||||
parms.add(lib.castString(text));
|
||||
ndx = lib.castInteger(rpc.execute("venice:conferencing.topic.postMessage",parms));
|
||||
|
||||
if (message.hasAttachments())
|
||||
{ // there are attachments - attach them to this message, and to other messages if necessary
|
||||
for (i=0; i<message.attachmentCount; i++)
|
||||
{ // post each attachment in turn
|
||||
if (i>0)
|
||||
{ // post a new message to attach the next attachment to
|
||||
new_text = "[From: " + message.sender + "]\r\n\r\n[Attachments continued]";
|
||||
parms.clear();
|
||||
parms.add(sessionid);
|
||||
parms.add(lib.getConfigParam("community"));
|
||||
parms.add(lib.getConfigParam("conference"));
|
||||
parms.add(my_topic);
|
||||
parms.add(message.subject);
|
||||
parms.add(lib.castString(new_text));
|
||||
ndx = lib.castInteger(rpc.execute("venice:conferencing.topic.postMessage",parms));
|
||||
|
||||
} // end if
|
||||
|
||||
// get the attachment and add it
|
||||
att = message.getAttachment(i);
|
||||
parms.clear();
|
||||
parms.add(sessionid);
|
||||
parms.add(lib.getConfigParam("community"));
|
||||
parms.add(lib.getConfigParam("conference"));
|
||||
parms.add(my_topic);
|
||||
parms.add(ndx);
|
||||
parms.add(att.type);
|
||||
parms.add(att.fileName);
|
||||
parms.add(att.data);
|
||||
rpc.execute("venice:conferencing.message.attach",parms);
|
||||
|
||||
} // end for
|
||||
|
||||
} // end if
|
||||
|
||||
// destroy the session to finish the operation
|
||||
parms.clear();
|
||||
parms.add(sessionid);
|
||||
rpc.execute("venice:session.destroy",parms);
|
34
samples/mailgate.properties
Normal file
34
samples/mailgate.properties
Normal file
|
@ -0,0 +1,34 @@
|
|||
# The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
# (the "License"); you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
# WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
# language governing rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Venice Web Communities System - Generic Mail Gateway.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
# for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
# Copyright (C) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
|
||||
# The script to be run by the gateway for each received message.
|
||||
mailgate.script=mailgate.js
|
||||
|
||||
# Temporary directory for script engines.
|
||||
mailgate.script.tmpdir=/tmp
|
||||
|
||||
# Configuration parameters
|
||||
mailgate.script.config.url=http://delenn/venice/RPC2
|
||||
mailgate.script.config.username=TestUser
|
||||
mailgate.script.config.password=Fishmasters
|
||||
mailgate.script.config.community=Piazza
|
||||
mailgate.script.config.conference=General
|
||||
mailgate.script.config.topic=1
|
||||
|
||||
# Properties used by the mail session object.
|
||||
mail.transport.protocol=smtp
|
||||
mail.smtp.host=localhost
|
||||
|
3
samples/mailgate.sh
Executable file
3
samples/mailgate.sh
Executable file
|
@ -0,0 +1,3 @@
|
|||
#!/bin/sh
|
||||
exec java -cp "mailgate.jar:bsf.jar:js.jar:jacl.jar:tcljava.jar:xmlrpc.jar" \
|
||||
com.silverwrist.mailgate.Main mailgate.properties
|
87
src/com/silverwrist/mailgate/AttachmentData.java
Normal file
87
src/com/silverwrist/mailgate/AttachmentData.java
Normal file
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (the "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System - Generic Mail Gateway.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.mailgate;
|
||||
|
||||
import java.io.*;
|
||||
|
||||
public class AttachmentData
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private String type; // data type
|
||||
private String name; // filename of attachment
|
||||
private byte[] data; // the actual data
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
AttachmentData(String type, String name, InputStream stm) throws IOException
|
||||
{
|
||||
this.type = type;
|
||||
this.name = name;
|
||||
|
||||
ByteArrayOutputStream tmp = new ByteArrayOutputStream();
|
||||
byte[] buf = new byte[4096];
|
||||
int rd = stm.read(buf);
|
||||
while (rd>=0)
|
||||
{ // simple copy loop
|
||||
if (rd>0)
|
||||
tmp.write(buf,0,rd);
|
||||
rd = stm.read(buf);
|
||||
|
||||
} // end while
|
||||
|
||||
data = tmp.toByteArray();
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public final String getType()
|
||||
{
|
||||
return type;
|
||||
|
||||
} // end getType
|
||||
|
||||
public final String getFileName()
|
||||
{
|
||||
return name;
|
||||
|
||||
} // end getFileName
|
||||
|
||||
public final int getLength()
|
||||
{
|
||||
return data.length;
|
||||
|
||||
} // end getLength
|
||||
|
||||
public final byte[] getData()
|
||||
{
|
||||
return data;
|
||||
|
||||
} // end getData
|
||||
|
||||
} // end class AttachmentData
|
109
src/com/silverwrist/mailgate/BaseException.java
Normal file
109
src/com/silverwrist/mailgate/BaseException.java
Normal file
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (the "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System - Generic Mail Gateway.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.mailgate;
|
||||
|
||||
import java.io.PrintStream;
|
||||
import java.io.PrintWriter;
|
||||
|
||||
public class BaseException extends Exception
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private Throwable inner = null; // internal "root cause" exception
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructors
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public BaseException()
|
||||
{
|
||||
super();
|
||||
|
||||
} // end constructor
|
||||
|
||||
public BaseException(String msg)
|
||||
{
|
||||
super(msg);
|
||||
|
||||
} // end constructor
|
||||
|
||||
public BaseException(Throwable inner)
|
||||
{
|
||||
super(inner.getMessage());
|
||||
this.inner = inner;
|
||||
|
||||
} // end constructor
|
||||
|
||||
public BaseException(String msg, Throwable inner)
|
||||
{
|
||||
super(msg);
|
||||
this.inner = inner;
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Overrides from class Throwable
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public void printStackTrace()
|
||||
{
|
||||
this.printStackTrace(System.err);
|
||||
|
||||
} // end printStackTrace
|
||||
|
||||
public void printStackTrace(PrintStream s)
|
||||
{
|
||||
super.printStackTrace(s);
|
||||
if (inner!=null)
|
||||
{ // print the inner stack trace
|
||||
s.print("Root cause: ");
|
||||
inner.printStackTrace(s);
|
||||
|
||||
} // end if
|
||||
|
||||
} // end printStackTrace
|
||||
|
||||
public void printStackTrace(PrintWriter s)
|
||||
{
|
||||
super.printStackTrace(s);
|
||||
if (inner!=null)
|
||||
{ // print the inner stack trace
|
||||
s.print("Root cause: ");
|
||||
inner.printStackTrace(s);
|
||||
|
||||
} // end if
|
||||
|
||||
} // end printStackTrace
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public Throwable getException()
|
||||
{
|
||||
return inner;
|
||||
|
||||
} // end getException
|
||||
|
||||
} // end class BaseException
|
88
src/com/silverwrist/mailgate/Library.java
Normal file
88
src/com/silverwrist/mailgate/Library.java
Normal file
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (the "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System - Generic Mail Gateway.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.mailgate;
|
||||
|
||||
import java.util.*;
|
||||
import org.apache.xmlrpc.*;
|
||||
|
||||
public class Library
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public Library()
|
||||
{ // do nothing
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public final Integer castInteger(Object obj)
|
||||
{
|
||||
if (obj instanceof Integer)
|
||||
return (Integer)obj;
|
||||
if (obj instanceof Number)
|
||||
return new Integer(((Number)obj).intValue());
|
||||
try
|
||||
{ // convert to string and parse into an integer
|
||||
return new Integer(obj.toString());
|
||||
|
||||
} // end try
|
||||
catch (NumberFormatException nfe)
|
||||
{ // class cast failed
|
||||
throw new ClassCastException("castInteger: invalid cast");
|
||||
|
||||
} // end catch
|
||||
|
||||
} // end castInteger
|
||||
|
||||
public final String castString(Object obj)
|
||||
{
|
||||
return obj.toString();
|
||||
|
||||
} // end castString
|
||||
|
||||
public final XmlRpcClient connectXMLRPC(String url, boolean lite) throws PermanentExit
|
||||
{
|
||||
try
|
||||
{ // create the client object
|
||||
if (lite)
|
||||
return new XmlRpcClientLite(url);
|
||||
else
|
||||
return new XmlRpcClient(url);
|
||||
|
||||
} // end try
|
||||
catch (java.net.MalformedURLException e)
|
||||
{ // translate the exception
|
||||
throw new PermanentExit("XML-RPC URL malformed: " + url,e);
|
||||
|
||||
} // end catch
|
||||
|
||||
} // end connectXMLRPC
|
||||
|
||||
public final Vector createVector()
|
||||
{
|
||||
return new Vector();
|
||||
|
||||
} // end createVector
|
||||
|
||||
} // end class Library
|
312
src/com/silverwrist/mailgate/Main.java
Normal file
312
src/com/silverwrist/mailgate/Main.java
Normal file
|
@ -0,0 +1,312 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (the "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System - Generic Mail Gateway.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.mailgate;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.reflect.*;
|
||||
import java.util.*;
|
||||
import javax.mail.*;
|
||||
import javax.mail.internet.*;
|
||||
import com.ibm.bsf.*;
|
||||
|
||||
public class Main
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal library class
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public class MyLibrary extends Library
|
||||
{
|
||||
MyLibrary()
|
||||
{
|
||||
super();
|
||||
|
||||
} // end constructor
|
||||
|
||||
public final String getConfigParam(String name)
|
||||
{
|
||||
return props.getProperty("mailgate.script.config." + name);
|
||||
|
||||
} // end getConfigParam
|
||||
|
||||
} // end class MyLibrary
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static data members
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
// Exit codes interpreted by qmail-local delivery agent - see qmail-command(8) man page
|
||||
public static final int EXIT_SUCCESS = 0;
|
||||
public static final int EXIT_SUCCESS_FINAL = 99;
|
||||
public static final int EXIT_FAIL_PERMANENT = 100;
|
||||
public static final int EXIT_FAIL_TEMPORARY = 111;
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private Properties props; // properties loaded from the command line
|
||||
private File script_file; // script file to be run
|
||||
private StringBuffer script_code; // script code from above
|
||||
private Session session; // mail session object
|
||||
private BSFManager script_mgr; // script manager
|
||||
private String script_lang; // language the script is written in
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private Main(String propfile) throws PermanentExit, TemporaryExit
|
||||
{
|
||||
File f = new File(propfile);
|
||||
if (f.canRead())
|
||||
{ // load up the file
|
||||
try
|
||||
{ // load the properties from the file
|
||||
FileInputStream stm = new FileInputStream(f);
|
||||
props = new Properties();
|
||||
props.load(stm);
|
||||
|
||||
} // end try
|
||||
catch (IOException e)
|
||||
{ // unable to load the system properties!
|
||||
throw new TemporaryExit("error loading properties from \"" + f.getAbsolutePath() + "\"",e);
|
||||
|
||||
} // end catch
|
||||
|
||||
} // end if
|
||||
else // the file name is bogus
|
||||
throw new PermanentExit("properties file \"" + f.getAbsolutePath() + "\" cannot be read");
|
||||
|
||||
// Check the script file name.
|
||||
String tmp = props.getProperty("mailgate.script");
|
||||
if (tmp!=null)
|
||||
{ // see if the script file can be read
|
||||
script_file = new File(tmp);
|
||||
if (!(script_file.canRead()))
|
||||
throw new PermanentExit("script file \"" + script_file.getAbsolutePath() + "\" cannot be read");
|
||||
|
||||
} // end if
|
||||
else // script file not found
|
||||
throw new PermanentExit("no script file specified in properties");
|
||||
|
||||
// Preload the script code.
|
||||
try
|
||||
{ // copy the script code to a string buffer
|
||||
FileReader rdr = new FileReader(script_file);
|
||||
StringWriter wr = new StringWriter();
|
||||
char[] buf = new char[4096];
|
||||
int rd = rdr.read(buf);
|
||||
while (rd>=0)
|
||||
{ // simple read-write loop
|
||||
if (rd>0)
|
||||
wr.write(buf,0,rd);
|
||||
rd = rdr.read(buf);
|
||||
|
||||
} // end while
|
||||
|
||||
script_code = wr.getBuffer(); // load the script code
|
||||
|
||||
} // end try
|
||||
catch (IOException e)
|
||||
{ // unable to load the buffer
|
||||
throw new PermanentExit("unable to load script file \"" + script_file.getAbsolutePath() + "\"");
|
||||
|
||||
} // end catch
|
||||
|
||||
// Load the temporary script directory.
|
||||
tmp = props.getProperty("mailgate.script.tmpdir");
|
||||
if (tmp!=null)
|
||||
{ // Temporary directory specified...
|
||||
File tmpf = new File(tmp);
|
||||
if (!(tmpf.isDirectory()))
|
||||
throw new PermanentExit("temporary dir \"" + tmpf.getAbsolutePath() + "\" does not exist");
|
||||
tmp = tmpf.getAbsolutePath();
|
||||
|
||||
} // end if
|
||||
else // directory name not found
|
||||
throw new PermanentExit("no temporary directory specified in properties");
|
||||
|
||||
// Create the BSF manager.
|
||||
script_mgr = new BSFManager();
|
||||
script_mgr.setTempDir(tmp);
|
||||
|
||||
try
|
||||
{ // declare beans used by the scripting engines
|
||||
script_mgr.declareBean("lib",new MyLibrary(),MyLibrary.class);
|
||||
|
||||
} // end try
|
||||
catch (BSFException e)
|
||||
{ // translate the exception
|
||||
throw new PermanentExit("declaration error in BSF",e);
|
||||
|
||||
} // end catch
|
||||
|
||||
if (BSFManager.isLanguageRegistered("javascript"))
|
||||
{ // we need to so some fixing up to make Rhino work
|
||||
try
|
||||
{ // ensure the engine is loaded, and do our fixup routine
|
||||
script_mgr.loadScriptingEngine("javascript");
|
||||
fixupRhino();
|
||||
|
||||
} // end if
|
||||
catch (BSFException e)
|
||||
{ // do nothing - we don't have JavaScript loaded
|
||||
} // end catch
|
||||
|
||||
} // end if
|
||||
|
||||
try
|
||||
{ // look up the scripting language for this file
|
||||
script_lang = script_mgr.getLangFromFilename(script_file.getAbsolutePath());
|
||||
|
||||
} // end try
|
||||
catch (BSFException e)
|
||||
{ // this may be thrown by getLangFromFilename
|
||||
throw new PermanentExit("unknown scripting language: file " + script_file.getAbsolutePath());
|
||||
|
||||
} // end catch
|
||||
|
||||
// Get the E-mail session object.
|
||||
session = Session.getDefaultInstance(props);
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private static void fixupRhino()
|
||||
{
|
||||
// What fixupRhino does is to turn off the fancy caching in the JavaScript engine. This is because
|
||||
// caching involves dynamic creation of classes on the fly, and, for some reason (probably because
|
||||
// of differing ClassLoader implementations), that doesn't work, whether Rhino is loaded in the
|
||||
// Web application or in the JRE extensions. When caching is turned off, Rhino can be loaded as
|
||||
// part of the web application, and it can see all the standard classes and all the Web application
|
||||
// classes. But we have to turn it off by manipulating it via the Reflection API, as, for all we know,
|
||||
// Rhino isn't even being loaded right now. (Though we have BSF load Rhino right away if it can,
|
||||
// to try and get this straightened out.)
|
||||
try
|
||||
{ // get a pointer to the Context class
|
||||
Class klass = Class.forName("org.mozilla.javascript.Context");
|
||||
|
||||
// get a pointer to its setCachingEnabled method
|
||||
final Class[] parmtypes = { Boolean.TYPE };
|
||||
Method m = klass.getMethod("setCachingEnabled",parmtypes);
|
||||
|
||||
// invoke it to turn caching off!
|
||||
final Object[] parms = { Boolean.FALSE };
|
||||
m.invoke(null,parms);
|
||||
|
||||
} // end try
|
||||
catch (Exception e)
|
||||
{ // just ignore me
|
||||
} // end catch
|
||||
|
||||
} // end fixupRhino
|
||||
|
||||
private void runMe() throws PermanentExit, TemporaryExit
|
||||
{
|
||||
MessageData msg;
|
||||
try
|
||||
{ // pull the E-mail message from the input and parse it
|
||||
MimeMessage in_msg = new MimeMessage(session,System.in);
|
||||
msg = new MessageData(in_msg);
|
||||
|
||||
} // end try
|
||||
catch (MessagingException me)
|
||||
{ // error loading the E-mail message
|
||||
throw new PermanentExit("error loading incoming message",me);
|
||||
|
||||
} // end catch
|
||||
catch (IOException ioe)
|
||||
{ // error reading the message somehow
|
||||
throw new TemporaryExit("error reading incoming message",ioe);
|
||||
|
||||
} // end catch
|
||||
|
||||
// Now process the message via the script.
|
||||
script_mgr.registerBean("message",msg);
|
||||
try
|
||||
{ // exec the script!
|
||||
script_mgr.exec(script_lang,script_file.getAbsolutePath(),1,1,script_code);
|
||||
|
||||
} // end try
|
||||
catch (BSFException e)
|
||||
{ // handle the exception somehow
|
||||
Throwable t = e.getTargetException();
|
||||
if (t instanceof TemporaryExit)
|
||||
throw (TemporaryExit)t;
|
||||
if (t instanceof PermanentExit)
|
||||
throw (PermanentExit)t;
|
||||
throw new TemporaryExit("script error",e);
|
||||
|
||||
} // end catch
|
||||
|
||||
} // end runMe
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Ye Olde main() Function
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
// Should be invoked from within a .qmail file as:
|
||||
// |preline -f <this executable>
|
||||
if (args.length<1)
|
||||
{ // bad error - bail out
|
||||
System.err.println("usage: java " + Main.class.getName() + " property-file");
|
||||
System.exit(EXIT_FAIL_PERMANENT);
|
||||
|
||||
} // end if
|
||||
|
||||
int rc = EXIT_SUCCESS;
|
||||
try
|
||||
{ // create the "self" object
|
||||
Main self = new Main(args[0]);
|
||||
self.runMe();
|
||||
|
||||
} // end try
|
||||
catch (TemporaryExit te)
|
||||
{ // temporary failure
|
||||
System.err.println("Temporary failure in mail gateway");
|
||||
te.printStackTrace();
|
||||
rc = EXIT_FAIL_TEMPORARY;
|
||||
|
||||
} // end catch
|
||||
catch (PermanentExit pe)
|
||||
{ // permanent failure
|
||||
System.err.println("Permanent failure in mail gateway");
|
||||
pe.printStackTrace();
|
||||
rc = EXIT_FAIL_PERMANENT;
|
||||
|
||||
} // end catch
|
||||
|
||||
System.exit(rc);
|
||||
|
||||
} // end main
|
||||
|
||||
} // end class Main
|
||||
|
||||
|
215
src/com/silverwrist/mailgate/MessageData.java
Normal file
215
src/com/silverwrist/mailgate/MessageData.java
Normal file
|
@ -0,0 +1,215 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (the "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System - Generic Mail Gateway.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.mailgate;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import javax.mail.*;
|
||||
import javax.mail.internet.*;
|
||||
|
||||
public class MessageData
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private Set recipients; // the set of addresses the message was sent to
|
||||
private String sender; // the sender
|
||||
private String subject; // the message subject
|
||||
private String text = null; // the message text
|
||||
private ArrayList attachments = new ArrayList(); // the attachments
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public MessageData(MimeMessage msg) throws MessagingException, IOException
|
||||
{
|
||||
// Find all recipients of the message and put them in a set, so we can detect if the message
|
||||
// was sent to a list we "subscribe" to.
|
||||
Address[] tmp_array = msg.getAllRecipients();
|
||||
HashSet tmp_set = new HashSet();
|
||||
int i;
|
||||
for (i=0; i<tmp_array.length; i++)
|
||||
if (tmp_array[i].getType().equals("rfc822"))
|
||||
{ // peel out the actual E-mail address and stick it in the set
|
||||
InternetAddress addr = (InternetAddress)(tmp_array[i]);
|
||||
tmp_set.add(addr.getAddress().toLowerCase());
|
||||
|
||||
} // end if and for
|
||||
|
||||
if (tmp_set.isEmpty())
|
||||
recipients = Collections.EMPTY_SET;
|
||||
else
|
||||
recipients = Collections.unmodifiableSet(tmp_set);
|
||||
|
||||
// Get the list of senders and put it together into the "sender" label.
|
||||
tmp_array = msg.getFrom();
|
||||
StringBuffer buf = new StringBuffer();
|
||||
for (i=0; i<tmp_array.length; i++)
|
||||
{ // append the addresses together
|
||||
InternetAddress addr = (InternetAddress)(tmp_array[i]);
|
||||
if (buf.length()>0)
|
||||
buf.append(", ");
|
||||
buf.append(addr.toUnicodeString());
|
||||
|
||||
} // end for
|
||||
|
||||
sender = buf.toString();
|
||||
|
||||
// Get the subject line.
|
||||
subject = msg.getSubject();
|
||||
|
||||
if (msg.getContentType().toLowerCase().startsWith("multipart/"))
|
||||
{ // we need to break up the multipart object
|
||||
Multipart mp = (Multipart)(msg.getContent());
|
||||
if (msg.isMimeType("multipart/alternative"))
|
||||
processAlternative(mp);
|
||||
else
|
||||
processMultipart(mp);
|
||||
|
||||
} // end if
|
||||
else // no attachment - we assume it must be text
|
||||
text = msg.getContent().toString();
|
||||
|
||||
} // end constructor
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
private void processAlternative(Multipart mp) throws IOException, MessagingException
|
||||
{
|
||||
BodyPart html_part = null;
|
||||
BodyPart plain_part = null;
|
||||
int count = mp.getCount();
|
||||
for (int i=0; i<count; i++)
|
||||
{ // look for HTML and plain text body parts within the alternative
|
||||
BodyPart bp = mp.getBodyPart(i);
|
||||
if (bp.isMimeType("text/html") && (html_part==null))
|
||||
html_part = bp;
|
||||
else if (bp.isMimeType("text/plain") && (plain_part==null))
|
||||
plain_part = bp;
|
||||
if ((html_part!=null) && (plain_part!=null))
|
||||
break; // all done with scan loop
|
||||
|
||||
} // end for
|
||||
|
||||
if (html_part!=null)
|
||||
text = html_part.getContent().toString();
|
||||
else if (plain_part!=null)
|
||||
text = plain_part.getContent().toString();
|
||||
|
||||
} // end processAlternative
|
||||
|
||||
private void processAttachment(BodyPart bp) throws MessagingException, IOException
|
||||
{
|
||||
// extract the information
|
||||
String filename = bp.getFileName();
|
||||
if ((filename==null) || (filename.length()==0))
|
||||
return; // discard attachment data if it has no filename
|
||||
String mime_type = bp.getContentType();
|
||||
InputStream istm = bp.getInputStream();
|
||||
|
||||
// create an attachment and save it
|
||||
AttachmentData att = new AttachmentData(mime_type,filename,istm);
|
||||
attachments.add(att);
|
||||
|
||||
} // end processAttachment
|
||||
|
||||
private void processMultipart(Multipart mp) throws MessagingException, IOException
|
||||
{
|
||||
int count = mp.getCount();
|
||||
for (int i=0; i<count; i++)
|
||||
{ // analyze each body part
|
||||
BodyPart bp = mp.getBodyPart(i);
|
||||
if (bp.isMimeType("multipart/alternative"))
|
||||
{ // "alternative" multipart may contain the message text
|
||||
Multipart sub_mp = (Multipart)(bp.getContent());
|
||||
if (text==null)
|
||||
processAlternative(sub_mp);
|
||||
else
|
||||
{ // we already have the text - take the final alternative and make it an attachment
|
||||
int desired_index = sub_mp.getCount() - 1;
|
||||
processAttachment(sub_mp.getBodyPart(desired_index));
|
||||
|
||||
} // end else
|
||||
|
||||
} // end if
|
||||
else if (bp.getContentType().toLowerCase().startsWith("multipart/"))
|
||||
processMultipart((Multipart)(bp.getContent()));
|
||||
else if ((bp.isMimeType("text/html") || bp.isMimeType("text/plain")) && (text==null))
|
||||
text = bp.getContent().toString();
|
||||
else
|
||||
processAttachment(bp);
|
||||
|
||||
} // end for
|
||||
|
||||
} // end processMultipart
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public final boolean sentTo(String addr)
|
||||
{
|
||||
return recipients.contains(addr.toLowerCase());
|
||||
|
||||
} // end sentTo
|
||||
|
||||
public final String getSender()
|
||||
{
|
||||
return sender;
|
||||
|
||||
} // end getSender
|
||||
|
||||
public final String getSubject()
|
||||
{
|
||||
return subject;
|
||||
|
||||
} // end getSubject
|
||||
|
||||
public final String getText()
|
||||
{
|
||||
return text;
|
||||
|
||||
} // end getText
|
||||
|
||||
public final int getAttachmentCount()
|
||||
{
|
||||
return attachments.size();
|
||||
|
||||
} // end getAttachmentCount
|
||||
|
||||
public final boolean hasAttachments()
|
||||
{
|
||||
return !(attachments.isEmpty());
|
||||
|
||||
} // end hasAttachments
|
||||
|
||||
public final AttachmentData getAttachment(int ndx)
|
||||
{
|
||||
return (AttachmentData)(attachments.get(ndx));
|
||||
|
||||
} // end getAttachment
|
||||
|
||||
} // end class MessageData
|
51
src/com/silverwrist/mailgate/PermanentExit.java
Normal file
51
src/com/silverwrist/mailgate/PermanentExit.java
Normal file
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (the "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System - Generic Mail Gateway.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.mailgate;
|
||||
|
||||
public class PermanentExit extends BaseException
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructors
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public PermanentExit()
|
||||
{
|
||||
super();
|
||||
|
||||
} // end constructor
|
||||
|
||||
public PermanentExit(String msg)
|
||||
{
|
||||
super(msg);
|
||||
|
||||
} // end constructor
|
||||
|
||||
public PermanentExit(Throwable inner)
|
||||
{
|
||||
super(inner);
|
||||
|
||||
} // end constructor
|
||||
|
||||
public PermanentExit(String msg, Throwable inner)
|
||||
{
|
||||
super(msg,inner);
|
||||
|
||||
} // end constructor
|
||||
|
||||
} // end class PermanentExit
|
51
src/com/silverwrist/mailgate/TemporaryExit.java
Normal file
51
src/com/silverwrist/mailgate/TemporaryExit.java
Normal file
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (the "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System - Generic Mail Gateway.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.mailgate;
|
||||
|
||||
public class TemporaryExit extends BaseException
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructors
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public TemporaryExit()
|
||||
{
|
||||
super();
|
||||
|
||||
} // end constructor
|
||||
|
||||
public TemporaryExit(String msg)
|
||||
{
|
||||
super(msg);
|
||||
|
||||
} // end constructor
|
||||
|
||||
public TemporaryExit(Throwable inner)
|
||||
{
|
||||
super(inner);
|
||||
|
||||
} // end constructor
|
||||
|
||||
public TemporaryExit(String msg, Throwable inner)
|
||||
{
|
||||
super(msg,inner);
|
||||
|
||||
} // end constructor
|
||||
|
||||
} // end class TemporaryExit
|
Loading…
Reference in New Issue
Block a user