| From: | Jon(dot)Roberts at asurion(dot)com (Roberts, Jon) | 
|---|---|
| To: | |
| Subject: | [Pljava-dev] emailing with pl/java | 
| Date: | 2008-05-02 20:45:40 | 
| Message-ID: | 1A6E6D554222284AB25ABE3229A92762E9A2B9@nrtexcus702.int.asurion.com | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pljava-dev | 
I can't get this to work inside of PostgreSQL.
1. Java code
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
import javax.activation.*;
public class SMTP {
	public static void main(String args[])
	{
		try
    	{
    		String smtpServer=args[0];
			String to=args[1];
			String from=args[2];
			String subject=args[3];
			String body=args[4];
			String output = send(smtpServer, to, from,
subject, body);
		}
	    catch (Exception ex)
	    {
			System.out.println("Usage: java SMTP smtpServer
toAddress fromAddress subjectText bodyText");
		}
	    System.exit(0);
	}
	public static String send(String smtpServer, String to, String
from, String subject, String body)
	{
		try
		{
			MailcapCommandMap mc =
(MailcapCommandMap)CommandMap.getDefaultCommandMap();
			mc.addMailcap("text/plain; ;
x-java-content-handler=com.sun.mail.handlers.text_plain");
			CommandMap.setDefaultCommandMap(mc);
			Properties props = System.getProperties();
			props.setProperty("mail.smtp.host", smtpServer);
			Session session =
Session.getDefaultInstance(props, null);
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
			msg.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to, false));
msg.setSubject(subject);
msg.setText(body);
Transport.send(msg);
return "Success";
		}
    	catch (Exception ex)
    	{
    		return "ERROR: " + ex.getMessage().replace("'", "");
    	}
  	}
}
2.  Set classpath
C:\java_test>echo %CLASSPATH%
.;C:\Program
Files\PostgreSQL\8.3\share\pljava\pljava.jar;c:\java_test\activatio
n.jar;c:\java_test\mail.jar
3.  Edit manifest.txt
C:\java_test>type manifest.txt
Main-Class: SMTP
Class-Path: activation.jar mail.jar
4.  Compile Java
C:\java_test>javac SMTP.java
5.  Create a Jar
C:\java_test>jar cfm SMTP.jar manifest.txt SMTP.class
6.  Test from a command line
C:\java_test>java -jar SMTP.jar
Usage: java SMTP smtpServer toAddress fromAddress subjectText bodyText
I also tested with my email address and it works just fine.
7.  Load into PostgreSQL
select * from sqlj.install_jar('file:///c://java_test//SMTP.jar',
'smtp_jar', false);
select * from sqlj.install_jar('file:///c://java_test//activation.jar',
'activation_jar', false);
select * from sqlj.install_jar('file:///c://java_test//mail.jar',
'mail_jar', false);
select sqlj.set_classpath('control',
'smtp_jar:activation_jar:mail_jar');
select * from sqlj.get_classpath('control')
CREATE OR REPLACE FUNCTION control.fn_smtp(p_smtp_server varchar, p_to
varchar, p_from varchar, p_subject varchar, p_body varchar) returns
varchar as
'SMTP.send(java.lang.String, java.lang.String, java.lang.String,
java.lang.String, java.lang.String)'
  LANGUAGE 'java';
select control.fn_smtp('smtp_server', 'from at foo.bar', 
                       'to at foo.bar', 'Test Subject', 
                       'Test body');
I get this error: "ERROR: IOException while sending message"
I then put PostgreSQL in full debug and I captured this:
DEBUG:  02 May 08 15:36:10 com.sun.activation.registries.LogSupport
Can't load DCH com.sun.mail.handlers.text_plain
java.lang.ClassNotFoundException: com/sun/mail/handlers/text_plain
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:169)
	at
javax.activation.MailcapCommandMap.getDataContentHandler(MailcapCommandM
ap.java:578)
	at
javax.activation.MailcapCommandMap.createDataContentHandler(MailcapComma
ndMap.java:535)
	at
javax.activation.DataHandler.getDataContentHandler(DataHandler.java:596)
	at javax.activation.DataHandler.writeTo(DataHandler.java:300)
	at
javax.mail.internet.MimeUtility.getEncoding(MimeUtility.java:261)
	at
javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1321)
	at
javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2074)
	at
javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2042)
	at javax.mail.Transport.send(Transport.java:117)
	at SMTP.send(SMTP.java:53)
I'm guessing the problem is this line:
mc.addMailcap("text/plain; ;
x-java-content-handler=com.sun.mail.handlers.text_plain");
This class is in the mail.jar file and it is installed with
sqlj.install_jar.   Why can't pl/java find this class?  Mail.jar is
loaded into the db.  It finds other classes loaded into the db like
javax.mail.* but it can't seem to resolve this one that is handled in a
String.   
Jon
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Roberts, Jon | 2008-05-05 15:14:39 | [Pljava-dev] emailing with pl/java | 
| Previous Message | Roberts, Jon | 2008-04-29 17:38:48 | [Pljava-dev] setof record |