Domino 9 und frühere Versionen > ND8: Entwicklung
Neuling: Email mit MimeEntity mit Gif von URL
endiAN:
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");
--- Ende Code ---
endiAN:
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
endiAN:
Ja, stimmt. Firefox funktioniert einwandfrei.
pram:
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");
--- Ende Code ---
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
endiAN:
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");
--- Ende Code ---
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--
"
--- Ende Code ---
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln