/********************************************************* begin of preamble
**
** Copyright (C) 2003-2010 Software- und Organisations-Service GmbH.
** All rights reserved.
**
** This file may be used under the terms of either the
**
** GNU General Public License version 2.0 (GPL)
**
** as published by the Free Software Foundation
** http://www.gnu.org/licenses/gpl-2.0.txt and appearing in the file
** LICENSE.GPL included in the packaging of this file.
**
** or the
**
** Agreement for Purchase and Licensing
**
** as offered by Software- und Organisations-Service GmbH
** in the respective terms of supply that ship with this file.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
** IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
** BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
** POSSIBILITY OF SUCH DAMAGE.
********************************************************** end of preamble*/
package sos.net;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.text.DecimalFormat;
import java.text.FieldPosition;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Locale;
import java.util.NoSuchElementException;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.TreeMap;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Header;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import sos.settings.SOSSettings;
import sos.util.SOSClassUtil;
import sos.util.SOSDate;
import sos.util.SOSLogger;
import sos.util.SOSStandardLogger;
/**
*
* @version $Id: SOSMail.java 14569 2011-06-07 16:17:09Z sos $
*/
public class SOSMail {
abstract class My_data_source implements DataSource
{
final String name;
final String content_type;
public My_data_source( File new_filename, String content_type )
{
this.name = new_filename.getName();
this.content_type = content_type;
}
public String getContentType() { return content_type; }
public String getName () { return name; }
public OutputStream getOutputStream()
{
throw new RuntimeException( getClass().getName() + " hat keinen OutputStream" );
}
}
//--------------------------------------------------------------------------------class File_data_source
// Eigene Klasse f�r Attachments, damit close m�glich ist.
class File_data_source extends My_data_source
{
final File file;
public File_data_source( File file, String content_type )
{
super( file, content_type );
this.file = file;
}
public InputStream getInputStream() throws IOException
{
FileInputStream f = new FileInputStream( file );
file_input_streams.add( f ); // wird von Message.close() geschlossen
return f;
}
}
/** Attribut: host:
* - Wird im Konstruktor als Parameter �bergeben.
* - Kann �ber Settings-Objekt gesetzt werden.
* - mit .setHost kann Host gesetzt werden. Es wird dann eine auch eine neue Message-id vergeben.
*/
protected String host="";
/** Attribut: port: Default=25
* - Wird im Konstruktor als Parameter �bergeben.
* - Kann �ber Settings-Objekt gesetzt werden.
* - mit .setPort kann Port gesetzt werden. Es wird dann eine auch eine neue Message-id vergeben.
*/
protected String port="25";
/** Attribut: user:
* Zur Verwendung bei SMTP_Server, die eine Autentifizierung verlangen
* - Wird im Konstruktor als Parameter �bergeben.
* - Kann �ber Settings-Objekt gesetzt werden.
* - mit .setUser kann User gesetzt werden. Es wird dann eine auch eine neue Message-id vergeben.
*/
protected String user="";
/** Attribut: password:
* Zur Verwendung bei SMTP_Server, die eine Autentifizierung verlangen
* - Wird im Konstruktor als Parameter �bergeben.
* - Kann �ber Settings-Objekt gesetzt werden.
* - mit .setPassword kann User gesetzt werden. Es wird dann eine auch eine neue Message-id vergeben.
*/
protected String password="";
/** Attribut: timeout: Default=30000
*
* - Wird im Konstruktor als Parameter �bergeben.
* - Kann �ber Settings-Objekt gesetzt werden. Dort werden Sekunden angegeben
* - mit .setTimeout kann Timeout gesetzt werden. Es wird dann eine auch eine neue Message-id vergeben.
*/
protected int timeout=30000;
/** Attribut: subject
*
* Kann Variable enthalten, die substituiert werden z.B. &(var).
* Siehe Methode substitute
*
*
*/
protected String subject="";
protected String from="";
protected String fromName="";
protected String replyTo="";
protected String queueDir="";
protected String body = "";
protected String alternativeBody = "";
protected String language = "de";
protected String dateFormat = "dd.MM.yyyy";
protected String datetimeFormat = "dd.MM.yyyy HH:mm";
protected HashMap dateFormats = new HashMap();
protected HashMap datetimeFormats = new HashMap();
/** Attribut: charSet: iso-8859-1, us-ascii f�r Attachments. Wenn leer
Wird charset verwendet.
*/
protected String attachmentCharset = "iso-8859-1";
/** Attribut: charSet: iso-8859-1, us-ascii f�r Body.*/
protected String charset = "iso-8859-1";
protected String alternativeCharset = "iso-8859-1";
/** Mime-Type der Nachricht: text/plain, text/html etc.*/
protected String contentType = "text/plain";
protected String alternativeContentType = "text/html";
/** Attribut: encoding: Codierung des Nachrichteninhalts (Quoted-Printable, Base64) */
protected String encoding = "7bit";
protected String alternativeEncoding = "7bit";
/** Attribut: encoding: Codierung des Anhanges (Quoted-Printable, Base64) */
protected String attachmentEncoding = "Base64";
/** Mime-Type der Nachricht: application/octet-stream, application/pdf etc. */
protected String attachmentContentType = "application/octet-stream";
/** recipient Liste */
protected LinkedList toList = new LinkedList();
/** cc Liste */
protected LinkedList ccList = new LinkedList();
/** bcc Liste */
protected LinkedList bccList = new LinkedList();
/** attachment Liste */
protected TreeMap attachmentList = new TreeMap();
/** Muster f�r eMail-Texte */
protected Properties templates = new Properties();
/** sos settings object */
protected SOSSettings sosSettings = null;
/** Tabelle f�r Einstellungen */
protected String tableSettings = "SETTINGS";
/** Tabelle f�r eMail Auftr�ge und Historie */
public static String tableMails = "MAILS";
/** Tabelle f�r eMail Anh�nge */
public static String tableMailAttachments = "MAIL_ATTACHMENTS";
/** Sequenzname der IDs f�r die MAILS Tablle*/
public static String mailsSequence = "MAILS_ID_SEQ";
/** Applikationsname f�r eMail-Einstellungen */
protected String applicationMail = "email";
/** Sektionsname f�r eMail-Einstellungen */
protected String sectionMail = "mail_server";
/** Applikationsname f�r eMail-Templates in Settings */
protected String applicationMailTemplates = "email_templates";
/** Sektionsname f�r eMail-Templates in Settings */
protected String sectionMailTemplates = "mail_templates";
/** Applikationsname f�r eMail-Scripts in Settings */
protected String applicationMailScripts = "email";
/** Sektionsname f�r eMail-Scripts in Settings */
protected String sectionMailScripts = "mail_start_scripts_factory";
/** Applikationsname f�r eMail-Templates der Document Factory in Settings */
protected String applicationMailTemplatesFactory = "email_templates_factory";
/** Sektionsname f�r eMail-Templates der Document Factory in Settings */
protected String sectionMailTemplatesFactory = "mail_templates";
/** Email als byteArray verf�gbar machen */
private boolean sendToOutputStream=false;
private byte[] messageBytes;
private MimeMessage message = null;
private SOSMailAuthenticator authenticator = null;
private ArrayList file_input_streams = new ArrayList(); // Alle offenen Attachments, werden von close() geschlossen
protected SOSLogger sosLogger=null;
private ByteArrayOutputStream raw_email_byte_stream = null;
private String lastError="";
private boolean changed=false;
private String queuePattern="yyyy-MM-dd.HHmmss.S";
private String queuePraefix="sos.";
private String lastGeneratedFileName="";
private String loadedMessageId="";
private boolean messageReady=false;
private int priority=-1;
private Session session=null;
// Konstanten f�r Priorit�ten (in Settings und MAILS Tabelle)
public static final int PRIORITY_HIGHEST = 1;
public static final int PRIORITY_HIGH = 2;
public static final int PRIORITY_NORMAL = 3;
public static final int PRIORITY_LOW = 4;
public static final int PRIORITY_LOWEST = 5;
//Depricated
private String filename;
//--------------------------------------------------------------------------------Konstruktor
/**
* Konstruktor
* @param host string Hostname oder IP-Adresse des Mail-Servers
* Wird verwendet bei smtp-server ohne Autentifierung
* Standardport 25 wird verwendet
* @throws java.lang.Exception
*/
public SOSMail(String host) throws Exception {
if (host != null) {
this.host = host;
}
this.init();
}
/**
* Konstruktor
* @param host String Hostname oder IP-Adresse des Mail-Servers
* @param user String Name des SMTP-Benutzers
* @param pass String Kennwort des SMTP-Benutzers
* Wird verwendet bei smtp-server mit Autentifierung
* Standardport 25 wird verwendet
*
* @throws java.lang.Exception
*/
public SOSMail(String host_, String user_, String password_)
throws Exception {
if (host_ != null) {
this.host = host_;
}
if (user_ != null) {
this.user = user_;
}
if (password_ != null) {
this.password = password_;
}
this.init();
}
/**
* Konstruktor
* @param host String Hostname oder IP-Adresse des Mail-Servers
* @param user String Name des SMTP-Benutzers
* @param pass String Kennwort des SMTP-Benutzers
* Wird verwendet bei smtp-server mit Autentifierung ,wenn der Port festgelegt werden soll
*
* @throws java.lang.Exception
*/
public SOSMail(String host_, String port_, String user_, String password_)
throws Exception {
if (host_ != null) {
this.host = host_;
}
if (port_ != null) {
this.port = port_;
}
if (user_ != null) {
this.user = user_;
}
if (password_ != null) {
this.password = password_;
}
this.init();
}
/**
* Konstruktor
* @param sosSettings SOSSettings Einstellungen aus Profile Settings oder Connection Settings
* @throws java.lang.Exception
*/
public SOSMail(SOSSettings sosSettings)
throws Exception {
this.getSettings(sosSettings);
this.init();
}
/**
* Konstruktor
* @param sosSettings SOSSettings Einstellungen aus Profile Settings oder Connection Settings
* @param language Sprache f�r Einstellungen
* @throws java.lang.Exception
*/
public SOSMail(SOSSettings sosSettings, String language)
throws Exception {
this.getSettings(sosSettings, language);
this.init();
}
/**
* Initialisierungen
* -ruft initMessage()
* -ruf initLanguage()
* Wird im Konstruktor gerufen.
* @throws MessagingException
*
* @throws java.lang.Exception
*/
//--------------------------------------------------------------------------------init
private void initPriority() throws MessagingException {
switch(this.priority) {
case PRIORITY_HIGHEST: this.setPriorityHighest(); break;
case PRIORITY_HIGH: this.setPriorityHigh(); break;
case PRIORITY_LOW: this.setPriorityLow(); break;
case PRIORITY_LOWEST: this.setPriorityLowest(); break;
default: break;
// default: this.setPriorityNormal(); break;
}
}
public void init() throws Exception {
this.dateFormats.put( "de", "dd.MM.yyyy");
this.dateFormats.put( "en", "MM/dd/yyyy");
this.datetimeFormats.put( "de", "dd.MM.yyyy HH:mm");
this.datetimeFormats.put( "en", "MM/dd/yyyy HH:mm");
this.initLanguage();
this.initMessage();
clearRecipients() ;
clearAttachments();
}
//--------------------------------------------------------------------------------initMessage
/**
* Initialisierungen
* -Autorisierung f�r smtp-Server
* -Anlegen des Message-Objekts
* -L�schen der Empf�nger- und der Attachmentliste
* Wenn ein sosmail-Objekt mehrmach wiederverwendet werden sollen , muss f�r jede Nachricht
* .init() gerufen.
*
* @throws java.lang.Exception
*/
public void initMessage() throws Exception {
createMessage(createSession());
initPriority();
}
//--------------------------------------------------------------------------------createSession
/**
* Initialisierungen
* -Autorisierung f�r smtp-Server
* -Anlegen des Message-Objekts
* -L�schen der Empf�nger- und der Attachmentliste
* Wenn ein sosmail-Objekt mehrmach wiederverwendet werden sollen , muss f�r jede Nachricht
* .init() gerufen.
*
* @throws java.lang.Exception
*/
public Session createSession() throws Exception {
Properties props = System.getProperties();
props.put("mail.host", this.host);
props.put("mail.port", this.port);
props.put("mail.smtp.timeout",String.valueOf(timeout));
props.put( "mail.transport.protocol", "smtp");
props.put( "mail.smtp.class", "com.sun.mail.SMTPTransport");
if (this.user.length()>0 ){
props.put("mail.smtp.auth", "true");
}else {
props.put("mail.smtp.auth", "false");
}
authenticator = new SOSMailAuthenticator(this.user,this.password);
session = Session.getInstance(props, authenticator);
return session;
}
//--------------------------------------------------------------------------------createMessage
public void createMessage(Session session) throws Exception {
message = new MimeMessage(session);
}
//--------------------------------------------------------------------------------initLanguage
/**
* Initialisierungen
* -Datumsformat setzen
*
* @throws java.lang.Exception
*/
public void initLanguage() throws Exception {
if ( this.dateFormats.containsKey(this.getLanguage()) && this.datetimeFormats.containsKey(this.getLanguage()) ) {
this.setDateFormat( this.dateFormats.get(this.getLanguage()).toString());
this.setDatetimeFormat( this.datetimeFormats.get(this.getLanguage()).toString());
} else {
this.setDateFormat( this.dateFormats.get("de").toString() );
this.setDatetimeFormat( this.datetimeFormats.get("de").toString() );
}
}
//--------------------------------------------------------------------------------log
public void log(String s,int level) throws Exception {
s = "SOSMail." + s;
// if (sosLogger != null && Math.abs(logLevel) >= Math.abs(level)){
if (sosLogger != null ){
switch(level) {
case SOSLogger.DEBUG1: sosLogger.debug1(s); break;
case SOSLogger.DEBUG2: sosLogger.debug2(s); break;
case SOSLogger.DEBUG3: sosLogger.debug3(s); break;
case SOSLogger.DEBUG4: sosLogger.debug4(s); break;
case SOSLogger.DEBUG5: sosLogger.debug5(s); break;
case SOSLogger.DEBUG6: sosLogger.debug6(s); break;
case SOSLogger.DEBUG7: sosLogger.debug7(s); break;
case SOSLogger.DEBUG8: sosLogger.debug8(s); break;
case SOSLogger.DEBUG9: sosLogger.debug9(s); break;
case SOSLogger.INFO: sosLogger.info(s); break;
case SOSLogger.WARN: sosLogger.warn(s); break;
case SOSLogger.ERROR: sosLogger.error(s); break;
}
}
}
//--------------------------------------------------------------------------------getSettings
/**
* Einstellungen f�r eMail-Versand aus Settings
*
* @param sosSettings SOSSettings Einstellungen aus Profile Settings oder Connection Settings
* @param language Sprache fr Einstellungen
* @throws java.lang.Exception
*/
private void getSettings(SOSSettings sosSettings, String language) throws Exception {
if ( language != null ) { this.setLanguage(language); }
this.getSettings(sosSettings);
}
//--------------------------------------------------------------------------------getEntry
private String getEntry(String val, Properties entries,String key){
String erg=val; //Do nothing if not exist
if (entries.containsKey(key) ) {
if ( entries.getProperty(key).length() > 0 )
erg = entries.getProperty(key);
}
return erg;
}
//--------------------------------------------------------------------------------getSettings
/**
* Einstellungen fr eMail-Versand aus Settings
*
* @param sosSettings SOSSettings Einstellungen aus Profile Settings oder Connection Settings
* @throws java.lang.Exception
*/
private void getSettings(SOSSettings sosSettings) throws Exception {
if (sosSettings == null)
throw new Exception(
SOSClassUtil.getMethodName() + ": missing settings object.");
this.sosSettings = sosSettings;
Properties entries = this.sosSettings.getSection(this.applicationMail, this.sectionMail);
if (entries.size() == 0)
throw new Exception(
SOSClassUtil.getMethodName()
+ ": missing settings entries in section \"" + this.sectionMail + "\".");
this.host = getEntry(this.host,entries,"host");
this.port = getEntry(this.port,entries,"port");
this.user = getEntry(this.user,entries,"smtp_user");
this.password = getEntry(this.password,entries,"smtp_pass");
this.from = getEntry(this.from,entries,"from");
this.from = getEntry(this.from,entries,"mail_from");
this.fromName = getEntry(this.fromName,entries,"from_name");
this.fromName = getEntry(this.fromName,entries,"mail_from_name");
this.replyTo = getEntry(this.replyTo,entries,"reply_to");
this.replyTo = getEntry(this.replyTo,entries,"mail_reply_to");
this.queueDir = getEntry(this.queueDir,entries,"queue_directory");
this.queueDir = getEntry(this.queueDir,entries,"mail_queue_directory");
String priorityStr = new String("1");
priority = Integer.parseInt(getEntry(priorityStr,entries,"priority"));
this.language = getEntry(this.language,entries,"language");
this.subject = getEntry(this.subject,entries,"subject");
this.contentType = getEntry(this.contentType,entries,"content_type");
this.charset = getEntry(this.charset,entries,"charset");
this.encoding = getEntry(this.encoding,entries,"encoding");
this.attachmentEncoding = getEntry(this.attachmentEncoding,entries,"attachment_encoding");
this.attachmentEncoding = getEntry(this.attachmentEncoding,entries,"file_encoding");
if (entries.getProperty("smtp_timeout") != null) {
if ( entries.getProperty("smtp_timeout").length() > 0 )
this.timeout = 1000*Integer.parseInt(entries.getProperty("smtp_timeout"));
}
if (this.from == null && entries.containsKey("mail_from")) {
if ( entries.getProperty("mail_from").length() > 0 )
this.from = entries.getProperty("mail_from");
}
}
//--------------------------------------------------------------------------------getTemplates
/**
* Muster f�r eMail-Texte
*
* @param sosSettings SOSSettings Einstellungen aus Profile Settings oder Connection Settings
* @throws java.lang.Exception
*/
public boolean getTemplates(SOSSettings sosSettings, String language) throws Exception {
if ( language != null ) this.setLanguage(language);
return this.getTemplates(sosSettings);
}
//--------------------------------------------------------------------------------getTemplates
/**
* Muster f�r eMail-Texte
*
* @param sosSettings SOSSettings Einstellungen aus Profile Settings oder Connection Settings
* @throws java.lang.Exception
*/
public boolean getTemplates(SOSSettings sosSettings) throws Exception {
if (sosSettings == null)
throw new Exception(
SOSClassUtil.getMethodName() + ": missing settings object.");
this.sosSettings = sosSettings;
this.templates = this.sosSettings.getSection(this.getApplicationMailTemplates(),
this.getSectionMailTemplates() + "_" + language);
if (this.templates.size() == 0)
throw new Exception(
SOSClassUtil.getMethodName()
+ ": missing settings entries for application \"" + this.applicationMailTemplates + "\" in section \"" + this.sectionMailTemplates + "\".");
return true;
}
//--------------------------------------------------------------------------------substituteSubject
/**
*
* @param template Name des Templates
* @param replacements HashMap mit Name/Wert-Paaren, der Name wird im Template durch den Wert ersetzt
* @param nl2br NewLines durch HTML Breaks ersetzen
* @throws java.lang.Exception
*/
public String substituteSubject(String template, HashMap replacements)
throws Exception {
if (!this.templates.containsKey(template + "_subject")) {
throw (new Exception("substituteSubject(): template does not exist: " + template + "_subject" ));
}
return substitute( this.templates.get(template + "_subject").toString(), replacements, false );
}
//--------------------------------------------------------------------------------substituteBody
/**
*
* @param template Name des Templates
* @param replacements HashMap mit Name/Wert-Paaren, der Name wird im Template durch den Wert ersetzt
* @param nl2br NewLines durch HTML Breaks ersetzen
* @throws java.lang.Exception
*/
public String substituteBody(String template, HashMap replacements, boolean nl2br)
throws Exception {
if (!this.templates.containsKey(template + "_body")) {
throw (new Exception("substituteBody(): template does not exist: " + template + "_body" ));
}
return substitute( this.templates.get(template + "_body").toString(), replacements, nl2br );
}
//--------------------------------------------------------------------------------substituteBody
/**
*
* @param template Name des Templates
* @param replacements HashMap mit Name/Wert-Paaren, der Name wird im Template durch den Wert ersetzt
* @param nl2br NewLines durch HTML Breaks ersetzen
* @throws java.lang.Exception
*/
public String substituteBody(String template, HashMap replacements )
throws Exception {
if (! this.templates.containsKey(template + "_body")) {
throw (new Exception("substituteBody(): template does not exist: " + template + "_body" ));
}
return substitute( this.templates.get(template + "_body").toString(), replacements, false);
}
//-------------------------------------------------------------------------------------substitute
/**
*
* @param content String mit beliebigem Inhalt
* @param replacements HashMap mit Name/Wert-Paaren, der Name wird im content durch den Wert ersetzt
* @param nl2br NewLines durch HTML Breaks ersetzen
* @throws java.lang.Exception
* @deprecated
*/
public String substitute(String content, HashMap replacements, boolean nl2br)
throws Exception {
Object key = null;
Object value = null;
if (this.getLanguage().equalsIgnoreCase("de")) {
this.setDateFormat("dd.MM.yyyy");
this.setDatetimeFormat("dd.MM.yyyy HH:mm");
} else if (this.getLanguage().equalsIgnoreCase("en")) {
this.setDateFormat("MM/dd/yyyy");
this.setDatetimeFormat("MM/dd/yyyy HH:mm");
}
content = content.replaceAll( "&\\(date\\)", SOSDate.getCurrentDateAsString(this.getDateFormat()) );
content = content.replaceAll( "&\\(datetime\\)", SOSDate.getCurrentTimeAsString(this.getDatetimeFormat()) );
content = content.replaceAll( "&\\#\\(date\\)", SOSDate.getCurrentDateAsString(this.getDateFormat()) );
content = content.replaceAll( "&\\#\\#\\(datetime\\)", SOSDate.getCurrentTimeAsString(this.getDatetimeFormat()) );
if (nl2br) {
content = content.replaceAll( "\n", "<br/>");
}
if ( replacements != null ) {
Iterator keys = replacements.keySet().iterator();
while( keys.hasNext() ) {
key = keys.next();
if ( key != null ) {
value = replacements.get(key.toString());
if (value != null ) {
try {
content = content.replaceAll( "&\\#\\(" + key.toString() + "\\)", SOSDate.getDateAsString(SOSDate.getDate(value.toString()), this.getDateFormat()) );
content = content.replaceAll( "&\\#\\#\\(" + key.toString() + "\\)", SOSDate.getDateTimeAsString(SOSDate.getDate(value.toString()), this.getDatetimeFormat()) );
} catch (Exception ex) {} // ignore this error: replacement is not convertible to date
Locale defaultLocale = Locale.getDefault();
try {
double doubleValue = Double.parseDouble(value.toString());
if (this.getLanguage().equalsIgnoreCase("de")) {
Locale.setDefault(Locale.GERMAN);
} else if (this.getLanguage().equalsIgnoreCase("en")) {
Locale.setDefault(Locale.US);
}
DecimalFormat formatter = new DecimalFormat("#,###.00");
content = content.replaceAll( "&\\$\\(" + key.toString() + "\\)", formatter.format(doubleValue).toString() );
} catch (Exception ex) {
} finally {
Locale.setDefault(defaultLocale);
}
content = content.replaceAll( "&\\(" + key.toString() + "\\)", value.toString() );
}
}
}
}
// remove all variables that were not substituted
content = content.replaceAll( "&\\#\\(.*\\)", "");
content = content.replaceAll( "&\\#\\#\\(.*\\)", "");
content = content.replaceAll( "&\\$\\(.*\\)", "");
return content.replaceAll( "&\\(.*\\)", "");
}
//--------------------------------------------------------------------------------addRecipient
/**
*
* @param recipient eMail-Adresse des Empf�ngers
* @throws java.lang.Exception
*/
public void addRecipient(String recipient) throws Exception {
String token="";
warn ("addRecipient",recipient);
if (recipient == null)
throw new Exception(
SOSClassUtil.getMethodName() + ": recipient has no value.");
recipient = recipient.replace(',',';');
StringTokenizer t = new StringTokenizer(recipient, ";");
while (t.hasMoreTokens() ) {
token = t.nextToken();
if (!toList.contains(token)){
this.toList.add(token);
}
log(SOSClassUtil.getMethodName() + "-->" + token,SOSLogger.DEBUG9);
}
changed=true;
}
//--------------------------------------------------------------------------------addCC
/**
*
* @param recipient eMail-Adresse des cc Empf�ngers
* @throws java.lang.Exception
*/
public void addCC(String recipient) throws Exception {
String token="";
warn ("addCC",recipient);
if (recipient == null)
throw new Exception(
SOSClassUtil.getMethodName()
+ ": CC recipient has no value.");
recipient = recipient.replace(',',';');
StringTokenizer t = new StringTokenizer(recipient, ";");
while (t.hasMoreTokens() ) {
token = t.nextToken();
if (!toList.contains(token) && !ccList.contains(token)){
this.ccList.add(token);
log(SOSClassUtil.getMethodName() + "-->" + token,SOSLogger.DEBUG9);
}else{
log(SOSClassUtil.getMethodName() + "--> Ignored:" + token,SOSLogger.DEBUG9);
}
}
changed=true;
}
//--------------------------------------------------------------------------------addBCC
/**
*
* @param recipient eMail-Adresse des bcc Empf�ngers
* @throws java.lang.Exception
*/
public void addBCC(String recipient) throws Exception {
String token="";
warn ("addBCC",recipient);
if (recipient == null)
throw new Exception(
SOSClassUtil.getMethodName()
+ ": BCC recipient has no value.");
recipient = recipient.replace(',',';');
StringTokenizer t = new StringTokenizer(recipient, ";");
while (t.hasMoreTokens() ) {
token = t.nextToken();
if (!ccList.contains(token) && !toList.contains(token) && !bccList.contains(token)){
this.bccList.add(token);
log(SOSClassUtil.getMethodName() + "-->" + token,SOSLogger.DEBUG9);
}else{
log(SOSClassUtil.getMethodName() + "--> Ignored:" + token,SOSLogger.DEBUG9);
}
}
changed=true;
}
//--------------------------------------------------------------------------------closeAttachments
private void closeAttachments() throws Exception {
Exception exception = null;
for( int i = 0; i < file_input_streams.size(); i++ )
{
try
{
((FileInputStream)file_input_streams.get(i)).close();
}
catch( Exception x ) { if( exception == null ) exception = x; }
}
if( exception != null ) throw exception;
}
// --------------------------------------------------------------------------------addAttachment
/**
*
* @param filename Datei fr Anhang
* @throws java.lang.Exception
*/
public void addAttachment(SOSMailAttachment att) throws Exception {
warn ("addAttachment",att.getFile().getAbsolutePath());
this.attachmentList.put(att.getFile().getAbsolutePath(), att);
changed=true;
}
//--------------------------------------------------------------------------------addAttachment
/**
*
* @param filename Datei fr Anhang
* @throws java.lang.Exception
*/
public void addAttachment(String filename) throws Exception {
warn ("addAttachment",filename);
File f = new File(filename);
SOSMailAttachment att = new SOSMailAttachment(this,f);
att.setCharset(getAttachmentCharset());
att.setEncoding(getAttachmentEncoding());
att.setContentType(getAttachmentContentType());
this.attachmentList.put(filename, att);
changed=true;
}
//--------------------------------------------------------------------------------addAttachment
/**
*
* @param filename Datei fr Anhang
* @param contentType Content-Type dieses Anhangs
* @throws java.lang.Exception
*/
public void addAttachment(String filename, String params) throws Exception {
String name="";
String value="";
String token="";
int counter=0;
warn ("addAttachment",filename + "(" +params +")");
StringTokenizer t = new StringTokenizer(params, ",");
File f = new File(filename);
SOSMailAttachment att = new SOSMailAttachment(this,f);
while (t.hasMoreTokens()) {
token = t.nextToken();
StringTokenizer vv = new StringTokenizer(token, "=");
if (vv.countTokens()==1){
name = "content-type";
value = vv.nextToken();
counter +=1;
}else{
name = vv.nextToken().trim();
try{
value = vv.nextToken().trim();
}catch (NoSuchElementException e){
value="";
}
}
if (name.equalsIgnoreCase("content-type")){
att.setContentType(value);
}
else if (name.equalsIgnoreCase("charset")){
att.setCharset(value);
}
else if (name.equalsIgnoreCase("encoding")){
att.setEncoding(value);
}else{
throw new Exception("USING of .addAttachment is wrong. ==> " + params + ", rigth using is: [content-type-value],[content-type=<value>],[charset=<value>],[encoding=<value>]");
}
if (counter > 1 ){
throw new Exception("USING of .addAttachment is wrong. ==> " + params + ", rigth using is: [content-type-value],[content-type=<value>],[charset=<value>],[encoding=<value>]");
}
}
this.attachmentList.put(filename, att);
changed=true;
}
//--------------------------------------------------------------------------------add_file
private void add_file( SOSMailAttachment att ) throws Exception
{
if( !att.getFile().exists() ) throw new Exception( "Datei "+ att.getFile().getAbsolutePath() + " fehlt" );
MimeBodyPart attachment = new MimeBodyPart();
DataSource data_source = new File_data_source( att.getFile(), att.getContentType() );
DataHandler data_handler = new DataHandler( data_source );
attachment.setDataHandler( data_handler );
attachment.setFileName ( att.getFile().getName() );
//Charset des Attachments setzen, wenn content_type text/ ist
if (att.getContentType().startsWith("text/")){
// Charset macht nur Sinn bei text/
String s = "";
FileReader fr = new FileReader( att.getFile() );
for ( int c; ( c = fr.read() ) != -1; )
s += ( (char) c );
attachment.setText(s,att.getCharset());
fr.close();
}
Object m = message.getContent();
if( !( m instanceof MimeMultipart ) ) throw new RuntimeException( getClass().getName() + "mime_message.getContent() liefert nicht MimeMultiPart" );
((MimeMultipart)m).addBodyPart( attachment );
attachment.setHeader("Content-Transfer-Encoding", att.getEncoding());
}
//--------------------------------------------------------------------------------loadFile
public void loadFile(File messageFile) throws Exception {
FileInputStream messageInputStream= null;
try {
messageInputStream = new FileInputStream(messageFile);
message = new MimeMessage( createSession(), messageInputStream );
loadedMessageId = message.getMessageID();
raw_email_byte_stream = new ByteArrayOutputStream();
message.writeTo( raw_email_byte_stream );
messageBytes = raw_email_byte_stream.toByteArray();
messageReady=true;
}
catch( Exception x ){
throw new Exception( "Fehler beim Lesen der eMail. " + messageFile );
}
finally{
if (messageInputStream != null){
messageInputStream.close();
}
}
}
public void unloadMessage(){
messageReady = false;
loadedMessageId = "";
message=null;
}
//--------------------------------------------------------------------------------send
/**
* Nachricht versenden
*
* @throws java.lang.Exception
*/
public boolean send() throws Exception {
return sendJavaMail();
}
//--------------------------------------------------------------------------------send
/**
* Nachricht vorbereiten: Nicht senden
*
* @throws java.lang.Exception
*/
public boolean send(boolean send) throws Exception {
if (send){
return send();
}else{
return prepareJavaMail();
}
}
//--------------------------------------------------------------------------------sendJavaMail
/**
* Nachricht mit JavaMail-Funktionen versenden
*
* @throws java.lang.Exception
*/
private boolean sendJavaMail() throws Exception {
try {
prepareJavaMail();
String sTO = this.getRecipientsAsString();
String logMessage = SOSClassUtil.getMethodName() +
"-->" + "sending email:" +
" host:port=" + host + ":" + port +
" to=" + sTO;
String sCC = this.getCCsAsString();
if (!sCC.equals("")){
logMessage += " sCC=" + sCC;
}
String sBCC = this.getBCCsAsString();
if (!sBCC.equals("")){
logMessage += " sBCC=" + sBCC;
}
log(logMessage,SOSLogger.INFO);
log(SOSClassUtil.getMethodName() + "-->" + "Subject=" + this.subject,SOSLogger.DEBUG6);
log (SOSClassUtil.getMethodName() + "-->" + dumpHeaders(),SOSLogger.DEBUG6);
log (SOSClassUtil.getMethodName() + "-->" + dumpMessageAsString(false),SOSLogger.DEBUG9);
// --------------------------------------------------------------
if (!sendToOutputStream){
// Hier kann nicht die statische Methode Transport.send verwendet werden, da diese ein
// implizites saveChanges macht. Das f�hrt zu einer neuen Vergabe einer Message-Id, so dass diese
// m�glicherweise nicht mit der aus dumpMessageToFile �bereinstimmt.
Transport t = session.getTransport("smtp");
message.setSentDate(new Date());
System.setProperty("mail.smtp.port", this.port);
System.setProperty("mail.smtp.host", this.host);
if ( this.user.length()==0) {
t.connect();
}else {
t.connect(this.host,this.user,this.password);
}
t.sendMessage(message,message.getAllRecipients());
t.close();
raw_email_byte_stream = new ByteArrayOutputStream();
message.writeTo( raw_email_byte_stream );
messageBytes = raw_email_byte_stream.toByteArray();
changed = true;
}
// --------------------------------------------------------------
return true;
} catch (javax.mail.AuthenticationFailedException ee) {
this.lastError = "AuthenticationFailedException while connecting to " + host + ":" + port + " " + user + "/******** -->" + ee.getMessage() ;
try {
dumpMessageToFile(true);
}catch(Exception e) {log (SOSClassUtil.getMethodName() + ":" + e.getMessage(),SOSLogger.WARN); };
return false;
} catch (javax.mail.MessagingException e) {
// ist ein Fehler, bei dem es lohnt, zwischenzuspeichern?
if ((queueDir.length()>0 &&
e.getMessage().startsWith("Could not connect to SMTP host") ||
e.getMessage().startsWith("Unknown SMTP host") ||
e.getMessage().startsWith("Read timed out") ||
e.getMessage().startsWith("Exception reading response"))
){
this.lastError = e.getMessage() + " ==> "+ host + ":" + port + " " + user + "/********" ;
try {
dumpMessageToFile(true);
}catch(Exception ee) {log (SOSClassUtil.getMethodName() + ":" + e.getMessage(),SOSLogger.WARN); };
return false;
}else{
throw new Exception(
SOSClassUtil.getMethodName() + ": error occurred on send: " + e.toString() );
}
} catch (SocketTimeoutException e){
if (queueDir.length()>0 ){
this.lastError = e.getMessage() + " ==> "+ host + ":" + port + " " + user + "/********" ;
try {
dumpMessageToFile(true);
}catch(Exception ee) {log (SOSClassUtil.getMethodName() + ":" + e.getMessage(),SOSLogger.WARN); };
return false;
}else{
throw new Exception(
SOSClassUtil.getMethodName() + ": error occurred on send: " + e.toString() );
}
}
catch (Exception e) {
throw new Exception(
SOSClassUtil.getMethodName() + ": error occurred on send: " + e.toString() );
}
}
//--------------------------------------------------------------------------------haveAlternative
private boolean haveAlternative(){
return (!this.alternativeBody.equals("") && this.attachmentList.isEmpty());
}
//--------------------------------------------------------------------------------prepareJavaMail
/**
* Nachricht mit JavaMail-Funktionen versenden
*
* @throws java.lang.Exception
*/
protected boolean prepareJavaMail() throws Exception {
try {
if (messageReady ){
message.saveChanges();
return true;
}
if (!changed ){
return true;
}
changed = false;
if (this.getContentType().equals("text/html")) {
this.body = this.body.replaceAll("\\\\n", "<br>");
}else {
this.body = this.body.replaceAll("\\\\n", "\n");
}
String t = "";
if (this.toList.isEmpty()) {
throw new Exception(
SOSClassUtil.getMethodName() + ": no recipient specified.");
}
if (this.from == null || this.from.length() == 0) {
throw new Exception(
SOSClassUtil.getMethodName() + ": no sender specified.");
}
if ( this.fromName != null && this.fromName.length() > 0 ) {
message.setFrom( new InternetAddress(this.from, this.fromName) );
} else {
message.setFrom( new InternetAddress(this.from) );
}
message.setSentDate( new Date() );
if (this.replyTo != null && this.replyTo.length() > 0) {
InternetAddress fromAddrs[] = new InternetAddress[1];
fromAddrs[0] = new InternetAddress(this.replyTo);
message.setReplyTo( fromAddrs );
}
if (!this.toList.isEmpty()) {
InternetAddress toAddrs[] = new InternetAddress[toList.size()];
int i = 0;
for (ListIterator e = this.toList.listIterator(); e.hasNext();) {
t = e.next().toString();
toAddrs[i++] = new InternetAddress(t);
}
message.setRecipients(MimeMessage.RecipientType.TO, toAddrs );
}
// if (!this.ccList.isEmpty()) {
// Sonst wirkt clearReceipients nicht.
InternetAddress toAddrs[] = new InternetAddress[ccList.size()];
int i = 0;
for (ListIterator e = this.ccList.listIterator(); e.hasNext();) {
t = e.next().toString();
toAddrs[i++] = new InternetAddress(t);
}
message.setRecipients(MimeMessage.RecipientType.CC, toAddrs );
// }
// if (!this.bccList.isEmpty()) {
toAddrs = new InternetAddress[bccList.size()];
i = 0;
for (ListIterator e = this.bccList.listIterator(); e.hasNext(); ) {
t = e.next().toString();
toAddrs[i++] = new InternetAddress(t);
}
message.setRecipients(MimeMessage.RecipientType.BCC, toAddrs );
//}
if (this.subject != null) {
message.setSubject(this.subject);
}
// send the attachments
if (! this.attachmentList.isEmpty() || !this.alternativeBody.equals("")) {
// Multipart nur bei Attachments!
// send the body
MimeBodyPart bodypart = null;
MimeBodyPart alternativeBodypart = null;
MimeMultipart multipart = null;
if (this.haveAlternative()){
multipart = new MimeMultipart("alternative");
}else{
multipart = new MimeMultipart();
}
bodypart = new MimeBodyPart();
if (contentType.startsWith("text/")){
bodypart.setContent( this.body,this.contentType + ";charset= " + this.charset);
}else{
bodypart.setContent( this.body,this.contentType);
}
multipart.addBodyPart(bodypart);
// Alternativer Body gesetzt? Nur wenn keine Attachments vorhanden!!!
if (this.haveAlternative()){
alternativeBodypart = new MimeBodyPart();
if (contentType.startsWith("text/")){
alternativeBodypart.setContent( this.alternativeBody,this.alternativeContentType + ";charset= " + this.alternativeCharset);
}else{
alternativeBodypart.setContent( this.alternativeBody,this.alternativeContentType);
}
multipart.addBodyPart(alternativeBodypart);
}
message.setContent(multipart);
// Encoding nur f�r Bodypart setzen
bodypart.setHeader("Content-Transfer-Encoding", encoding);
if (alternativeBodypart != null) {
alternativeBodypart.setHeader("Content-Transfer-Encoding", alternativeEncoding);
}
for (Iterator iter = this.attachmentList.values().iterator(); iter.hasNext();) {
SOSMailAttachment attachment = (SOSMailAttachment) iter.next();
String content_type = attachment.getContentType();
if( content_type == null ) throw new Exception( "content_type ist null" );
log(SOSClassUtil.getMethodName() + "-->" + "Attachment=" + attachment.getFile(),SOSLogger.DEBUG6);
add_file( attachment );
}
}else{
message.setHeader("Content-Transfer-Encoding", encoding);
//Wenn content_type des body <> text_plain, dann content_type setzen
if (contentType.startsWith("text/")){
message.setContent( this.body,this.contentType + "; charset=" + this.charset);
}else{
message.setContent( this.body,this.contentType);
}
}
message.saveChanges();
closeAttachments();
return true;
} catch (Exception e) {
throw new Exception(
SOSClassUtil.getMethodName() + ": error occurred on send: " + e.toString() );
} finally {
}
}
//--------------------------------------------------------------------------------dumpHeaders
public String dumpHeaders() throws IOException, MessagingException{
String s = "";
for (Enumeration e = message.getAllHeaders(); e.hasMoreElements(); )
{ Header header = (Header) e.nextElement();
s += "\n" + header.getName() + ": " + header.getValue();
}
return s;
}
// --------------------------------------------------------------------------------messageRemoveAttachments
private ByteArrayOutputStream messageRemoveAttachments() throws Exception{
ByteArrayOutputStream raw_email_byte_stream_without_attachment = new ByteArrayOutputStream();
// Attachments entfernen
MimeMessage mm = new MimeMessage(message);
Object mmpo=mm.getContent();
if ( ( mmpo instanceof MimeMultipart ) ){
MimeMultipart mmp= (MimeMultipart) mmpo;
if (mm.isMimeType("text/plain")) {
} else if (mm.isMimeType("multipart/*")) {
mmp=(MimeMultipart)mm.getContent();
for (int i = 1; i < mmp.getCount(); i++) {
BodyPart part = mmp.getBodyPart(i);
mmp.removeBodyPart(i);
i--;
}
}
//
mm.setContent(mmp);
mm.saveChanges();
}
mm.writeTo(raw_email_byte_stream_without_attachment);
return raw_email_byte_stream_without_attachment;
}
//--------------------------------------------------------------------------------dumpMessageAsString
public String dumpMessageAsString() throws Exception{
return dumpMessageAsString(false);
}
//--------------------------------------------------------------------------------dumpMessageToFile
private void dumpMessageToFile(boolean withAttachment) throws Exception{
Date d = new Date();
StringBuffer bb = new StringBuffer();
SimpleDateFormat s = new SimpleDateFormat(queuePattern);
FieldPosition fp = new FieldPosition(0);
StringBuffer b = s.format(d,bb,fp);
lastGeneratedFileName = queueDir + "/" + queuePraefix + b + ".email";
File f = new File(lastGeneratedFileName);
while (f.exists()){
b = s.format(d,bb,fp);
lastGeneratedFileName = queueDir + "/" + queuePraefix + b + ".email";
f = new File(lastGeneratedFileName);
}
dumpMessageToFile(f, withAttachment);
}
//--------------------------------------------------------------------------------dumpMessageToFile
public void dumpMessageToFile(String filename, boolean withAttachment) throws Exception{
dumpMessageToFile(new File(filename), withAttachment);
}
//--------------------------------------------------------------------------------dumpMessageToFile
public void dumpMessageToFile(File file, boolean withAttachment) throws Exception{
try{
this.prepareJavaMail();
File myFile = new File(file.getAbsolutePath() + "~");
FileOutputStream out= new FileOutputStream(myFile, true);
out.write(dumpMessage(withAttachment));
out.close();
String newFilename = myFile.getAbsolutePath().substring(0,myFile.getAbsolutePath().length()-1);
File f = new File(newFilename);
f.delete();
myFile.renameTo(f);
}catch (Exception e){
throw new Exception(SOSClassUtil.getMethodName() + ": error occurred on dump: " + e.toString() );
}
}
//--------------------------------------------------------------------------------dumpMessageAsString
public String dumpMessageAsString(boolean withAttachment) throws Exception{
byte[] bytes;
ByteArrayOutputStream raw_email_byte_stream_without_attachment = null;
this.prepareJavaMail();
if (!withAttachment){
raw_email_byte_stream_without_attachment = messageRemoveAttachments();
}
raw_email_byte_stream = new ByteArrayOutputStream();
message.writeTo( raw_email_byte_stream );
if (withAttachment || raw_email_byte_stream_without_attachment==null ){
bytes = raw_email_byte_stream.toByteArray();
}else{
bytes = raw_email_byte_stream_without_attachment.toByteArray();
}
String s = new String (bytes);
return s;
}
public byte[] dumpMessage() throws Exception{
return dumpMessage(true);
}
//--------------------------------------------------------------------------------dumpMessage
public byte[] dumpMessage(boolean withAttachment) throws Exception{
byte[] bytes;
ByteArrayOutputStream raw_email_byte_stream_without_attachment = null;
this.prepareJavaMail();
if (!withAttachment){
raw_email_byte_stream_without_attachment = messageRemoveAttachments();
}
raw_email_byte_stream = new ByteArrayOutputStream();
message.writeTo( raw_email_byte_stream );
if (withAttachment || raw_email_byte_stream_without_attachment==null ){
bytes = raw_email_byte_stream.toByteArray();
}else{
bytes = raw_email_byte_stream_without_attachment.toByteArray();
}
return bytes;
}
//--------------------------------------------------------------------------------Getter/Setter
public LinkedList getRecipients(){
return toList;
}
// Liefert die Recipients aus dem Message-Objekt, wenn das Message-Objekt mit loadFile erzeugt wurde.
// Sonst werden die mit addRecipients hinzugef�gten Empf�nger geliefert.
public String getRecipientsAsString() throws MessagingException{
String s = " ";
if (messageReady){
Address[] addresses = message.getRecipients(MimeMessage.RecipientType.TO);
if (addresses != null){
for (int i = 0;i<addresses.length; i++) {
Address aktAddress = addresses[i];
s += aktAddress.toString() + ",";
}
}
}else{
for (Iterator i = this.toList.listIterator(); i.hasNext();) {
s += i.next() + ",";
}
}
return s.substring(0,s.length()-1).trim();
}
public LinkedList getCCs(){
return ccList;
}
// Liefert die Recipients aus dem Message-Objekt, wenn das Message-Objekt mit loadFile erzeugt wurde.
// Sonst werden die mit addRecipients hinzugef�gten Empf�nger geliefert.
public String getCCsAsString() throws MessagingException{
String s = " ";
if (messageReady){
Address[] addresses = message.getRecipients(MimeMessage.RecipientType.CC);
if (addresses != null){
for (int i = 0;i<addresses.length; i++) {
Address aktAddress = addresses[i];
s += aktAddress.toString() + ",";
}
}
}else{
for (Iterator i = this.ccList.listIterator(); i.hasNext();) {
s += i.next() + ",";
}
}
return s.substring(0,s.length()-1).trim();
}
public LinkedList getBCCs(){
return bccList;
}
// Liefert die Recipients aus dem Message-Objekt, wenn das Message-Objekt mit loadFile erzeugt wurde.
// Sonst werden die mit addRecipients hinzugef�gten Empf�nger geliefert.
public String getBCCsAsString() throws MessagingException{
String s = " ";
if (messageReady){
Address[] addresses = message.getRecipients(MimeMessage.RecipientType.BCC);
if (addresses != null){
for (int i = 0;i<addresses.length; i++) {
Address aktAddress = addresses[i];
s += aktAddress.toString() + ",";
}
}
}else{
for (Iterator i = this.bccList.listIterator(); i.hasNext();) {
s += i.next() + ",";
}
}
return s.substring(0,s.length()-1).trim();
}
/**
* setzt die eMail-Empf�nger zur�ck
*/
public void clearRecipients() throws Exception {
log(SOSClassUtil.getMethodName(),SOSLogger.DEBUG9);
this.toList.clear();
this.ccList.clear();
this.bccList.clear();
changed=true;
}
/**
* setzt die eMail-Attachments zur�ck
*/
public void clearAttachments() {
attachmentList.clear();
changed=true;
}
/**
* sendet eine Nachricht in den Ausgabestrom
* @param out Ausgabestrom
* @param s beliebige Zeichenfolge
*/
private void sendLine(BufferedReader in, BufferedWriter out, String s)
throws Exception {
try {
out.write(s + "\r\n");
out.flush();
s = in.readLine();
}
catch (Exception e) {
throw new Exception( SOSClassUtil.getMethodName() +
": error occurred on sendLine: " + e.toString() );
}
}
/**
* sendet eine Nachricht in den Ausgabestrom
* @param out Ausgabestrom
* @param s beliebige Zeichenfolge
*/
private void sendLine(BufferedWriter out, String s)
throws Exception {
try {
out.write(s + "\r\n");
out.flush();
}
catch (Exception e) {
throw new Exception( SOSClassUtil.getMethodName() +
": error occurred on sendLine: " + e.toString() );
}
}
/**
* liefert einen mit < und > quotierten String
* @param host Hostname bzw. IP-Adresse des Mail-Servers
*/
public String getQuotedName(String name) {
if ( name.indexOf('<') > -1 && name.indexOf('>') > -1 ) {
return name;
} else {
return '<' + name + '>';
}
}
/**
* setzt den Timeout fr den Verbindungsaufbau zum Mail-Server
* @param timeout fr Verbindungsaufbau zum Mail-Server (inaktiv)
*/
public void setTimeout(int timeout) throws Exception {
this.timeout = timeout;
this.initMessage();
}
/**
* liefert den Timeout fr den Verbindungsaufbau zum Mail-Server
*/
public int getTimeout() {
return this.timeout;
}
/**
* liefert die Sprache fr eMail-Mustertexte und Datums-/Zeitformate
*/
public String getLanguage() {
return this.language;
}
/**
* setzt die Sprache fr eMail-Mustertexte und Datums-/Zeitformate
* @param language Sprache fr eMail-Muster (en, de, default:de)
*/
public void setLanguage(String language) throws Exception {
this.language = language;
this.initLanguage();
}
/**
* liefert das Datumsformat fr Datumsersetzungen im Text der eMail
*/
public String getDateFormat() {
return this.dateFormat;
}
/**
* setzt das Datumsformat fr Datumsersetzungen im Text der eMail
* @param dateFormat Datumsformat, z.B. dd.MM.yyyy
*/
public void setDateFormat(String dateFormat) {
this.dateFormat = dateFormat;
}
/**
* liefert das Datums- und Zeitformat fr Datumsersetzungen im Text der eMail
*/
public String getDatetimeFormat() {
return this.datetimeFormat;
}
/**
* setzt das Datums- und Zeitformat fr Datumsersetzungen im Text der eMail
* @param datetimeFormat Datumsformat, z.B. dd.MM.yyyy HH:mm:ss
*/
public void setDatetimeFormat(String datetimeFormat) {
this.datetimeFormat = datetimeFormat;
}
/**
* setzt das Encoding der eMail
* @param encoding
*/
public void setEncoding(String encoding) {
this.encoding = encoding;
warn ("encoding",encoding);
changed=true;
}
/**
* liefert das Encoding der eMail
*/
public String getEncoding() {
return this.encoding;
}
/**
* setzt das Character-Set der eMail
* @param charset
*/
public void setCharset(String charset) {
this.charset = charset;
warn ("charset",charset);
changed=true;
}
/**
* liefert das Character-Set der eMail
*/
public String getCharset() {
return this.charset;
}
/**
* setzt den Content-Type der eMail
* @param contentType Content-Type der eMail
*/
public void setContentType(String contentType) {
this.contentType = contentType;
warn ("contentType",contentType);
changed=true;
}
/**
* liefert den Content-Type der eMail
*/
public String getContentType() {
return this.contentType;
}
/**
* setzt den Content-Type fr Attachments
* @param attachmentContentType Default fr Content-Type der Attachments
*/
public void setAttachmentContentType(String attachmentContentType) {
this.attachmentContentType = attachmentContentType;
warn ("attachmentContentType",attachmentContentType);
changed=true;
}
/**
* liefert den Content-Type fr Attachments
*/
public String getAttachmentContentType() {
return this.attachmentContentType;
}
/**
* @return Returns the host.
*/
public String getHost() {
return host;
}
/**
* @return Returns the port.
*/
public String getPort() {
return port;
}
/**
* setzt den Namen des Verzeichnisses f�r zwischengespeicherte eMails
* @param queueDir String Verzeichnis zum Zwischenspeichern von eMails
*/
public void setQueueDir(String queueDir) {
this.queueDir = queueDir;
}
/**
* liefert den Namen des Verzeichnisses f�r zwischengespeicherte eMails
*/
public String getQueueDir() {
return this.queueDir;
}
/**
* setzt den Inhalt des Betreffs
* @param subject Betreff
*/
public void setSubject(String subject) {
this.subject = subject;
warn ("subject",subject);
changed=true;
}
/**
* liefert den Inhalt des Betreffs
*/
public String getSubject() {
return this.subject;
}
/**
* setzt die eMail-Adresse des Absenders
* @param from Absender der eMail
*/
public void setFrom(String from) {
this.from = from;
warn ("from",from);
changed=true;
}
/**
* liefert die eMail-Adresse des Absenders
*/
public String getFrom() {
return this.from;
}
/**
* liefert den Namen des Absenders
*/
public String getFromName() {
return this.fromName;
}
/**
* setzt den Namen des Absenders
* @param fromName Absender der eMail
*/
public void setFromName(String fromName) {
this.fromName = fromName;
warn ("fromName",fromName);
changed=true;
}
/**
* setzt die eMail-Adresse f�r R�ckantworten
* @param replyTo Empf�nger f�r R�ckantworten
*/
public void setReplyTo(String replyTo) {
this.replyTo = replyTo;
warn ("replyTo",replyTo);
changed=true;
}
/**
* liefert die eMail-Adresse f�r R�ckantworten
*/
public String getReplyTo() {
return this.replyTo;
}
public void setBody(String body) {
this.body = body;
warn ("body",body);
changed=true;
}
/**
* liefert den Inhalt des eMail-Texts
*/
public String getBody() {
return this.body;
}
/**
* setzt den Namen der Applikation fr eMail-Einstellungen in der Tabelle der Einstellungen
* @param applicationMail Name der Applikation fr eMail-Einstellungen in der Einstellungstabelle
*/
public void setApplicationMail(String applicationMail) {
this.applicationMail = applicationMail;
}
/**
* liefert den Namen der Applikation fr eMail-Einstellungen in der Tabelle der Einstellungen
*/
public String getApplicationMail() {
return this.applicationMail;
}
/**
* setzt den Namen der Sektion fr eMail-Einstellungen in der Tabelle der Einstellungen
* @param sectionMail Name der Sektion fr eMail-Einstellungen in der Einstellungstabelle
*/
public void setSectionMail(String sectionMail) {
this.sectionMail = sectionMail;
}
/**
* liefert den Namen der Sektion fr eMail-Einstellungen in der Tabelle der Einstellungen
*/
public String getSectionMail() {
return this.sectionMail;
}
/**
* setzt den Namen der Applikation fr Mustertexte in der Tabelle der Einstellungen
* @param applicationMailTemplates Name der Applikation fr eMail-Muster in der Einstellungstabelle
*/
public void setApplicationMailTemplates(String applicationMailTemplates) {
this.applicationMailTemplates = applicationMailTemplates;
}
/**
* liefert den Namen der Applikation fr Mustertexte in der Tabelle der Einstellungen
*/
public String getApplicationMailTemplates() {
return this.applicationMailTemplates;
}
/**
* setzt den Namen der Applikation fr eMail Vorlagen der Factory in der Tabelle der Einstellungen
* @param applicationMailTemplates Name der Applikation fr eMail Vorlagen der Factory in der Einstellungstabelle
*/
public void setApplicationMailTemplatesFactory(String applicationMailTemplates) {
this.applicationMailTemplatesFactory = applicationMailTemplates;
}
/**
* liefert den Namen der Applikation f�r eMail Vorlagen der Factory in der Tabelle der Einstellungen
*/
public String getApplicationMailTemplatesFactory() {
return this.applicationMailTemplatesFactory;
}
/**
* setzt den Namen der Sektion fr Mustertexte in der Tabelle der Einstellungen
* @param sectionMailTemplates Name der Sektion fr eMail-Muster in der Einstellungstabelle
*/
public void setSectionMailTemplates(String sectionMailTemplates) {
this.sectionMailTemplates = sectionMailTemplates;
}
/**
* liefert den Namen der Sektion fr Mustertexte in der Tabelle der Einstellungen
*/
public String getSectionMailTemplates() {
return this.sectionMailTemplates;
}
/**
* setzt den Namen der Sektion f�r eMail Vorlagen der Factory in der Tabelle der Einstellungen
* @param sectionMailTemplates Name der Sektion f�r eMail Vorlagen der Factory in der Einstellungstabelle
*/
public void setSectionMailTemplatesFactory(String sectionMailTemplatesFactory) {
this.sectionMailTemplatesFactory = sectionMailTemplatesFactory;
}
/**
* liefert den Namen der Sektion f�r eMail Vorlagen der Factory in der Tabelle der Einstellungen
*/
public String getSectionMailTemplatesFactory() {
return this.sectionMailTemplatesFactory;
}
/**
* setzt den Namen der Sektion f�r Scripte in der Tabelle der Einstellungen
* @param sectionMailTemplates Name der Sektion f�r eMail-Scripte in der Einstellungstabelle
*/
public void setSectionMailScripts(String sectionMailScripts) {
this.sectionMailScripts = sectionMailScripts;
}
/**
* liefert den Namen der Sektion f�r eMail Scripte in der Tabelle der Einstellungen
*/
public String getSectionMailScripts() {
return this.sectionMailScripts;
}
/**
* setzt den Namen der Applikation f�r Scripte in der Tabelle der Einstellungen
* @param sectionMailTemplates Name der Applikation f�r eMail-Scripte in der Einstellungstabelle
*/
public void setApplicationMailScripts(String applicationMailScripts) {
this.applicationMailScripts = applicationMailScripts;
}
/**
* liefert den Namen der Applikation f�r eMail Scripte in der Tabelle der Einstellungen
*/
public String getApplicationMailScripts() {
return this.applicationMailScripts;
}
/**
* liefert den Namen der Tabelle mit Einstellungen
* @param tableSettings
*/
public void setTableSettings(String tableSettings) {
this.tableSettings = tableSettings;
}
/**
* liefert den Namen der Tabelle mit Einstellungen
*/
public String getTableSettings() {
return this.tableSettings;
}
/**
* @return Returns the messageBytes.
*/
public byte[] getMessageBytes() {
return messageBytes;
}
/**
* Email nicht senden sondern als bytes [] verf�gbar machen (message_bytes)
* @param sendToOutputStream The sendToOutputStream to set.
*/
public void setSendToOutputStream(boolean sendToOutputStream) {
this.sendToOutputStream = sendToOutputStream;
}
/**
* @param attachmentEncoding The attachmentEncoding to set.
*/
public void setattachmentEncoding(String attachmentEncoding) {
this.attachmentEncoding = attachmentEncoding;
warn ("attachmentEncoding",attachmentEncoding);
changed=true;
}
/**
* @return Returns the message.
*/
public MimeMessage getMessage() {
return message;
}
/**
* @return Returns the lastError.
*/
public String getLastError() {
return lastError;
}
/**
* @return Returns the attachmentEncoding.
*/
public String getAttachmentEncoding() {
return attachmentEncoding;
}
/**
* @return Returns the attachmentCharset.
*/
public String getAttachmentCharset() {
return attachmentCharset;
}
/**
* @param attachmentCharset The attachmentCharset to set.
*/
public void setAttachmentCharset(String attachmentCharset) {
this.attachmentCharset = attachmentCharset;
warn ("attachmentCharset",attachmentCharset);
changed=true;
}
/**
* @param attachmentEncoding The attachmentEncoding to set.
*/
public void setAttachmentEncoding(String attachmentEncoding) {
this.attachmentEncoding = attachmentEncoding;
warn ("attachmentEncoding",attachmentEncoding);
changed=true;
}
public void setHost(String host) throws Exception {
this.host = host;
this.initMessage();
}
public void setPassword(String password) throws Exception {
this.password = password;
this.initMessage();
}
public void setUser(String user) throws Exception {
this.user = user;
this.initMessage();
}
public void setPort(String port) throws Exception {
this.port = port;
this.initMessage();
}
public void setPriorityHighest() throws MessagingException{
message.setHeader("Priority","urgent");
message.setHeader("X-Priority","1 (Highest)");
message.setHeader("X-MSMail-Priority","Highest");
changed=true;
}
public void setPriorityHigh() throws MessagingException{
message.setHeader("Priority","urgent");
message.setHeader("X-Priority","2 (High)");
message.setHeader("X-MSMail-Priority","Highest");
changed=true;
}
public void setPriorityNormal() throws MessagingException{
message.setHeader("Priority","normal");
message.setHeader("X-Priority","3 (Normal)");
message.setHeader("X-MSMail-Priority","Normal");
changed=true;
}
public void setPriorityLow() throws MessagingException{
message.setHeader("Priority","non-urgent");
message.setHeader("X-Priority","4 (Low)");
message.setHeader("X-MSMail-Priority","Low");
changed=true;
}
public void setPriorityLowest() throws MessagingException{
message.setHeader("Priority","non-urgent");
message.setHeader("X-Priority","5 (Lowest)");
message.setHeader("X-MSMail-Priority","Low");
changed=true;
}
public void setAlternativeBody(String alternativeBody) {
this.alternativeBody = alternativeBody;
}
public void setAlternativeCharset(String alternativeCharset) {
this.alternativeCharset = alternativeCharset;
}
public void setAlternativeContentType(String alternativeContentType) {
this.alternativeContentType = alternativeContentType;
}
public String getQueuePraefix() {
return queuePraefix;
}
public String getLastGeneratedFileName() {
return lastGeneratedFileName;
}
public void setQueuePraefix(String queuePraefix) {
this.queuePraefix = queuePraefix;
}
public String getLoadedMessageId() {
return loadedMessageId;
}
/**
* @param sosLogger The sosLogger to set.
*/
public void setSOSLogger(SOSLogger sosLogger) {
this.sosLogger = sosLogger;
}
private void warn(String n,String v) {
if (this.messageReady){
try {
log("...setting of " + n+"="+v + " will not be used. Loaded Message will be sent unchanged.", SOSStandardLogger.WARN);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* Nachricht mit nativen Mail-Funktionen versenden
*
* @throws java.lang.Exception
* @deprecated Not further supported
*/
public String sendNative() throws Exception {
Socket socket = null;
String boundary = "DataSeparatorString";
StringBuffer sb = new StringBuffer("");
try {
if (this.host == null || this.host.length() == 0) {
throw new Exception(
SOSClassUtil.getMethodName() + ": host has no value.");
}
if (this.port == null || this.port.length() == 0) {
throw new Exception(
SOSClassUtil.getMethodName() + ": port has no value.");
}
if (this.toList.isEmpty()) {
throw new Exception(
SOSClassUtil.getMethodName() + ": no recipient specified.");
}
if (this.from == null || this.from.length() == 0) {
throw new Exception(
SOSClassUtil.getMethodName() + ": no sender specified.");
}
socket = new Socket(this.host, Integer.parseInt(this.port));
BufferedReader in = new BufferedReader
(new InputStreamReader(socket.getInputStream(), "8859_1"));
BufferedWriter out = new BufferedWriter
(new OutputStreamWriter(socket.getOutputStream(), "8859_1"));
sendLine(in, out, "HELO " + this.host);
if ( this.fromName != null && this.fromName.length() > 0
&& this.from != null && this.from.length() > 0 ) {
sendLine(in, out, "MAIL FROM: " + this.fromName + getQuotedName(this.from));
} else if ( this.from != null && this.from.length() > 0 ){
sendLine(in, out, "MAIL FROM: " + getQuotedName(this.from));
}
// if (!this.toList.isEmpty()) {
// for (Enumeration e = this.toList.elements(); e.hasMoreElements();) {
// sendLine(in, out, "RCPT TO: " + getQuotedName(e.nextElement().toString()) );
// }
// }
sendLine(in, out, "DATA");
sendLine(out, "MIME-Version: 1.0");
if ( this.fromName != null && this.fromName.length() > 0
&& this.from != null && this.from.length() > 0 ) {
sendLine(out, "From: " + this.fromName + getQuotedName(this.from));
} else if ( this.from != null && this.from.length() > 0 ){
sendLine(out, "From: " + getQuotedName(this.from));
}
if (this.replyTo != null && this.replyTo.length() > 0) {
sendLine(out, "Reply-To: " + getQuotedName(this.replyTo));
}
if (!this.toList.isEmpty()) {
sb = new StringBuffer("");
for (ListIterator e = this.toList.listIterator(); e.hasNext();) {
sb.append(getQuotedName(e.next().toString()));
if (e.hasNext()) {
sb.append(",");
}
}
sendLine(out, "To: " + sb);
}
if (!this.ccList.isEmpty()) {
sb = new StringBuffer("");
for (ListIterator e = this.ccList.listIterator(); e.hasNext();) {
sb.append(getQuotedName(e.next().toString()));
if (e.hasNext()) {
sb.append(",");
}
}
sendLine(out, "Cc: " + sb);
}
if (!this.bccList.isEmpty()) {
sb = new StringBuffer("");
for (ListIterator e = this.bccList.listIterator(); e.hasNext(); ) {
sb.append(getQuotedName(e.next().toString()));
if (e.hasNext()) {
sb.append(",");
}
}
sendLine(out, "Bcc: " + sb);
}
if (this.subject != null) {
sendLine(out, "Subject: " + this.subject);
}
sendLine(out, "Content-Type: multipart/mixed; boundary=\"" + boundary + "\"");
sendLine(out, "\r\n--" + boundary);
// send the body
if (this.contentType != null && this.contentType.length() > 0) {
sendLine(out, "Content-Type: text/html; charset=\"" + this.charset + "\"");
}
if (this.encoding != null) {
sendLine(out, "Content-Transfer-Encoding: " + this.encoding);
}
sendLine(out, "\r\n" + this.body + "\r\n\r\n");
// send the attachments
if (!this.attachmentList.isEmpty()) {
for (Iterator i = this.attachmentList.values().iterator();
i.hasNext();
) {
String[] attachment = new String[2];
attachment = (String[]) i.next();
sendLine(out, "\r\n--" + boundary );
sendLine(out, "Content-Type: " + attachment[1] + "; name=\"" + new File(attachment[0]).getName() + "\"");
sendLine(out, "Content-Disposition: attachment; filename=\"" + attachment[0] + "\"");
sendLine(out, "Content-Transfer-Encoding: " + this.attachmentEncoding + "\r\n");
SOSMimeBase64.encode(attachment[0], out);
}
}
sendLine(out, "\r\n\r\n--" + boundary + "--\r\n");
sendLine(in, out, ".");
sendLine(in, out, "QUIT");
} catch (Exception e) {
throw new Exception(
SOSClassUtil.getMethodName() + ": error occurred on send: " + e.toString() );
} finally {
if ( socket != null ) { socket.close(); }
}
return sb.toString();
}
/**
* Nachricht versenden mit hostWare
*
* @deprecated Not further supported
* @throws java.lang.Exception
*/
public String sendHostware() throws Exception {
sos.hostware.File file = new sos.hostware.File();
StringBuffer sb;
try {
sb = new StringBuffer("-out mail ");
if (this.host != null && this.port != null) {
sb.append("-smtp=" + this.host + ":" + this.port + " ");
} else if (this.host != null) {
sb.append("-smtp=" + this.host + " ");
}
if ( this.fromName != null && this.fromName.length() > 0
&& this.from != null && this.from.length() > 0 ) {
sb.append("-from='" + this.fromName + "<" + this.from + ">' ");
} else if ( this.from != null && this.from.length() > 0 ){
sb.append("-from='" + this.from + "' ");
}
if (!this.toList.isEmpty()) {
sb.append("-to='");
for (ListIterator e = this.toList.listIterator();
e.hasNext();
) {
sb.append(e.next());
if (e.hasNext()) {
sb.append(",");
}
}
sb.append("' ");
}
if (!this.ccList.isEmpty()) {
sb.append("-cc='");
for (ListIterator e = this.ccList.listIterator();
e.hasNext();
) {
sb.append(e.next());
if (e.hasNext()) {
sb.append(",");
}
}
sb.append("' ");
}
if (!this.bccList.isEmpty()) {
sb.append("-bcc='");
for (ListIterator e = this.bccList.listIterator();
e.hasNext();
) {
sb.append(e.next());
if (e.hasNext()) {
sb.append(",");
}
}
sb.append("' ");
}
if (this.replyTo != null) {
sb.append("-reply-to='" + this.replyTo + "' ");
}
if (this.subject != null) {
sb.append("-subject='" + this.subject + "' ");
}
if (this.filename != null) {
sb.append("-filename='" + this.filename + "' ");
}
if (this.encoding != null) {
sb.append("-encoding='" + this.encoding + "' ");
}
// not supported
if (this.contentType != null && this.attachmentList.isEmpty()) {
sb.append("-content-type='" + this.contentType + "' ");
}
// if (this.autoDequeue ) {
// automatic dequeueing not supported
// sb.append("-dequeue-mail ");
// }
if (this.queueDir != null) {
sb.append("-queue-dir='" + this.queueDir + "' ");
}
if (!this.attachmentList.isEmpty()) {
for (Iterator i = this.attachmentList.values().iterator();
i.hasNext();
) {
String[] attachment = new String[2];
attachment = (String[]) i.next();
sb.append(
"-attach='(-content-type="
+ attachment[1]
+ " "
+ attachment[0]
+ ")' ");
}
}
file.open(sb.toString());
file.put_line(this.body);
file.close();
} catch (Exception e) {
throw new Exception(
SOSClassUtil.getMethodName() + ": error occurred on send: " + e.toString() );
} finally {
if (file != null)
file.destruct();
}
return sb.toString();
}
public static void main(String[] args) throws Exception {
// SOSMail sosMail = new SOSMail("dod.sos","25","sos","sos");
SOSMail sosMail = new SOSMail("smtp.sos");
sosMail.setPriorityLowest();
sosMail.setQueueDir("c:/");
sosMail.setFrom("xyz@sos-berlin.com");
// sosMail.setContentType("text/plain");
sosMail.setEncoding("8bit");
sosMail.setattachmentEncoding("Base64");
//sosMail.addRecipient("xyz@sos-berlin.com");
// sosMail.setCharset("us-ascii");
sosMail.setSubject("Betreff");
sosMail.setReplyTo("xyz@sos-berlin.com");
String s = "Hello\\nWorld";
sosMail.setBody(s);
sosMail.addRecipient("xyz@sos-berlin.com");
//sosMail.addAttachment("c:\\windows\\sos.ini");
// sosMail.setAlternativeBody("Nachricht2");
// sosMail.dumpMessageToFile(new File("c:/3.msg"),true);
SOSStandardLogger sosLogger = new SOSStandardLogger(SOSStandardLogger.DEBUG9);
sosMail.setSOSLogger(sosLogger);
sosMail.setPriorityLowest();
//sosMail.getMessage().setHeader("Return-Path","<>");
//sosMail.getMessage().setHeader("X-SOSMAIL-delivery-counter","1");
if (!sosMail.send()){
sosMail.log(SOSClassUtil.getMethodName() + "-->" + sosMail.getLastError(),SOSLogger.WARN);
}else{
//sosMail.dumpMessageToFile(new File("c:/4.msg"),false);
//sosMail.log("==>Original-Message-id Vergleiche 4.msg:" + sosMail.getMessage().getMessageID(),SOSStandardLogger.INFO);
}
sosMail.clearRecipients();
}
}