[Pljava-dev] emailing with pl/java

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: Raw Message | Whole Thread | 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

Responses

Browse pljava-dev by date

  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