My application has to send a textfile, which it first has to generate as a String. The text contains non-ASCII symbols, so i would like it to be UTF-8. I've tried a lot of variants, but all i receive as the attachment is some question marks. And, when i send the same text as the message body, it works all right.
Here is the line of code that generates the MimeBodyPart with the attachment:
String attachment = "Привет";
messageBodyPart.setContent(new String(attachment.getBytes("UTF-8"),
"UTF-8"),"text/plain; charset=UTF-8");
I also tried using the string without any transformations, using just the bytes, now, as you see, i am trying to generate a string from the bytes...
What am i doing wrong? (And i do remember doing this in another project, which works, but i no longer have the access to its source code).
Thank you in advance. Timofey.
UPDATE
Having read your replies, and after some more unsuccessful experimenting i thought it best to publish the code of my mailing thing. I have the Mailer
class, which does the mailing, and other classes can just call its static sendMessage()
method to send a message. And it all runs on Google App Engine.
public static void sendMessage(String to, String subject, String msgBody,
String attachment) throws AddressException, MessagingException {
Properties props = new Properties();
Session mailSession = Session.getDefaultInstance(props, null);
Message msg = new MimeMessage(mailSession);
String email = "bla-bla-bla"; // userService.getCurrentUser().getEmail();
msg.setFrom(new InternetAddress(email));
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
InternetAddress[] addresses = { new InternetAddress("bla-bla-bla") };
msg.setReplyTo(addresses);
msg.setSubject(subject);
Calendar cal = Calendar.getInstance();
String fileName = cal.get(Calendar.YEAR) + "_"
+ cal.get(Calendar.MONTH) + "_"
+ cal.get(Calendar.DAY_OF_MONTH) + "_"
+ cal.get(Calendar.HOUR_OF_DAY) + "_"
+ cal.get(Calendar.MINUTE) + "_" + cal.get(Calendar.SECOND)
+ "_" + cal.get(Calendar.MILLISECOND) + ".txt";
// create the message part
MimeBodyPart messageBodyPart = new MimeBodyPart();
// fill message
// Here we should have the msgBody.
// Sending attachment contents for debugging only.
messageBodyPart.setText(attachment + " - 4", "UTF-8", "plain");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
MimeBodyPart att = new MimeBodyPart();
att.setText(attachment, "UTF-8", "plain");
att.addHeader("Content-Type", "text/plain; charset=UTF-8");
att.setFileName(fileName);
multipart.addBodyPart(att);
// Put parts in message
msg.setContent(multipart);
Transport.send(msg);
}
And the line that calls this thing in another class is:
Mailer.sendMessage("[email protected]", "Test", "No body", "Привет, Я кусок текста");
And the raw source of the mail, strangely enough, is (leaving out the seemingly irrelevant headers):
Message-ID: <[email protected]>
Date: Sat, 12 Feb 2011 11:21:01 +0000
Subject: Pages
From: [email protected]
To: [email protected]
Content-Type: multipart/mixed; boundary=00163662e7107ccbd4049c1402fa
--00163662e7107ccbd4049c1402fa
Content-Type: text/plain; charset=KOI8-R; format=flowed; delsp=yes
Content-Transfer-Encoding: base64
8NLJ18XULCDxIMvV08/LINTFy9PUwSAtIDQNCg==
--00163662e7107ccbd4049c1402fa
Content-Type: text/plain; charset=US-ASCII; name="2011_1_12_11_21_1_691.txt"
Content-Disposition: attachment; filename="2011_1_12_11_21_1_691.txt"
Content-Transfer-Encoding: base64
Pz8/Pz8/LCA/ID8/Pz8/ID8/Pz8/Pw==
--00163662e7107ccbd4049c1402fa--
I just don't get it, why the charsets are different from what i am trying to set, and where they come from.
Set the content type to application/octet-stream
:
MimeBodyPart attachmentPart = new MimeBodyPart();
try {
DataSource ds = new ByteArrayDataSource(attachment.getBytes("UTF-8"), "application/octet-stream");
attachmentPart = new MimeBodyPart();
attachmentPart.setDataHandler(new DataHandler(ds));
}
catch (Exception e) {
Logger.getLogger("Blina").log(Level.SEVERE, Misc.getStackTrace(e));
}
attachmentPart.setFileName(fileName);
multipart.addBodyPart(attachmentPart);
// Put parts in message
msg.setContent(multipart);
Had similar case, following code solved it:
MimeBodyPart att = new MimeBodyPart();
att.setFileName(MimeUtility.encodeText(fileName));
If problem is in file name, rather than in body, following code helped in my (hebrew) case:
MimeBodyPart attachment = new MimeBodyPart();
attachment.setFileName(MimeUtility.encodeText(filename, "UTF-8", null));
This is a sample code that I use to send files (irrespective on encoding or data structure).
BodyPart fileBodyPart = new MimeBodyPart();
fileBodyPart.setDataHandler(new DataHandler(fileDataSource));
fileBodyPart.setFileName(attachment.getName());
fileBodyPart.setHeader("Content-Type", fileDataSource.getContentType());
fileBodyPart.setHeader("Content-ID", attachment.getName());
fileBodyPart.setDisposition(Part.INLINE);
Where fileDataSource
is a javax.activation.DataSource
(text file will be in here), and
fileBodyPart.setDisposition(Part.INLINE);
(PART.INLINE
means datasource is inlined with the message body, just like HTML emails, PART.ATTACHMENT
means datasource is an attachment).
Hope this helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With