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
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");
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
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
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
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:
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--
"
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
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
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--
"
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
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¬esID=" + 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());