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
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 |