2011-02-10 18 views
18

Uygulamamın öncelikle bir String olarak oluşturması gereken bir textfile göndermesi gerekiyor. Metin ASCII olmayan semboller içerir, bu yüzden UTF-8 olmasını isterim. Çok fazla varyant denedim, ancak ek olarak aldığım her şey bazı soru işaretleri. Ve mesaj metni ile aynı metni gönderdiğimde, her şey yolunda. İşte JavaMail dize kodlamasından posta eki gönderme UTF-8

eki ile MimeBodyPart üretir kod satırına: Ben de gördüğünüz gibi, ben çalışıyorum, şimdi, sadece bayt kullanarak, herhangi bir dönüşüm olmadan dize kullanarak çalıştı

String attachment = "Привет"; 
messageBodyPart.setContent(new String(attachment.getBytes("UTF-8"), 
    "UTF-8"),"text/plain; charset=UTF-8"); 

bayttan bir dize oluştur ...

Neyi yanlış yapıyorum? (Ve bunu başka bir projede yaptığımı hatırlıyorum, bu işe yarıyor ama artık kaynak koduna erişemiyorum).

Önceden teşekkür ederiz. Timofey.

GÜNCELLEME cevaplarınızı okumak, ve deney biraz daha başarısız sonra benim posta şey kodunu yayımlamak için en iyisi düşündük. Posta gönderen Mailer sınıfına sahibim ve diğer sınıflar yalnızca bir ileti göndermek için statik sendMessage() yöntemini çağırabilir. Ve hepsi Google App Engine'de çalışır.

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); } 

Ve başka bir sınıfta bu şeyi çağırır hat

geçerli:

Mailer.sendMessage("[email protected]", "Test", "No body", "Привет, Я кусок текста"); 

Ve postanın ham kaynağı, garip, (görünüşte alakasız başlıklarını dışarıda bırakarak) olduğu:

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

Sadece anlamıyorum, neden kestirmeye çalıştığımdan farklıdır ve nereden geldikleri.

String attachment = "Привет"; 
DataSource ds = new ByteArrayDataSource(attachment, "text/plain; charset=UTF-8"); 
messageBodyPart.setDataHandler(new DataHandler(ds)); 

GÜNCELLEME:

+0

dosyada doğru karakter kodlamasını görüyor musunuz siz yarattı? – JSS

+0

Hayır. Oluşturulan dosyada sadece soru işaretlerini görüyorum. – Ibolit

cevap

19

Yippie !!!

Sonunda yaptım!Kısaca, "metin/düz", ayarlamak için içerik türünü ayarlamak yok o "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); 
+3

Kendi cevabınızı kabul edebilirsiniz ... :-) – PhiLho

+0

Teşekkürler! Ben 21 saat sonra geri dönmeyi unuttum :) – Ibolit

0

bu bir deneyin (tam örnek)

import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.mail.Session; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 
import javax.mail.util.ByteArrayDataSource; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     String attachment = "Привет"; 
     DataSource ds = new ByteArrayDataSource(attachment, "text/plain; charset=UTF-8"); 
     MimeBodyPart attachmentPart = new MimeBodyPart(); 
     attachmentPart.setDataHandler(new DataHandler(ds)); 

     MimeBodyPart bodyPart = new MimeBodyPart(); 
     bodyPart.setText("Hello this is some text"); 

     MimeMultipart mp = new MimeMultipart("mixed"); 
     mp.addBodyPart(bodyPart); 
     mp.addBodyPart(attachmentPart); 

     MimeMessage msg = new MimeMessage((Session)null); 
     msg.setContent(mp); 

     msg.writeTo(System.out); 
    } 
} 

çıkışı: Bu benim (dosya göndermek için kullandığı bir örnek kod

Message-ID: <[email protected]> 
MIME-Version: 1.0 
Content-Type: multipart/mixed; 
    boundary="----=_Part_0_1579321858.1297366787792" 

------=_Part_0_1579321858.1297366787792 
Content-Type: text/plain; charset=us-ascii 
Content-Transfer-Encoding: 7bit 

Hello this is some text 
------=_Part_0_1579321858.1297366787792 
Content-Type: text/plain; charset=UTF-8 
Content-Transfer-Encoding: base64 

0J/RgNC40LLQtdGC 
------=_Part_0_1579321858.1297366787792-- 
+0

Sadece denedim ve işe yaramadı, ne işe yaramadı ... = yeni ByteArrayDataSource (attachment.getBytes ("UTF-8") ... – Ibolit

+0

alınan e-postanın ham kaynağını gönderebilir misiniz? – dnault

+0

Burada bir cevap alamıyorsanız, JavaMail forumlarını deneyin .. Bill Shannon inanılmaz bir destek seviyesi sunuyor. http://forums.oracle.com/forums/forum.jspa?forumID=975 – dnault

2

kodlama veya veri yapısına bakılmaksızın).

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); 
fileDataSource bir javax.activation.DataSource (metin dosyası burada olacaktır) olduğunu

ve fileBodyPart.setDisposition(Part.INLINE); (PART.INLINE veri kaynağı demektir sadece HTML e-postalar gibi, mesaj gövdesiyle satır içi, PART.ATTACHMENT veri kaynağı bir ektir anlamına gelir).

Bu yardımcı olur umarım.

+0

Bunun gibi bir dosyam yok, ek olarak bir String gönderebilmem gerekir . – Ibolit

+2

İyi hatırlarsam, bir InputStream alan bir Veri kaynağı kullanabilirsiniz. String'iniz olan bir String'i kullanabilir veya dizginizi içeren bir geçici dosyayı veri kaynağına geçirebilirsiniz. Sizi sabah göstermek zorundayım. –

+0

Ekin dosya adının kodlamasını açıklayan bir başlık var mı? Mine, Latin olmayan bir dosya adı kullanırken soru işaretleri olarak görüntülenir. – theyuv

0

Bu işler için:

 MimeMessage msg = new MimeMessage(session); 
     msg.setFrom(sendFrom); 
     msg.setSubject(subject, "utf-8"); 
     msg.setSentDate(new Date()); 

     // create and fill the first message part 
     MimeBodyPart mbp1 = new MimeBodyPart(); 
     mbp1.setContent(message,"text/plain; charset=UTF-8"); 
     // mbp1.setContent(message,"text/html; charset=UTF-8"); // with this the attachment will fail 

     // create the Multipart and its parts to it 
     Multipart mp = new MimeMultipart(); 
     mp.addBodyPart(mbp1); 

     if (attachment!=null){ 
      // Part two is attachment 
      MimeBodyPart mbp2 = new MimeBodyPart(); 
      mbp2 = new MimeBodyPart(); 

      DataSource ds = null; 
      try { 
       ds = new ByteArrayDataSource(attachment.getBytes("UTF-8"), "application/octet-stream"); 
       } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      mbp2.setDataHandler(new DataHandler(ds)); 
      mbp2.addHeader("Content-Type", "text/plain; charset=\"UTF-8\""); 
      mbp2.addHeader("Content-Transfer-Encoding", "base64"); 

      mbp2.setFileName("attachment.txt"); 
      mbp2.setDisposition(Part.ATTACHMENT); 
      mp.addBodyPart(mbp2); 
     } 

     // add the Multipart to the message 
     msg.setContent(mp); 
     msg.saveChanges(); 

     // send the message 
     Transport.send(msg); 
6

Had benzer durum, aşağıdaki kodu Çözmedim:

MimeBodyPart att = new MimeBodyPart(); 
att.setFileName(MimeUtility.encodeText(fileName)); 
1

sorun, aşağıdaki kod benim (ibranice) 'de yardımcı vaka yerine vücutta daha dosya adında ise:

MimeBodyPart attachment = new MimeBodyPart(); 
attachment.setFileName(MimeUtility.encodeText(filename, "UTF-8", null)); 
+1

Benim durumumda, ek adı Japon karakter kümesidir ve kod satırını denedim ama alınan e-postada (ne Japonca ne de ?????) çöp karakterleri alıyorum. Yanlış yaptığım yerde yardım edebilir misin? – Akshada

0

Bir daha ihtimal:

String attachment = "älytöntä"; 
MimeBodyPart part = new MimeBodyPart(); 
part.setText(attachment, "UTF-8"); 
part.setDisposition("attachment"); 
part.setFileName("attachment.txt"); 
part.setHeader("Content-Transfer-Encoding", "base64"); 
part.setHeader("Content-type", "text/plain; charset=utf-8");