Вложение в Java
Письмо с текстом и файлом собирают как
MimeMultipart: первая MimeBodyPart -
обычный текст, вторая - вложение с именем файла и
данными из ByteArrayDataSource.
Байты создают в программе, без чтения с диска. После отправки проверяют, что принято одно составное сообщение:
import com.icegreen.greenmail.util.GreenMail;
import com.icegreen.greenmail.util.ServerSetupTest;
import jakarta.activation.DataHandler;
import jakarta.mail.Message;
import jakarta.mail.Session;
import jakarta.mail.Transport;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeBodyPart;
import jakarta.mail.internet.MimeMessage;
import jakarta.mail.internet.MimeMultipart;
import jakarta.mail.util.ByteArrayDataSource;
import java.nio.charset.StandardCharsets;
import java.util.Properties;
public class Main {
public static void main(String[] args) throws Exception {
GreenMail server = new GreenMail(ServerSetupTest.SMTP);
server.start();
server.setUser("reader@local.test", "reader", "pass");
Properties props = new Properties();
props.put("mail.smtp.host", "127.0.0.1");
props.put(
"mail.smtp.port",
String.valueOf(server.getSmtp().getPort()),
);
props.put("mail.smtp.auth", "false");
Session session = Session.getInstance(props);
MimeBodyPart textPart = new MimeBodyPart();
textPart.setText("See the attached note.");
byte[] fileBytes = "price=19".getBytes(StandardCharsets.UTF_8);
MimeBodyPart filePart = new MimeBodyPart();
filePart.setFileName("quote.txt");
filePart.setDataHandler(
new DataHandler(
new ByteArrayDataSource(fileBytes, "text/plain"),
),
);
MimeMultipart parts = new MimeMultipart();
parts.addBodyPart(textPart);
parts.addBodyPart(filePart);
MimeMessage letter = new MimeMessage(session);
letter.setFrom(new InternetAddress("writer@local.test"));
letter.setRecipient(
Message.RecipientType.TO,
new InternetAddress("reader@local.test"),
);
letter.setSubject("With attachment");
letter.setContent(parts);
Transport.send(letter);
MimeMessage saved = server.getReceivedMessages()[0];
MimeMultipart multipart = (MimeMultipart) saved.getContent();
System.out.println(multipart.getCount());
server.stop();
}
}
Число 2 означает две части: текст и вложение.
Имя quote.txt попадает в заголовок части с
файлом.
Добавьте вложение data.bin из четырех байт
1, 2, 3 и 4.
Выведите число частей принятого письма.
Оставьте текстовую часть с фразой "Attached."
и вторую часть с байтами строки "ok".
Имя файла задайте "flag.txt". Выведите
getCount у MimeMultipart из ящика.