Я использую 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");
multipart/alternative
, подобный эффект может быть и с вложениями. Возможно, реализация App Engine JavaMail предполагает, что частьtext/plain
будет сопровождать телоtext/html
? - person tx802   schedule 27.01.2014fileMimeBodyPart.SetHeader("Content-Type", "image/jpeg")
(или application/octet-stream). Но может быть более элегантным решением сделать setText и для составной части, я попробую. Большое спасибо за предложение - person BenTaylor   schedule 27.01.2014