Domino 9 und frühere Versionen > ND8: Entwicklung

Neuling: Email mit MimeEntity mit Gif von URL

(1/4) > >>

endiAN:
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();
      }
   }
}

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

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

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

pram:
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
--- Ende Code ---

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln