Autor Thema: Neuling: Email mit MimeEntity mit Gif von URL  (Gelesen 12201 mal)

Offline endiAN

  • Frischling
  • *
  • Beiträge: 35
Neuling: Email mit MimeEntity mit Gif von URL
« am: 28.06.11 - 16:46:40 »
Hallo,

kennt jemand eine Lösung für folgendes Problem:

Ich versuche eine Email zu erstellen, die ein Bild enthält, das zuvor von einer URL geladen wurde.
Wenn ich das von URL geladene Image auf Platte speichere, kann ich mir das Bild per z.B. Paint anschauen. Also ist das Laden von URL in Ordnung. Wenn ich das Bild von Platte hole und in das document einfüge, sieht es auch bestens aus. Nur wenn ich das Bild von URL hole und in das document als MIMEEntity einfüge, bleibt es unsichtbar.

Was kann ich tun?

Danke für jede Hilfe im voraus.


Grüße

Andreas

PS: Hier der Code:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
import java.util.ArrayList;

import javax.imageio.ImageIO;

import com.ibm.jvm.util.ByteArrayOutputStream;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

import java.awt.image.BufferedImage;


import lotus.domino.*;

public class JavaAgent extends AgentBase {

    public void NotesMain() {

      try {
            Session session = getSession();
            AgentContext agentContext = session.getAgentContext();

             // (Your code goes here)
          
           Agent agent = agentContext.getCurrentAgent();
           Database db = agentContext.getCurrentDatabase();
             
          System.out.println("agent.getParameterDocID()..." + agent.getParameterDocID());
            
           Document doc = db.getDocumentByID(agent.getParameterDocID());
          System.out.println("doc.NoteID..." + doc.getNoteID());
            
          String noteID = agent.getParameterDocID();

         String docid = doc.getUniversalID();
         String inputLine, inputLine2, pdfExtension = ".pdf", inputLine3;

         
         Document memo = db.createDocument();
          Stream stream = session.createStream();
          session.setConvertMIME(false); // Do not convert MIME to RT
          memo.replaceItemValue("Form", "Memo");
          MIMEEntity body = memo.createMIMEEntity();
          MIMEHeader header = body.createHeader("Subject");
          header.setHeaderVal("MIME message");
          header = body.createHeader("To");
          header.setHeaderVal("User/Firma");
         
         List<String> list = new ArrayList<String>();
         List<MIMEEntity> meList = new ArrayList<MIMEEntity>();
         
         // Die Liste wird gefüllt, hab ich jetzt aber mal weggelassen wegen des Überblicks...
         
            notesURL = list.get(0);

/*
             // das funktioniert mit Bild von Platte
               if(stream.open("c:\\programme\\ibm\\lotus\\notes\\data\\Bild.gif", "binary"))
               {
                   if (stream.getBytes() != 0)
                   {
                     meList.add(body.createChildEntity());
                   }
                   else System.out.println("c:\\lotus\\notes\\data\\folder.gif has no content");
               }
               else System.out.println("Error opening c:\\lotus\\notes\\data\\folder.gif");
*/               

            //Bild einlesen über ImageIO

            url = new URL(notesURL);

            BufferedImage bufferedImage = ImageIO.read(url);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos);
            encoder.encode(bufferedImage);
            byte [] imageData = baos.toByteArray();
//            stream.open("c:\\programme\\ibm\\lotus\\notes\\data\\Bild2.gif", "binary");
            stream.write(imageData);
            
            meList.add(body.createChildEntity());
             meList.get(0).setContentFromBytes(stream, "image/gif", MIMEEntity.ENC_IDENTITY_BINARY);

         
//         stream.truncate();
           stream.close();
         
         session.setConvertMIME(true); // Restore conversion
         
         memo.send(false, "user/firma");//session.getUserName());
         

      }
      catch(Exception e)
      {
          e.printStackTrace();
      }
   }
}
« Letzte Änderung: 28.06.11 - 16:55:18 von endiAN »

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Neuling: Email mit MimeEntity mit Gif von URL
« Antwort #1 am: 28.06.11 - 20:48:46 »
Hallo, für einen Neuling ist das schwierig.
aber du musst 'einfach' ein mimeentity vom typ multipart/related erzeugen. dann als child-mime ein multipart/alternative und ein image/gif. welches die Daten des Bild enthält.

Das multipart/alternative muss wiederrum ein text/plain und text/html als child enthalten.
Am Besten ist du schaust dir mal ein paar emails aus Newslettern mit eingebetteten Bildern an, wie die das gemacht haben. Schau auch mal in ein paar Beiträgen von mir. Hab schon ein paar mal was erklärt zu mime-items

Gruß
Roland

edit: folgender link sollte dich weiter bringen: http://atnotes.de/index.php/topic,43563.msg280564/topicseen.html#msg280564
« Letzte Änderung: 28.06.11 - 20:58:15 von pram »
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline endiAN

  • Frischling
  • *
  • Beiträge: 35
Re: Neuling: Email mit MimeEntity mit Gif von URL
« Antwort #2 am: 29.06.11 - 11:19:22 »
Hallo Roland,

vielen Dank für Deine Hilfe. Der Link zu Deinem Posting ist wirklich interessant.

Habe mir meinen Code nochmal angeschaut. Habe mir überlegt, daß das Bild auf dem Server ein GIF ist, wenn ich es dann einlese und mit JPEGImageEncode encode wird es wohl zum JPG. Habe dann den MimeTyp auf image/jpeg geändert und dann ging es plötzlich.

Wenn ich ehrlich bin, den Code habe ich mir aus verschiedenen Snippets per Google zusammengesucht. Was genau dahinter steckt, erschließt sich mir erst nach und nach. Ich habe aber auch das Gefühl, daß der Einstieg hier nicht ganz einfach ist. Deswegen das Neuling im Betreff.

Nochmals vielen Dank.


Grüße


Andreas

Offline endiAN

  • Frischling
  • *
  • Beiträge: 35
Re: Neuling: Email mit MimeEntity mit Gif von URL
« Antwort #3 am: 29.06.11 - 17:12:39 »
Hallo,

hat jemand vielleicht noch zu obigem Script eine Idee zu folgendem Problem:

Wenn ich vor das Bild eine Html-Seite einfüge, verliert der Text in der Html-Seite seine Formatierung. Fetter Text ist dünn und klein, zentriertes ist plötzlich rechtsbündig... Wenn ich das Bild nicht einfüge, wird auch die Html-Seite wieder richtig formatiert.

Danke für jeden Hinweis.


Grüße

Andreas

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Neuling: Email mit MimeEntity mit Gif von URL
« Antwort #4 am: 29.06.11 - 17:45:38 »
Ich denke du erzeugst ein kaputtes MIME mit dem der Mailclient nichts anfangen kann

aktuell erzeugst du nur einen Kindknoten vom Typ "image/gif" an deinem Root-Item (dessen Typ nicht gesetzt ist)

Ich kann nur empfehlen, dich relativ GENAU an die Struktur zu halten, wie ich es in dem Link beschrieben habe. (ich möcht zwar auch nicht behaupten dass meins 100%ig richtig ist und es nicht auch anders geht, aber bei mir funktioniert es nun nach mehreren Wochen rumprobieren) Es gibt zahlreiche Fallstricke:

- Lässt du z.B. den Text "This is a multipart message in MIME format." im Root-Mime weg, weigern sich einige Email-Clients das korrekt anzuzeigen.
- Gibt es nur einen text/html und keinen text/plain kann man das Dokument im Web nicht bearbeiten, auch mein GMX-Webmailer präsentiert mir eine leere Mail.
- Vergisst man das doc.closeMimeentities (und das hast du vergessen) so führt das (in Lotusscript zumindest) irgendwann zum Absturz des Clients/Servers
- Macht man andere Fehler bekommt man oft Dokumente die man nicht mehr bearbeiten oder löschen kann (Fehler: No Mime data / unexpected MIME error)

Weitere Fettnäppfchen
- Man sollte auch nicht versuchen 2 MIME items in einem Dokument gleichzeitig zu bearbeiten
- Man kann MIME-Items sehr schwer von einem Dok in ein anderes Dok kopieren (item.copyToDocument tut es nicht)
- Irgendwann wirst du auch rote Kästchen im Notesclient und die Meldung "Cannot Save Bitmap to Disk" bekommen. Letztere tritt aber nur dann auf, wenn sich das Body-Item in einer Tabelle (oder Teilmaske, weiß ich nicht mehr genau) befindet
- und noch 1000 andere Sachen über die ich mich bereits geärgert habe...

Inzwischen hab ich aber eine eine LS-Lösung die ziemlich gut funktioniert.

Gruß
Roland

p.S. Obiger Code ist sehr schwer zu lesen, bitte mache dir nächstes mal die Mühe, beschränke den Code auf das Wesentliche (die ganzen Imports weg), entferne ggf unnütze Kommentare und stell den code in einen
Code
Code-Abschnitt
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline endiAN

  • Frischling
  • *
  • Beiträge: 35
Re: Neuling: Email mit MimeEntity mit Gif von URL
« Antwort #5 am: 29.06.11 - 21:17:24 »
Hallo Roland,

danke für Deine Antwort. Am Ende des Postings erst mal der aktuelle Code. Hoffe, daß es diesesmal übersichtlicher ist. Was mich ja davon abgehalten hat, das rootMime mit Text zu füllen, ist folgender Satz aus der Hilfe bei MimeEntity:

"The parent entity should contain no content. Any content is lost."

Das würde ich übersetzen mit: Schreib da nix rein. Hat keinen Sinn. Hab dann versucht über createHeader den Header Content-Type im rootMime zu erzeugen und multipart/related zu setzen. Hat aber irgendwie gar nix bewegt...

Die Struktur müßte jetzt sein

+ rootMime
 + HtmlMime
 + Image

Grüße

Andreas

Code
		    Stream stream = session.createStream();
		    Stream imageStream = session.createStream();
		    session.setConvertMIME(false); // Do not convert MIME to RT
		    memo.replaceItemValue("Form", "Memo");
		    MIMEEntity body = memo.createMIMEEntity();
		    stream.writeText("...");
		    body.setContentFromText(stream, "multipart/related", MIMEEntity.ENC_NONE);
		    stream.truncate();
		    MIMEHeader header = body.createHeader("Subject");
		    header.setHeaderVal("MIME message");
		    header = body.createHeader("To");
		    header.setHeaderVal("user/firma");
//		    header = body.createHeader("Content-Type");
//		    header.setHeaderVal("multipart/related");
			
			List<String> list = new ArrayList<String>();
			List<MIMEEntity> meList = new ArrayList<MIMEEntity>();

			URL url = new URL(notesURL);
			BufferedReader in = new BufferedReader(	new InputStreamReader( url.openStream()));
			
			int counter = 1;
			
			while ((inputLine = in.readLine()) != null)
			{
				if(inputLine.length()>0){
				    stream.writeText(inputLine + "\n");
				}
				counter++;
			}

			meList.add(body.createChildEntity());
		    meList.get(0).setContentFromText(stream,"text/html; charset=windows-1255", MIMEEntity.ENC_NONE);

			
		    stream.truncate();

			in.close();
			
			url = new URL(notesURL);

			BufferedReader in2 = new BufferedReader(new InputStreamReader(url.openStream()));

			counter = 1;
			
			// hier wird die Liste gefüllt...			

			int counter3 = 0;

			while(counter3 < list.size())
			{
				notesURL = list.get(counter3);

				url = new URL(notesURL);

				BufferedImage bufferedImage = ImageIO.read(url);
				ByteArrayOutputStream baos = new ByteArrayOutputStream();
				JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos);
				encoder.encode(bufferedImage);
				byte [] imageData = baos.toByteArray();
				imageStream.write(imageData);
				
				meList.add(body.createChildEntity());
			    meList.get(meList.size()-1).setContentFromBytes(imageStream, "image/jpeg", MIMEEntity.ENC_IDENTITY_BINARY);
		        imageStream.truncate();

			    counter3++;
			}

			stream.truncate();
	        stream.close();
	        imageStream.close();
			
			session.setConvertMIME(true); // Restore conversion
			
			memo.send(false, "user/firma");
			

Offline endiAN

  • Frischling
  • *
  • Beiträge: 35
Re: Neuling: Email mit MimeEntity mit Gif von URL
« Antwort #6 am: 29.06.11 - 21:25:54 »
Hallo,

ist hier schon mal jemandem aufgefallen, daß beim Schreiben von Antworten bei viel Text nach jedem Buchstaben die Text-Box refreshed wird. Es wird wieder der obere Teil des eingegebenen Textes angezeigt. Man muß dann wieder nach unten Scrollen, um den nächsten Buchstaben beim Eingeben beobachten zu können. Der Cursor bleibt korrekt am Ende des Textes. Benutze IE8. Bei Firefox funktioniert es bestimmt.

Andreas

Offline endiAN

  • Frischling
  • *
  • Beiträge: 35
Re: Neuling: Email mit MimeEntity mit Gif von URL
« Antwort #7 am: 29.06.11 - 21:32:12 »
Ja, stimmt. Firefox funktioniert einwandfrei.

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Neuling: Email mit MimeEntity mit Gif von URL
« Antwort #8 am: 29.06.11 - 22:07:39 »
Hallo Andreas,

es ist schon eine Weile her, aber ich kann mich noch dunkel daran erinnern, dass es bei bestimmten Mailern ein Problem gab, wenn das Root-Mime leer war. Hab dann in ein paar PHP-Skripts und auch hier http://en.wikipedia.org/wiki/MIME gefunden dass die "This is a multipart message in MIME format." hinein schreiben. Die Zeilen
Code
MIMEHeader header = body.createHeader("Subject");
header.setHeaderVal("MIME message");
header = body.createHeader("To");
header.setHeaderVal("user/firma");
// header = body.createHeader("Content-Type");
// header.setHeaderVal("multipart/related");
würde ich mir schenken. Das Subject kann man viel einfacher mit doc.replaceItemValue("Subject") setzen und der Empfänger wird im sendTo übergeben.

ACHTUNG Fettnäppfchen:
zwischen einem doc.createMimeEntity und doc.CloseMimeEntities (was ich in deinem Code immer noch vermisse) darf nicht anderweitig auf das Dokument zugegriffen werden, führt zu Abstürzen.
(Steht auch hier in der Hilfe: http://www-12.lotus.com/ldd/doc/domino_notes/rnext/help6_designer.nsf/f4b82fbb75e942a6852566ac0037f284/c0f8d36b751bff4385256c54004dc1c4?OpenDocument)

Du erzeugst weiterhin ein "multipart/related", hast aber keine ContentIDs (sollte aber auch nicht schlimm sein) Diese braucht man, damit die Bilder an entsprechender Stelle im HTML erscheinen.
Ein "multipart/alternative" fehlt auch noch. Ich denke ich schreib mal einen Best-practice Artikel über MIME-Items

ansonsten kann ich keine allzugroßen Schnitzer feststellen.
(aber ich denke du stimmst mir zu, dass MIME Items irgendwie sehr sonderbar sind)

Gruß
Roland

/edit: hier der Artikel: http://atnotes.de/index.php/topic,52040.0.html
« Letzte Änderung: 30.06.11 - 07:52:22 von pram »
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline endiAN

  • Frischling
  • *
  • Beiträge: 35
Re: Neuling: Email mit MimeEntity mit Gif von URL
« Antwort #9 am: 01.07.11 - 09:06:31 »
Hallo Roland,

danke für Deine Antwort. Ja, den Aufbau hab ich jetzt mal versucht genau so hinzubekommen, wie Du es in Deinen Artikel beschrieben hattest

+ multipart/related
 + multipart/alternativ
  + text/plain
  + text/html
+ image/jpeg

Wenn ich das Document dann versende und schaue, welche Felder/MimeElemente das Dokument enthält, ist es nicht ganz so wie ich es mir vorgestellt hatte. Es sieht dann so aus:

+ multipart/related -> ist OK
 + multipart/alternativ -> ist OK
  + multipart/mixed ->??? woher kommt das denn???
  + text/html -> ist OK -> wird aber nicht angezeigt -> vorher sollte aber das text/plain kommen -> fehlt aber!!!
  + MIME-Element, das die Abschluß-Boundary mitbringt -> hab ich nicht erzeugt?!
 + MIME-Element, das die Abschluß-Boundary mitbringt -> hab ich auch nicht erzeugt?!
+ image/jpeg -> ist OK ->wird auch angezeigt
+ MIME-Element, das die Abschluß-Boundary mitbringt -> hab ich auch nicht erzeugt...

Also das Root MIME hat den Text "This is a multipart message in MIME format". Multipart/related ist drin. Multipart/alternativ ist da. Aber wer verschluckt mein text/plain?

Danke für jeden Hinweis.


Grüße

Andreas

PS: Hier der aktuelle Code

Code
			Document memo = db.createDocument();
		    Stream stream = session.createStream();
		    Stream imageStream = session.createStream();
		    session.setConvertMIME(false); // Do not convert MIME to RT
		    memo.replaceItemValue("Form", "Memo");
		    
		    MIMEEntity body = memo.createMIMEEntity();
		    stream.writeText("This is a multipart message in MIME format.");
		    body.setContentFromText(stream, "multipart/related", MIMEEntity.ENC_NONE);

		    MIMEHeader header = body.createHeader("Subject");
		    header.setHeaderVal("MIME message");
		    header = body.createHeader("To");
		    header.setHeaderVal("user/firma");
			
			List<String> list = new ArrayList<String>();
			List<MIMEEntity> meList = new ArrayList<MIMEEntity>();
			
		    stream.truncate();
		    stream.writeText("Multipart/Alternative.");
			meList.add(body.createChildEntity());
		    meList.get(0).setContentFromText(stream,"multipart/alternative; charset=windows-1255", MIMEEntity.ENC_NONE);

		    stream.truncate();
			meList.add(meList.get(0).createChildEntity());
		    stream.writeText("Alternative Text..." + "\n");
		    meList.get(1).setContentFromText(stream,"text/plain; charset=windows-1255", MIMEEntity.ENC_NONE);
		    
			// hier wird der Stream mit Html gefüllt lass ich mal weg wegen des Überblicks...

		    stream.truncate();
			meList.add(meList.get(1).createChildEntity());
		    meList.get(2).setContentFromText(stream,"text/html; charset=windows-1255", MIMEEntity.ENC_NONE);
		    
			// Hier wird eine Liste "list" mit den URL's der einzufügenden Bilder erstellt, 
			// lass ich mal weg wegen des Überblicks...

			int counter3 = 0;

			while(counter3 < 1)//list.size())
			{
				notesURL = list.get(counter3);

				url = new URL(notesURL);

				BufferedImage bufferedImage = ImageIO.read(url);
				ByteArrayOutputStream baos = new ByteArrayOutputStream();
				JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos);
				encoder.encode(bufferedImage);
				byte [] imageData = baos.toByteArray();
				imageStream.write(imageData);
				
				meList.add(body.createChildEntity());
			    meList.get(meList.size()-1).setContentFromBytes(imageStream, "image/jpeg", MIMEEntity.ENC_IDENTITY_BINARY);
		        imageStream.truncate();

			    counter3++;
			}

			stream.truncate();
	        stream.close();
	        imageStream.close();
			
			session.setConvertMIME(true); // Restore conversion
			
			memo.send(false, "user/firma");


Und der Aufbau des Body-Feldes:

Code
Feldname: Body
Datentyp: MIME-Element
Datenlänge: 135 Byte
Seq.-Num.: 1
Doppeleintrags-ID: 0
Feld-Flags: SIGN SEAL 

"MIME-Version: 1.0
MIME-Version: 1.0
Content-Type: multipart/related;
 boundary="==IFJRGLKFGIR6136UHRUHIHD"


"

	Feldname: Body
	Datentyp: MIME-Element
	Datenlänge: 155 Byte
	Seq.-Num.: 1
	Doppeleintrags-ID: 1
	Feld-Flags: SIGN SEAL 
	
	"
	--==IFJRGLKFGIR6136UHRUHIHD
	Content-Type: multipart/alternative; charset=windows-1255;
	 boundary="==IFJRGLKFGIR37192UHRUHIHD"
	
	
	"

		Feldname: Body
		Datentyp: MIME-Element
		Datenlänge: 128 Byte
		Seq.-Num.: 1
		Doppeleintrags-ID: 2
		Feld-Flags: SIGN SEAL 
		
		"
		--==IFJRGLKFGIR37192UHRUHIHD
		Content-Type: multipart/mixed;
		 boundary="==IFJRGLKFGIR35745UHRUHIHD"
		
		
		"

		Feldname: Body
		Datentyp: MIME-Element
		Datenlänge: 101 Byte
		Seq.-Num.: 1
		Doppeleintrags-ID: 3
		Feld-Flags: SIGN SEAL 
		
		"
		--==IFJRGLKFGIR35745UHRUHIHD
		Content-Type: text/html; charset=windows-1255
		
		"

		Feldname: Body
		Datentyp: MIME-Element
		Datenlänge: 54 Byte
		Seq.-Num.: 1
		Doppeleintrags-ID: 4
		Feld-Flags: SIGN SEAL 
		
		"
		--==IFJRGLKFGIR35745UHRUHIHD--
		"

	Feldname: Body
	Datentyp: MIME-Element
	Datenlänge: 54 Byte
	Seq.-Num.: 1
	Doppeleintrags-ID: 5
	Feld-Flags: SIGN SEAL 
	
	"
	--==IFJRGLKFGIR37192UHRUHIHD--
	"

Feldname: Body
Datentyp: MIME-Element
Datenlänge: 122 Byte
Seq.-Num.: 1
Doppeleintrags-ID: 6
Feld-Flags: SIGN SEAL 

"
--==IFJRGLKFGIR6136UHRUHIHD
Content-Transfer-Encoding: binary
Content-Type: image/jpeg

mime.jpg"

Feldname: Body
Datentyp: MIME-Element
Datenlänge: 53 Byte
Seq.-Num.: 1
Doppeleintrags-ID: 7
Feld-Flags: SIGN SEAL 

"
--==IFJRGLKFGIR6136UHRUHIHD--
"

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Neuling: Email mit MimeEntity mit Gif von URL
« Antwort #10 am: 01.07.11 - 13:59:08 »
Das multipart/mixed soll da wirklich nicht hin.
es müsste dem Item entsprechen:
 meList.get(1).setContentFromText(stream,"text/plain; charset=windows-1255", MIMEEntity.ENC_NONE);
Vielleicht liegt es am Charset (weil da windows drin vorkommt), probier mal UTF-8 oder ISO-8859-1

Die End-boundaries erzeugt Notes selber, da brauchst du dich nicht drum kümmern

Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline endiAN

  • Frischling
  • *
  • Beiträge: 35
Re: Neuling: Email mit MimeEntity mit Gif von URL
« Antwort #11 am: 01.07.11 - 14:16:24 »
Hallo Roland

danke für Deine Antwort. Aha. Das mit den Charsets probier ich gleich mal.

Folgendes habe ich in der Zwischenzeit probiert:

An einer multipart-related-root zwei text-html-children. Wenn das text-html-children allein ist, klappt es mit der Html-Formatierung. Ein Teil des Textes wird fett dargestellt. Wenn ich aber das zweite text-html-children anfüge, geht die Html-Formatierung bei beiden Texten verloren. Das ist nicht schön! Der Versuch ist so simpel. Das muß funktionieren. Hab noch nicht die Stelle gefunden, wo geschrieben steht: "Es darf nur ein text-html-child erzeugt werden sonst nichts anderes. Sonst gehen die Html-Formatierungen verloren." Hab ich hier grundsätzlich irgendwas nicht verstanden?


Grüße

Andreas

PS: Code-Snippet

Code
		    Stream stream = session.createStream();
		    Stream imageStream = session.createStream();
		    Stream textStream = session.createStream();
		    Stream textStream2 = session.createStream();

		    MIMEEntity body = memo.createMIMEEntity();
		    textStream.writeText("This is a multipart message in MIME format.");
		    body.setContentFromText(textStream, "multipart/related", MIMEEntity.ENC_NONE);
		    
		    MIMEHeader header = body.createHeader("Subject");
		    header.setHeaderVal("MIME message");
		    header = body.createHeader("To");
		    header.setHeaderVal("user/firma");
		    textStream.truncate();

			textStream.writeText("<b>text/html</b>-Teil 1...");
		    MIMEEntity textHtml1 = body.createChildEntity();
		    textHtml1.setContentFromText(textStream, "text/html", MIMEEntity.ENC_NONE);
		    textStream.truncate();
		    
			textStream2.writeText("<b>text/html</b>-Teil 2...");
		    MIMEEntity textHtml2 = body.createChildEntity();
		    textHtml2.setContentFromText(textStream2, "text/html", MIMEEntity.ENC_NONE);
		    textStream2.truncate();
		    
		    memo.send(false, "user/firma");//session.getUserName());

body-Feld Aufbau

Code
Feldname: Body
Datentyp: MIME-Element
Datenlänge: 136 Byte
Seq.-Num.: 1
Doppeleintrags-ID: 0
Feld-Flags: SIGN SEAL 

"MIME-Version: 1.0
MIME-Version: 1.0
Content-Type: multipart/related;
 boundary="==IFJRGLKFGIR35966UHRUHIHD"


"

Feldname: Body
Datentyp: MIME-Element
Datenlänge: 105 Byte
Seq.-Num.: 1
Doppeleintrags-ID: 1
Feld-Flags: SIGN SEAL 

"
--==IFJRGLKFGIR35966UHRUHIHD
Content-Type: text/html

<b>text/html</b>-Teil 1..."

Feldname: Body
Datentyp: MIME-Element
Datenlänge: 105 Byte
Seq.-Num.: 1
Doppeleintrags-ID: 2
Feld-Flags: SIGN SEAL 

"
--==IFJRGLKFGIR35966UHRUHIHD
Content-Type: text/html

<b>text/html</b>-Teil 2..."

Feldname: Body
Datentyp: MIME-Element
Datenlänge: 54 Byte
Seq.-Num.: 1
Doppeleintrags-ID: 3
Feld-Flags: SIGN SEAL 

"
--==IFJRGLKFGIR35966UHRUHIHD--
"

Offline endiAN

  • Frischling
  • *
  • Beiträge: 35
Re: Neuling: Email mit MimeEntity mit Gif von URL
« Antwort #12 am: 01.07.11 - 14:25:00 »
Hallo Roland,

habe obiges Code-Snippet mit Charset probiert. Hat nichts gebracht.

Danke.

Andreas

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Neuling: Email mit MimeEntity mit Gif von URL
« Antwort #13 am: 01.07.11 - 18:04:28 »
Hallo Andreas, probier doch mal den Beispielcode von mir in LotusScript aus dem Link oben (und versuche den mal ggf. nach java zu portieren).

Ich muss gestehen, ganz habe ich das auch noch nicht verstanden, aber das zweite text-html braucht soweit ich weiß eine Content-Disposition, damit es als Attachment erscheint. Und wenn man HTML schreibt, dann sollte man das immer zusammen mit einem text/plain in ein multipart/alternative hängen.
Ich habe da auch ewig viel rumprobiert, in RFCs gelesen und gegoogled, bis ich irgendwann eine funktionierende Lösung hatte

Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline endiAN

  • Frischling
  • *
  • Beiträge: 35
Re: Neuling: Email mit MimeEntity mit Gif von URL
« Antwort #14 am: 04.07.11 - 14:08:30 »
Hallo Roland,

danke für Deine Hilfe. Jetzt funktioniert's. Es lag an der Content-ID und dem Einbinden der Image-Source über die Content-ID in das Html. Es ist total einfach, wenn man es richtig macht. Und im Nachhinein hab ich das Gefühl, Du hast es schon 10 mal gepostet. Aber ich hab es irgendwie ignoriert/überlesen/Brett vorm Kopf. Ich weiß auch nicht was. Ich hatte irgendwie eine völlig falsche Vorstellung, was das ist MIMEEntity. Ohne Deine Hilfe hätte ich das nie geschafft. Nochmals Vielen Dank!

Grüße

Andreas

Offline Legolas

  • Senior Mitglied
  • ****
  • Beiträge: 446
  • Geschlecht: Männlich
Re: Neuling: Email mit MimeEntity mit Gif von URL
« Antwort #15 am: 21.07.11 - 09:22:47 »
Hallo endiAN (Andreas),

wäre toll von dir, wenn du den funktionierenden Code noch posten würdest.
An dieser Art von Problemen haben sich schon viele versucht.

Danke
Bernd
Arbeite klug, nicht hart.

Offline endiAN

  • Frischling
  • *
  • Beiträge: 35
Re: Neuling: Email mit MimeEntity mit Gif von URL
« Antwort #16 am: 16.08.11 - 14:13:41 »
Hallo Bernd,

tschuldigung, daß es erst jetzt mit der Antwort klappt. Aber die Urlaubszeit...

Habe leider noch nicht die Zeit gehabt, das ganze ins Reine zu schreiben. Wenn jemand noch Fehler sieht, bitte posten.

Der Agent soll einen BIRT-Report aufrufen, der als Quelle eine Notes-DB hat. Das so entstandene Html soll in eine Email gepreßt und verschickt werden.

Danke nochmals für die Hilfe...

Andreas

Code

    	  	Session session = getSession();
    	  	AgentContext agentContext = session.getAgentContext();

          	// (Your code goes here)
          
	        Agent agent = agentContext.getCurrentAgent();
	        Database db = agentContext.getCurrentDatabase();
	          
	        Document doc = db.getDocumentByID(agent.getParameterDocID());

	    	String noteID = agent.getParameterDocID();

			String docid = doc.getUniversalID();
			String inputLine, inputLine2, pdfExtension = ".pdf", inputLine3;

			Document memo = db.createDocument();
		    session.setConvertMIME(false); // Do not convert MIME to RT
		    memo.replaceItemValue("Form", "Memo");
		    
		    // ROOT MIME

			// F U N K T I O N I E R T ! ! !
			// Das hier erzeugt eine related-root mit multipart-alternative-child
			// und daran text-plain- und text-html-child
			// Image-Source über cid verknüpft 
		    
		    Stream imageStream = session.createStream();
		    Stream textStream = session.createStream();

		    MIMEEntity body = memo.createMIMEEntity();
		    textStream.writeText("This is a multipart message in MIME format.");
		    body.setContentFromText(textStream, "multipart/related", MIMEEntity.ENC_NONE);
		    MIMEHeader header = body.createHeader("Subject");
		    header.setHeaderVal("MIME message");
		    header = body.createHeader("To");
		    header.setHeaderVal("user/domain");
		    textStream.truncate();
		    
			List<String> list = new ArrayList<String>();
			List<MIMEEntity> meList = new ArrayList<MIMEEntity>();
			
			MIMEEntity multipartAlternative = body.createChildEntity();
			MIMEHeader mr_header = multipartAlternative.createHeader("Content-Type");
			mr_header.setHeaderVal("multipart/alternative");

			textStream.writeText("text/plain-Teil...");
			MIMEEntity textPlain = multipartAlternative.createChildEntity();
			textPlain.setContentFromText(textStream, "text/plain", MIMEEntity.ENC_QUOTED_PRINTABLE);
			textStream.truncate();

			// Html ohne Anhänge einfügen...
			
			String notesURL = "http://srv01:8080/birt-viewer/preview?__report=prtPreview.rptdesign&notesID=" + agent.getParameterDocID() + "&previewType=withoutAttachment";
			
			URL url = new URL(notesURL);
			BufferedReader in = new BufferedReader(	new InputStreamReader( url.openStream()));
			
			int counter = 1;
			
			while ((inputLine = in.readLine()) != null)
			{
				if(inputLine.length()>0){
					textStream.writeText(inputLine + "\n");
				}
				counter++;
			}

			in.close();

			counter = 1;

			MIMEEntity textHtml = multipartAlternative.createChildEntity();
			textStream.writeText("<br><br><img src=\"cid:" + counter + "\">");
			textHtml.setContentFromText(textStream, "text/html; charset=UTF-8", MIMEEntity.ENC_IDENTITY_7BIT);
			textStream.truncate();

			// die URL aus der "list" holen
			notesURL = "http://srv02/test.nsf/4d33....6090/a680....1be1/MIME/M1.2?OpenElement";

			//Bild einlesen über ImageIO

			url = new URL(notesURL);

			BufferedImage bufferedImage = ImageIO.read(url);
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos);
			encoder.encode(bufferedImage);
			byte [] imageData = baos.toByteArray();
			imageStream.write(imageData);
			
			//Child zur vorhergehenden MIMEEntity erzeugen...
			MIMEEntity imageChild = body.createChildEntity();
		    MIMEHeader ic_header = imageChild.createHeader("Content-ID");
		    ic_header.setHeaderVal("1");
		    imageChild.setContentFromBytes(imageStream, "image/jpeg", MIMEEntity.ENC_IDENTITY_BINARY);
	        imageStream.truncate();
			
			memo.send(false, "user/domain");//session.getUserName());
				    


 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz