JavaMail на Google App Engine изпраща HTML имейл с прикачени файлове - игнорира първия прикачен файл

Използвам Java на Google App Engine и се опитвам да изпратя имейл с множество прикачени файлове.

Това, което откривам е, че по някаква причина липсва първият прикачен файл. По принцип, ако filesToAttach съдържа 1 файл, тогава няма да има прикачени файлове. Ако filesToAttach съдържа 4 файла - A, B, C и D, тогава съобщението, което идва, ще има прикачени B, C и D. Наистина странно.

Кодът, който използвам, е както по-долу. Всички предложения за това как да се коригира това много се оценяват.

Резултатът, генериран от извикванията на log.info, изглежда показва правилния брой прикачени файлове.

    Properties props = new Properties();
    Session session = Session.getInstance(props);
    Message message = new MimeMessage(session);
    String fromEmail = "admin@" + ApiProxy.getCurrentEnvironment().getAppId() + ".appspotmail.com";
    message.setFrom(new InternetAddress(fromEmail, "MyApp Admin"));
    message.addRecipients(Message.RecipientType.BCC, addresses);
    message.setSubject(subject);
    MimeMultipart multipart = new MimeMultipart();

    MimeBodyPart htmlPart = new MimeBodyPart();
    htmlPart.setContent(htmlBody, "text/html");
    multipart.addBodyPart(htmlPart);

    for(FileToAttach fileToAttach : filesToAttach) {
      MimeBodyPart fileMimeBodyPart = new MimeBodyPart();
      DataSource dataSource = new ByteArrayDataSource(fileToAttach.getContents(), "application/octet-stream");
      fileMimeBodyPart.setDataHandler(new DataHandler(dataSource));
      fileMimeBodyPart.setFileName(fileToAttach.getFileName());
      log.info("attaching file " + fileToAttach.getFileName() + " of " + fileToAttach.getContents().length + " bytes");
      multipart.addBodyPart(fileMimeBodyPart);
    }

    message.setContent(multipart);
    log.info("the multipart contains " + multipart.getCount() + " parts and isComplete = " + multipart.isComplete());
    Transport.send(message);
    log.info("called Transport.send");

person BenTaylor    schedule 26.01.2014    source източник
comment
Грозно решение би било да поставите празен фиктивен файл като първи запис във filesToAttach ;-) Това осигурява желания резултат, докато вие отделяте повече време за търсене на правилното решение. Нямам опит с многочастна поща, но симптомите показват, че първият прикачен файл може да се комбинира с htmlPart, но не се показва, защото не е html форматиран. Опитайте се да добавите нещо, което ще ограничи края на тялото на html, преди да добавите прикачените файлове.   -  person Martin Berends    schedule 26.01.2014
comment
Не виждам нищо явно нередно. Може да искате да зададете разположението на прикачените файлове (метод setDisposition) или да опростите кода си с помощта на метода attachFile. Също така, точно преди Transport.send, направете message.writeTo(new FileOutputStream(msg.txt)) и след това вижте дали msg.txt има всички прикачени файлове. Ако нищо от това не дава улики, възможно е Google App Engine да има повредена версия на JavaMail.   -  person Bill Shannon    schedule 26.01.2014
comment
Възможно е решението на този проблем (който аз наблюдавах в App Engine) може да помогне. Въпреки че това се отнася за multipart/alternative, може да има подобен ефект с прикачените файлове. Може би внедряването на JavaMail на App Engine очаква да има част text/plain, която да придружава тялото text/html?   -  person tx802    schedule 27.01.2014
comment
Аха Мисля, че това може да е в правилната посока, защото ако прикача две изображения, типът mime на първото е текст/обикновен. Изглежда, че го заобиколих, като направих fileMimeBodyPart.SetHeader("Content-Type", "image/jpeg") (или приложение/октет-поток). Но може да е по-елегантно решение да се направи setText и на multipart, ще го пробвам. Благодаря много за предложението   -  person BenTaylor    schedule 27.01.2014