java 发 email 附件问题

SambaGao 2012-11-16 06:32:34
在doc, png, csv 我试了,都没有问题
但是xml 就不行了。

javax.mail.MessagingException: IOException while sending message;
nested exception is:
java.io.IOException: "text/xml" DataContentHandler requires String object, was given object of type class [B
###javax.mail.MessagingException: IOException while sending message;
nested exception is:
java.io.IOException: "text/xml" DataContentHandler requires String object, was given object of type class [B
---End---
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:566)
at com.amazon.ses.SendEmail.startSendEmail(SendEmail.java:118)
at com.amazon.ses.LoginSalesforce.login(LoginSalesforce.java:91)
at com.amazon.ses.LoginSalesforce.login(LoginSalesforce.java:47)
at com.amazon.ses.test.TestLogin.testSendDocuments(TestLogin.java:72)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
...全文
915 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
SambaGao 2012-11-27
  • 打赏
  • 举报
回复
引用 27 楼 dracularking 的回复:
引用 26 楼 nihaozhangchao 的回复:不错,如果一个sendMessage 出错的话,其它的还是可以继续执行。不过如果 connect 断开的话。程序就停止了。 我想让主线程停止,马上返回一个变量,说程序正在Running.., 可是我把主线程return 后。其它子线程也不跑了。这是为什么?主线程不是不影响其它线程吗? 其他子线程也都不跑了是指整……
已经解决了。原来在junit 中跑程序会中断的。具体原因,现在我还不知道。这个贴子我会马上结贴。 dracularking, thanks a lot.
dracularking 2012-11-27
  • 打赏
  • 举报
回复
引用 26 楼 nihaozhangchao 的回复:
不错,如果一个sendMessage 出错的话,其它的还是可以继续执行。不过如果 connect 断开的话。程序就停止了。 我想让主线程停止,马上返回一个变量,说程序正在Running.., 可是我把主线程return 后。其它子线程也不跑了。这是为什么?主线程不是不影响其它线程吗?
其他子线程也都不跑了是指整个程序都中断了吗? 不是的话,比如卡住的话,肯定有什么也许你没提及的原因影响它们运行 是的话,也许你这些子线程都是低级别的比如守护线程。
dracularking 2012-11-27
  • 打赏
  • 举报
回复
引用 28 楼 nihaozhangchao 的回复:
已经解决了。原来在junit 中跑程序会中断的。具体原因,现在我还不知道。这个贴子我会马上结贴。 dracularking, thanks a lot.
junit啊?我不知道你具体怎么操作的,至少按单元操作,结束了可能就会都中断吧
SambaGao 2012-11-26
  • 打赏
  • 举报
回复
不错,如果一个sendMessage 出错的话,其它的还是可以继续执行。不过如果 connect 断开的话。程序就停止了。 我想让主线程停止,马上返回一个变量,说程序正在Running.., 可是我把主线程return 后。其它子线程也不跑了。这是为什么?主线程不是不影响其它线程吗?
dracularking 2012-11-23
  • 打赏
  • 举报
回复
引用 23 楼 nihaozhangchao 的回复:
之前是在transport.connect("email-smtp.us-east-1.amazonaws.com", emailUser, emailPassword); 停止的,后来我把这句加到了循环外。现在执行到transport.sendMessage(msg, msg.getAllRecipients()); 就停止了。单线程是没有问题的。
sendMessage方法是同步的,但是多线程同时调用的话,应该会进入排队机制啊,会一直没反应吗? public synchronized void sendMessage(Message message, Address[] addresses) throws MessagingException, SendFailedException {
dracularking 2012-11-23
  • 打赏
  • 举报
回复
不觉得奇怪吗 decode和decodeBuffer应该在编码这个问题上没什么区别吧 decodeBuffer貌似只是将流的内容解码进Buffer里而已
SambaGao 2012-11-22
  • 打赏
  • 举报
回复
Hi dracularking, 最新情况:
for(SObject contact : contacts) {
				Thread thread = new Thread(new SendMessageRunnable(transport, msg, sender, emailTemplate, contact, attachments, documents));
				thread.start();
				listThread.add(thread);
			}
之前是在transport.connect("email-smtp.us-east-1.amazonaws.com", emailUser, emailPassword); 停止的,后来我把这句加到了循环外。现在执行到transport.sendMessage(msg, msg.getAllRecipients()); 就停止了。单线程是没有问题的。 Thanks a lot.
SambaGao 2012-11-22
  • 打赏
  • 举报
回复
我去掉了ThreadPool 结果就出来了,原来是线程池的问题: 应该是线程没有执行完,被终结了。

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(3, 200, 50,
					TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3),
					new ThreadPoolExecutor.DiscardOldestPolicy());

for(SObject contact : result.getContacts()) {
				threadPool.execute(new SendEmail(connection, result.getSender(), result.getEmailTemplate(), contact, result.getAttachments(), result.getDocuments()));
线程中执行的时间可能会比较长。
				Thread.sleep(produceTaskSleepTime);
			}
			threadPool.shutdown();
引用 20 楼 nihaozhangchao 的回复:
Thanks again. 目前我是这样解决的。关于 text/xml and text/txt 类型的用Base64.decode(String) 方法,其它的用Base64.decodeBuffer(String) 。现在这些文件都正常了。不过还有很多不同格式的文件还没有测试。 再有一个问题: transport.connect("email-smtp.……
yjflinchong 2012-11-22
  • 打赏
  • 举报
回复
这个发送 xml到没试过。 一般是发送图片 和 txt doc等。
SambaGao 2012-11-22
  • 打赏
  • 举报
回复
Thanks again. 目前我是这样解决的。关于 text/xml and text/txt 类型的用Base64.decode(String) 方法,其它的用Base64.decodeBuffer(String) 。现在这些文件都正常了。不过还有很多不同格式的文件还没有测试。 再有一个问题: transport.connect("email-smtp.us-east-1.amazonaws.com", emailUser, emailPassword); 执行到这儿,就不走了,也没有出现异常。 我觉得是connect方法里面出现了问题。 我加了一条session.setDebug(true); DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc] DEBUG SMTP: useEhlo true, useAuth true DEBUG SMTP: trying to connect to host "email-smtp.us-east-1.amazonaws.com", port 25, isSSL false
引用 19 楼 dracularking 的回复:
对于doc or png or xls这些类型的文件,是不是要以文件的形式从服务端读出? 最终在邮件程序中应该类型这样用的吧? Java code?1234MimeBodyPart rarAttachment = new MimeBodyPart(); FileDataSource rarFile = new FileDataSou……
SambaGao 2012-11-21
  • 打赏
  • 举报
回复
非常抱歉, 读文件的是一个jar,我仅仅调用了一下,它在服务器上的类型是Base64.
dracularking 2012-11-21
  • 打赏
  • 举报
回复
那你这第二个问题和java mail没本质关系了,相当于是独立的一个问题(我以为有关系) 等于是从网络去读取一个附件文件流是吧,你把相关代码发一下最好
SambaGao 2012-11-21
  • 打赏
  • 举报
回复
引用 15 楼 dracularking 的回复:
引用 14 楼 nihaozhangchao 的回复:这是因为从服务器上读出来的时候就是Base64加密的。 是收邮件打开邮件附件时,对附件内容进行解密? 即使是程序收附件,这些应该都是java mail封状的内部细节,不清楚你(使用者)为什么会涉及到
可能是我没有说清楚, 是这样的,我的目的是发邮件,可是发邮件的内容和附件是从服务器上读出来的。再读出来后(我怀疑在读完后文件被加密了)再发邮件。
dracularking 2012-11-21
  • 打赏
  • 举报
回复
引用 14 楼 nihaozhangchao 的回复:
这是因为从服务器上读出来的时候就是Base64加密的。
是收邮件打开邮件附件时,对附件内容进行解密? 即使是程序收附件,这些应该都是java mail封状的内部细节,不清楚你(使用者)为什么会涉及到
SambaGao 2012-11-21
  • 打赏
  • 举报
回复
引用 13 楼 dracularking 的回复:
MimeBodyPart report = new MimeBodyPart(); report.setFileName(email.getFileName()); report.setContent(email.getAttachmentAsText(), "text/xml"); multiPart.addBodyPart(report); ……
这是因为从服务器上读出来的时候就是Base64加密的。
dracularking 2012-11-21
  • 打赏
  • 举报
回复
对于doc or png or xls这些类型的文件,是不是要以文件的形式从服务端读出? 最终在邮件程序中应该类型这样用的吧?

MimeBodyPart rarAttachment = new MimeBodyPart();               
FileDataSource rarFile = new FileDataSource("C:/my-file.rar");               rarAttachment.setDataHandler(new DataHandler(rarFile));               rarAttachment.setFileName(rarFile.getName());              
multiPart.addBodyPart(rarAttachment);  
dracularking 2012-11-20
  • 打赏
  • 举报
回复
MimeBodyPart report = new MimeBodyPart(); report.setFileName(email.getFileName()); report.setContent(email.getAttachmentAsText(), "text/xml"); multiPart.addBodyPart(report); 你是说把email.getAttachmentAsText()得到的这段字符串以Base64解密有乱码是吧?我觉得可以理解,doc and xls and png本身就不像txt or xml是文本型的,这是它们最大的区别,可能是内容展现方式不一样 p.s.为什么要这样解密呢?
SambaGao 2012-11-20
  • 打赏
  • 举报
回复
MimeBodyPart rarAttachment = new MimeBodyPart(); FileDataSource rarFile = new FileDataSource("C:/my-file.rar"); rarAttachment.setDataHandler(new DataHandler(rarFile)); rarAttachment.setFileName(rarFile.getName()); 主要是这块,我读出来的内容应该是Base64加密后的。 rarAttachment.setContent(str) // str 应该是Base64加密的,因为我用Base64解密txt or xml 后都可以正常显示,可是doc or png or xls 就是乱码了。 multiPart.addBodyPart(rarAttachment);
dracularking 2012-11-20
  • 打赏
  • 举报
回复
引用 9 楼 nihaozhangchao 的回复:
今天试了几种方法。读文件的时候设置成Base64 位, 可是再发send email 的时候,用Base64解密,后txt and csv 就正常显示了, 可以doc and xls and png 像这样的文件不能正常显示。求解。 引用 8 楼 dracularking 的回复:引用 5 楼 nihaozhangchao 的回复:再此先谢谢dracularkin……
发好邮件以后,收也是用java程序收的?
dracularking 2012-11-20
  • 打赏
  • 举报
回复
看看这个,它的类型貌似是xml的 http://www.openscope.net/2010/07/25/sending-attachments-with-the-javamail-api/

    package com.faceroller.mail;  
      
    public class Mailer {  
          
        private static final Log log = LogFactory.getLog(Mailer.class);  
      
        public static void send(Email email)  
                throws MessagingException, NamingException, IOException {  
      
            /** 
             * prefer the jndi lookup in your container, but when debugging 
             * manually setting properties explicitly will do 
             *  
             */  
      
            // InitialContext ictx = new InitialContext();  
            // Session session = (Session) ictx.lookup("java:/Mail");  
      
            Properties props = (Properties) System.getProperties().clone();  
            props.put("mail.transport.protocol", "smtp");  
            props.put("mail.smtp.host", host);  
            props.put("mail.smtp.port", port);  
            props.put("mail.debug", "true");  
      
            /** 
             * create the session and message 
             *  
             */  
            Session session = Session.getInstance(props, null);  
      
            /** 
             * set the message basics 
             *  
             */  
            MimeMessage message = new MimeMessage(session);  
            Message.setFrom(InternetAddress.parse(email.getFrom(), false)[0]);  
            message.setSubject(email.getSubject());  
            message.setRecipients(  
                javax.mail.Message.RecipientType.TO,  
                InternetAddress.parse(email.getTo(), false)  
            );  
      
      
            /** 
             * multipart attachments here, part one is the message text,  
             * the other is the actual file. notice the explicit mime type  
             * declarations 
             *  
             */  
            Multipart multiPart = new MimeMultipart();  
      
            MimeBodyPart messageText = new MimeBodyPart();  
            messageText.setContent(email.getBodyAsText(), "text/plain");  
            multiPart.addBodyPart(messageText);  
      
            MimeBodyPart report = new MimeBodyPart();  
            report.setFileName(email.getFileName());  
            report.setContent(email.getAttachmentAsText(), "text/xml");  
            multiPart.addBodyPart(report);  
      
            MimeBodyPart rarAttachment = new MimeBodyPart();  
            FileDataSource rarFile = new FileDataSource("C:/my-file.rar");  
            rarAttachment.setDataHandler(new DataHandler(rarFile));  
            rarAttachment.setFileName(rarFile.getName());  
            multiPart.addBodyPart(rarAttachment);  
      
            /** 
             * set the message's content as the multipart obj 
             */  
            message.setContent(multiPart);  
      
      
            /** 
             * do the actual sending here 
             *  
             */  
            Transport transport = session.getTransport("smtp");  
      
            try {  
      
                transport.connect(username, password);  
                transport.sendMessage(message, message.getAllRecipients());  
      
                log.warn("Email message sent");  
      
            } finally {  
                transport.close();  
            }  
        }  
    }  
加载更多回复(8)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧