Я пытаюсь автоматизировать прием почты с помощью Javax Mail API (1.6.1). Процесс идет следующим образом:
Прилагаемые документы любой входящей почты загружаются и вычисляется их хэш Хеш рассчитывается только с длиной в байтах и именем файла (в целях оптимизации).
Почта затем пересылается внешнему объекту, а хэш обновляется в базе данных.
Внешнее лицо отвечает (через какое-то правило в своем почтовом ящике) на сообщение, не загружая прикрепленный документ.
Я получаю «ACK», и для проверки целостности прикрепленных документов я снова скачиваю документы и вычисляю их хэш.
Проблема возникает, когда (иногда) хэш не равен. Если проверить более подробно, длина файла изменилась при пересылке, но я изменил только имя, после чего вычисляется хеш.
Можно подумать, что я трактую сообщения ACK и NORMAL (для пересылки) по-разному. Это не так, я обрабатываю оба сообщения как обычные сообщения до конца.
Это код, который я использую для прикрепления файлов.
void sendMail(args[]){
props = new Properties();
props.put("mail.smtp.host", host); // for gmail use smtp.gmail.com
props.put("mail.smtp.auth", true);
props.put("mail.smtp.port", port); //465
props.put("mail.smtp.socketFactory.port", port); //465
props.put("mail.smtp.starttls.enable", true);
props.put("mail.smtp.timeout", 30000);
mailSession = Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(from, password);
}
});
MimeMessage msg = new MimeMessage(mailSession);
msg.setFrom(new InternetAddress(from));
ccemail = cc;
ccUser = InternetAddress.parse(ccemail);
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
msg.setRecipients(Message.RecipientType.CC, ccUser);
msg.setSubject(subject);
//--[ Create the body of the mail
mbp1 = new MimeBodyPart();
mbp1.setText(body);
// create the second message part
mp = new MimeMultipart();
mp.addBodyPart(mbp1);
if ( files != null ){
for (String file : files) {
file = file.split(";", -1)[0];
if (subject.startsWith("Summary Doctodata"))
is = Utils.TmpFolder.getFileIs(file, "NO_TMP");
else if (subject.startsWith("Emergency"))
is = Utils.TmpFolder.getFileIs(file, "TMP");
mbp2 = new MimeBodyPart();
if (is == null)
is = Utils.TmpFolder.getFileIs(file);
if (is == null)
return false;
if (is != null)
is.close();
// attach the file to the message
if (subject.startsWith("Summary Doctodata"))
fds = new FileDataSource(file);
else
fds = new FileDataSource(Utils.Parameters.tempFolderPath + "temp/" + file);
mbp2.setDataHandler(new DataHandler(fds));
mbp2.setFileName(fds.getName());
mp.addBodyPart(mbp2);
}
}
// add the Multipart to the message
msg.setContent(mp);
// set the Date: header
msg.setSentDate(new Date());
Transport.send(msg);
is = null;
bytes = null;
Utils.gc();
return true;
}
}
}
Как возможно, что вложенные файлы изменяются по длине, если внешняя сущность даже не загружает вложенные документы? Почтовый сервер добавляет или изменяет какой-либо заголовок?
Есть ли какой-либо другой способ убедиться, что прилагаемые документы, отправленные этой внешней организации, и документы, которые мы получаем от этой организации, совпадают? Я также пробовал с File.hashCode()
, но он также меняется (имеет смысл, так как длина изменяется с самого начала).
Большое спасибо!