2013-08-07 1 views
2

Я пытаюсь отправить электронное письмо с использованием кода Java, но работает от GroovyConsole. Он отлично работает, когда я просто отправляю электронное письмо без вложений, но он терпит неудачу, как только я добавляю в многостраничную логику для вложений.Отправка сообщения электронной почты: нет объекта DCH для MIME-типа multipart/mixed

EDIT: Я использую 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

THink это проблема классаLoader с консолью, см. Ниже :-) –

ответ

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

Я добавлял javax.mail jar с помощью опции Добавить Jar (s) To Classpath, поэтому я попытался добавить только GrabConfig сверху, и это не сработало. Для работы требуется Grab и Grabconfig. Благодаря! – twbbas

+0

@twbbas Рад, что я мог бы помочь :-) Я думаю, что mail api нужно искать некоторые типы mime, когда он добавляет вложения, а поскольку jar не загружается загрузчиком классов, который запускает скрипт, он не знает что делать. –

+0

Да, именно, JavaMail необходимо найти файлы конфигурации в файле jar. –

0

Я решил ту же проблему, выполнив следующие шаги.

1- Extract mail.jar файл (вы получите следующие папки после извлечения файла JAR ком, javax, META-INF) 2 Положите все вышеуказанные папки в папку классов 3- Перезагрузите веб-сервер.

 Смежные вопросы

  • Нет связанных вопросов^_^