I am implementing a emailclient with javamail (imap).
There is a "part" of an email where the content is (at one point only) different from what i see on the original email in gmail. This leads to a broken link, in the example a link with two points.
The message is printed to the console with part.writeTo(System.out);
How can that be.. any idea what goes wrong? Help appreciated!
// MimeMessage
if(part.getContentType().toLowerCase().startsWith("text/html")) {
// both, (String)part.getContent() and MimeUtility.decode as below
// and also writeTo contains the additional point..
part.writeTo(System.out);
// htmltext.append((String)part.getContent());
String body = IOUtils.toString(MimeUtility.decode(new ByteArrayInputStream(((String)part.getContent()).getBytes()), "quoted-printable"),"UTF-8");
htmltext.append(body);
}
All other mails are fetched correctly.
Related
I am using EWS Java API to read and process emails. One such email contains few conversation and a MS Teams meeting information at the end. While reading such an email, the EmailMessage.getBody() returns only the MS Teams meeting information and all the other contents of the email body are ommitted. Sample code below:
EmailMessage message = EmailMessage.bind(service, new ItemId(item.get(nMessagePos).getId().getUniqueId()));
String emailBody = message.getBody().toString()
I tried setting the BodyType property to both HTML and Text and then fetched the body of the email but it still returns only the Meeting invite details.
Is there any specific reason for this and is there a way for me to get the complete email body?
I would try to enable tracing https://learn.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-trace-requests-responses-to-troubleshoot-ews-managed-api-applications or look at the actually soap responses your getting it could be a parsing issue at the client side (eg bug in the library). You could also try getting the Mimecontent of the Message instead and then parse back the body from that content. Something like EWSEditor might be useful for trying to diagnose what is going on it will show you what the responses look like and allow you to test mimecontent etc without needing to write any code https://github.com/dseph/EwsEditor/releases.
I'm using the Gmail RESTful API directly (not from some library).
Looking at the documentation here Gmail Documentation.
I have managed to get the content of the message body, however it also returns the whole history chain for the current message.
Is there a way to get a response from the API only the requested message body, without the whole thread history?
According to this thread, it is not possible because it is part of the email's body content and you're specifying the ID of the message to retrieve.
You are getting the full reply message. When the report replied, they quoted the original message and this the text of the original is in the reply message. You may just want to do what Gmail and many other modern emails apps do and collapse/hide any reply text which begins with >.
References:
How to get the reply message without the original message from the Gmail API
GMAIL API : How to get the reply without the original message
Most efficient way to get new messages
we use Java Mail to send E-Mails with PDF attachments via SMTP over Lotus Notes to our customers.
Some time ago we got notified that serveral customers don't received an attachment.
One of these customers uses Microsoft Outlook and got an attachment flag in his inbox. But when he opens the
E-Mail, he doesn't see an attachment. We don't have the possibility to check the version of the E-Mail client's
and to do customer side test's, because our customers are worldwide located.
If our customer responds or (internal) forward the E-Mail, the attachment shown in receiver's E-Mail client.
The following part is the affected Java source code:
private static Multipart createMultipartMailWithAttachment(String messageText)
throws MessagingException {
// Message with attachments
Multipart mp = new MimeMultipart();
// Attach Text
MimeBodyPart mbp1 = new MimeBodyPart();
mbp1.setText(messageText, UTF8, HTML);
mp.addBodyPart(mbp1);
for (File f : attachments) {
MimeBodyPart fileAttachment = new MimeBodyPart();
try {
fileAttachment.setDisposition(MimeBodyPart.ATTACHMENT);
fileAttachment.attachFile(f);
if(f.getName().toLowerCase().endsWith(PDF_EXTENSION)) {
fileAttachment.setHeader(CONTENT_TYPE, APPLICATION_PDF);
}
} catch (IOException e) {
returnMessage = e.getMessage();
}
mp.addBodyPart(fileAttachment);
}
return mp;
}
We already tested different webmail services like gmail.com, yahoo.com and outlook.com. In every case the
attachment was shown. Also in an local installation of Mozilla Thunderbird, Microsoft Outlook or Lotus Notes
was the attachment shown.
After many inquiries we got many different solution processes. See setDisposition(MimeBodyPart.ATTACHMENT) and
setHeader(CONTENT_TYPE, APPLICATION_PDF). None of these solutions lead us to success. Does anyone know
a solution or a new solution process to solve that problem?
We had a similar problem where we sent file attachments from a J2EE application to various mail accounts. We utilized SMTP gmail server (smtp.gmail.com) with port 465 and HTTPS connection type for our outgoing messages.
Attachments to the messages sent via Java were not shown in Outlook but we could observe them in web interface for gmail accounts.
In our case, it turned out to be that MimeMultipart construction was not the correct one. We had
Multipart multipart = new MimeMultipart("alternative");
When we modified it to
Multipart multipart = new MimeMultipart();
the attachments became visible.
Please also refer to the following resource for a full explanation.
If messages sent from other mailers work properly and only messages sent from JavaMail fail, you'll need to examine the raw MIME content of the working and non-working messages to see what's different. You should be able to reproduce whatever content works using JavaMail.
There's lots of ways to access the raw MIME content of messages; let me know if you need help with that.
Obviously you'll need working and non-working examples messages with similar content to compare. If you have a repeatable test case - a message you can send to the same recipient multiple times and it fails every time - that would be most helpful.
I wanted to add a comment (question), but don't have the required points.
It could be a filter on the customer side that blocks attachments. See if the customer is getting a mail with attachment (same pdf) when sending it via normal outlook.
Second possible cause is the size of the attachment is a problem for the customer.
Third possible cause is that I have noticed that when I set up a rule to automatically put messages into a different folder, i see a message saying:
Links and other functionality have been disabled in this message. To turn on that functionality, move this message to the Inbox. Outlook blocked access to the potentially unsafe attachments: xxxx.pdf
Maybe this customer has setup a rule similarly.
i'm using java mail api to download java mail message attachment.
i am using this link tutorial
download mail attachment
but my requirement is that when user read mail it only display download link for attachment and when click on the link file downloaded that time.
Thanks
Manish
I think you want to do the following:
Check, if it is a multipart message AND consists of several parts
1.1 If so, it has attachments. You should then retrieve the first text/plain or text/html part, which should be the text itself. You leave the other parts alone. But along the text you store some id or reference to the message on the server, that the text is taken from. Consider the following code.
Folder folderInbox = store.getFolder("INBOX");
Message[] arrayMessages = folderInbox.getMessages();
for (int i = 0; i < arrayMessages.length; i++) {
Message message = arrayMessages[i];
}
Now the class javax.mail.Message has a method getMessageNumber()::int.
If you store this message number and the folder name, in this case "INBOX",
you have an identifier, that will allow you to find the message on the server
again at a later time and do something with it, like downloading parts that have
not been retrieved yet.
So (pseudo code here) you basically have to do this.
var message_text = message.getFirstTextBodyPart();
var message_ident = (message.getFolderName(), message.getMessageNumber());
var message = (message_ident, message_text);
saveMessage(message);
showMessage(message);
1.2 In other cases, you download the entire message right now, as there are no parts for later retrieval.
i have setup a POP3 mail server using MailEnable. I am able to send and receive emails via this server using Mozilla Thunderbird but i encounter a strange problem when reading mails with multipart content (in this case a mail with html content) via the JavaMail API. The data returned from the input stream is always only two CR/LF's with a trailing period!
Below is the relevant part of my message processing code:
for (Message m : messages) {
if (m.isMimeType("multipart/*")) {
System.out.println("Process multipart/* Nachricht");
Multipart mp = (Multipart) m.getContent();
Part part = mp.getBodyPart(0);
System.out.println(part.getContent());
}
}
There is only one Multipart, so i directly access the first element. Also no nested parts are present in the Multipart. I have no idea which causes the problem and it's getting me mad for a week, so i would be very happy if someone could help me on this issue.
Thanks,
fredddmadison
Instead of this
Part part = mp.getBodyPart(0); // What if there's more parts? Or empty parts?
System.out.println(part.getContent()); // No check for empty String?
I would suggest trying this
mp.writeTo(System.out); // Use the optimized write.
System.out.flush(); // Flush the outputstream.
Also, are you sure you're not receiving empty messages?
I have found the problem. It was because i had two different implementations of the JavaMail API on my classpath (The apache geronimo 1.4 which was shipped with EclipseLink as well as the JavaMail API reference implementation, 1.5.1). I have now removed the geronimo implementation from the classpath and it works as expected.