У меня есть фрагмент кода, который генерирует сообщение электронной почты.
@Override
public void sendMessageWithAttachment(List<Approver> approvers, String contractorEmail, InvoiceData invoice, File file, boolean isAccountancy) {
try {
String content;
MimeMessage message = emailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
String fullName = invoice.getData().getFirstName() + " " + invoice.getData().getLastName();
helper.setSubject(fullName
+ SUBJECT + getMonthAndYearFromDate(invoice.getReceptionDate()));
helper.setText("test");
content = mailContentBuilder.build(invoice.getId(), fullName, contractorEmail);
helper.setText(content, true);
helper.addAttachment(invoice.getData().getFirstName() + "_" + invoice.getData().getLastName()
+ PZD + getMonthAndYearFromDate(invoice.getReceptionDate()).toUpperCase() + ".pdf", file);
String mainEmail = approvers.get(0).getEmail();
helper.setTo(mainEmail);
if (approvers.size() > 1) {
approvers.stream()
.filter(i -> mainEmail.equals(i.getEmail())).findAny()
.ifPresent(i -> approvers.remove(i));
String[] emailList = (approvers.stream().map(Approver::getEmail).toArray(String[]::new));
helper.setCc(emailList);
}
helper.setFrom(new InternetAddress("noreply@l4a-soft.com", "L4A Website", "UTF8"));
emailSender.send(message);
} catch (MessagingException | UnsupportedEncodingException e) {
e.printStackTrace();
}
}
он использует следующие операции импорта, связанные с электронной почтой:
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
Когда яЗапустив мое приложение на тестовом сервере, все работает нормально, письма отправляются правильно.
На производительном сервере - заголовки писем теряют польские символы, превращая их в мерзость, подобную этой:
=UTF-8_Q_Grzegorz=5F=C5=BB=C3=B3=C5=82tek-PZD-WRZESIE_;_filename_1==C5=83
И это должно выглядеть так - Grzegorz Żółtek-PZD-WRZESIEŃ.pdf
У меня была проблема с этим классом ранее, на тестовом сервере он правильно писал названия месяцев (пример: WRZESIEŃ - SEPTEMBER). Но после перехода к профессии он начал менять название с польского на английский. Код, ответственный за это:
private static String getMonthAndYearFromDate(Date date) {
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Warsaw"));
cal.setTime(date);
return new SimpleDateFormat("MMMM");
}
Я исправил это, изменив его на:
private static String getMonthAndYearFromDate(Date date) {
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Warsaw"));
cal.setTime(date);
return new SimpleDateFormat("MMMM", new Locale("pl")).format(cal.getTime());
}
, но я до сих пор не знаю, как решить проблему с символом блеска ...