2013-08-07 115 views
2

我试图使用Java代码发送电子邮件,但是从GroovyConsole运行。当我只发送一封没有附件的电子邮件时,它工作正常,但只要添加了附件的多部分逻辑,它就会失败。发送电子邮件:无对象DCH用于MIME类型multipart/mixed

编辑:我使用JavaMail版本1.4.7

这是我得到的错误。

javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed; 

boundary="----=_Part_16_24710054.1375885523061" 

at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:891) 

它发生在下面的Transport.send(mimeMsg)行上。

import java.util.Properties; 
import javax.mail.*; 
import javax.mail.internet.*; 
import javax.activation.*; 


Properties properties = new Properties() 
Session session 
MimeMessage mimeMsg 

properties.put("mail.smtp.host", "[my host ip]") 

session = Session.getDefaultInstance(properties) 
mimeMsg = new MimeMessage(session) 

String recipient = "[to email address]" 

mimeMsg.addRecipient(Message.RecipientType.TO, new InternetAddress(recipient)) 

mimeMsg.setSubject("This is the subject") 
mimeMsg.setText("This is the message #1") 

mimeMsg.setFrom(new InternetAddress("[from email address]")) 

BodyPart messageBodyPart = new MimeBodyPart() 
messageBodyPart.setText(mimeMsg.getContent())  
Multipart multipart = new MimeMultipart() 

String filePath = "[full & correct path to test.txt]" 
DataSource source = new FileDataSource(filePath) 
messageBodyPart.setDataHandler(new DataHandler(source)) 

String fileName = "test.txt" 
messageBodyPart.setFileName("test.txt") 

multipart.addBodyPart(messageBodyPart) 

mimeMsg.setContent(multipart) 

Transport.send(mimeMsg) 

println "Message Sent!" 
+0

您使用的是什么版本的JavaMail? –

+0

我使用的版本是1.4.7 – twbbas

+0

这是一个ClassLoader问题与控制台,请参阅下面:-) –

回答

1

我认为这是一个类加载器的问题做groovyConsole中运行的方式......

如果我添加以下@Grab@GrabcConfig的脚本,它的工作原理...

@Grab('javax.mail:mail:1.4.7') 
@GrabConfig(systemClassLoader=true, initContextClassLoader=true) 
import javax.mail.* 
import javax.mail.internet.* 
import javax.activation.* 

def props = new Properties().with { p -> 
    p.'mail.smtp.host' = 'my mail server' 
    p 
} 

def session = Session.getDefaultInstance(props) 

def message = new MimeMessage(session) 

message.addRecipient(Message.RecipientType.TO, new InternetAddress('to address')) 
message.subject = 'This is the subject' 
message.text = 'This is the message #1' 
message.from = new InternetAddress('from address') 

def textpart = new MimeBodyPart() 
textpart.text = 'This is the message #2' 

def attachment = new MimeBodyPart() 
attachment.dataHandler = new DataHandler(new FileDataSource('/path/to/file.txt')) 
attachment.fileName = 'file.txt' 

def multi = new MimeMultipart() 
multi.addBodyPart(textpart) 
multi.addBodyPart(attachment) 

message.content = multi 

Transport.send(message) 

或者,删除两行@Grab@GrabConfig行,并通过命令行运行:

groovy -cp /path/to/mail-1.4.7.jar:/path/to/activation-1.1.jar mail.groovy 
+0

我通过添加Jar(s)添加javax.mail jar到类路径选项,所以我尝试添加只是GrabConfig从上面,它不会工作。它需要Grab和Grabconfig才能工作。谢谢! – twbbas

+0

@twbbas很高兴我可以帮忙:-)我认为邮件api需要在添加附件时查找一些MIME类型,并且由于运行脚本的类加载器未加载jar,所以它不知道该怎么办。 –

+0

确实,JavaMail需要在jar文件中查找配置文件。 –

0

我已经通过以下步骤解决了同样的问题。

1-提取物的mail.jar文件 2-将上述所有文件夹中的文件夹类的3- 重新启动您的Web服务器(你会得到解压jar文件 融为一体,使用javax,META-INF后下面的文件夹)。

相关问题