Tôi đã viết một ứng dụng nhận tất cả email từ một hộp thư đến, lọc các email có chứa một chuỗi cụ thể và sau đó đặt các email đó trong một ArrayList.Làm cách nào để xử lý nhiều thư/thư thay thế bằng JavaMail?
Sau khi email được đưa vào Danh sách, tôi đang thực hiện một số nội dung với chủ đề và nội dung của các email đã nêu. Điều này làm việc tốt cho e-mail mà không có phần đính kèm. Nhưng khi tôi bắt đầu sử dụng e-mail với các tập tin đính kèm, tất cả đều không hoạt động như mong đợi nữa.
Đây là mã của tôi:
public void getInhoud(Message msg) throws IOException {
try {
cont = msg.getContent();
} catch (MessagingException ex) {
Logger.getLogger(ReadMailNew.class.getName()).log(Level.SEVERE, null, ex);
}
if (cont instanceof String) {
String body = (String) cont;
} else if (cont instanceof Multipart) {
try {
Multipart mp = (Multipart) msg.getContent();
int mp_count = mp.getCount();
for (int b = 0; b < 1; b++) {
dumpPart(mp.getBodyPart(b));
}
} catch (Exception ex) {
System.out.println("Exception arise at get Content");
ex.printStackTrace();
}
}
}
public void dumpPart(Part p) throws Exception {
email = null;
String contentType = p.getContentType();
System.out.println("dumpPart" + contentType);
InputStream is = p.getInputStream();
if (!(is instanceof BufferedInputStream)) {
is = new BufferedInputStream(is);
}
int c;
final StringWriter sw = new StringWriter();
while ((c = is.read()) != -1) {
sw.write(c);
}
if (!sw.toString().contains("<div>")) {
mpMessage = sw.toString();
getReferentie(mpMessage);
}
}
Các nội dung từ các e-mail được lưu trữ trong một String.
Mã này hoạt động tốt khi tôi cố đọc thư mà không có tệp đính kèm. Nhưng nếu tôi sử dụng một e-mail với tập tin đính kèm, String cũng chứa mã HTML và thậm chí cả mã hóa tệp đính kèm. Cuối cùng tôi muốn lưu trữ tập tin đính kèm và nội dung của một e-mail, nhưng ưu tiên hàng đầu của tôi là chỉ nhận được văn bản mà không cần bất kỳ mã HTML hoặc tệp đính kèm nào.
Bây giờ tôi đã cố gắng một cách tiếp cận khác nhau để xử lý các bộ phận khác nhau:
public void getInhoud(Message msg) throws IOException {
try {
Object contt = msg.getContent();
if (contt instanceof Multipart) {
System.out.println("Met attachment");
handleMultipart((Multipart) contt);
} else {
handlePart(msg);
System.out.println("Zonder attachment");
}
} catch (MessagingException ex) {
ex.printStackTrace();
}
}
public static void handleMultipart(Multipart multipart)
throws MessagingException, IOException {
for (int i = 0, n = multipart.getCount(); i < n; i++) {
handlePart(multipart.getBodyPart(i));
System.out.println("Count "+n);
}
}
public static void handlePart(Part part)
throws MessagingException, IOException {
String disposition = part.getDisposition();
String contentType = part.getContentType();
if (disposition == null) { // When just body
System.out.println("Null: " + contentType);
// Check if plain
if ((contentType.length() >= 10)
&& (contentType.toLowerCase().substring(
0, 10).equals("text/plain"))) {
part.writeTo(System.out);
} else if ((contentType.length() >= 9)
&& (contentType.toLowerCase().substring(
0, 9).equals("text/html"))) {
part.writeTo(System.out);
} else if ((contentType.length() >= 9)
&& (contentType.toLowerCase().substring(
0, 9).equals("text/html"))) {
System.out.println("Ook html gevonden");
part.writeTo(System.out);
}else{
System.out.println("Other body: " + contentType);
part.writeTo(System.out);
}
} else if (disposition.equalsIgnoreCase(Part.ATTACHMENT)) {
System.out.println("Attachment: " + part.getFileName()
+ " : " + contentType);
} else if (disposition.equalsIgnoreCase(Part.INLINE)) {
System.out.println("Inline: "
+ part.getFileName()
+ " : " + contentType);
} else {
System.out.println("Other: " + disposition);
}
}
Đây là những gì được trả về từ các System.out.printlns
Null: multipart/alternative; boundary=047d7b6220720b499504ce3786d7
Other body: multipart/alternative; boundary=047d7b6220720b499504ce3786d7
Content-Type: multipart/alternative; boundary="047d7b6220720b499504ce3786d7"
--047d7b6220720b499504ce3786d7
Content-Type: text/plain; charset="ISO-8859-1"
'Text of the message here in normal text'
--047d7b6220720b499504ce3786d7
Content-Type: text/html; charset="ISO-8859-1"
Content-Transfer-Encoding: quoted-printable
'HTML code of the message'
Cách tiếp cận này sẽ trả về văn bản bình thường của e-mail nhưng cũng là mã HTML của thư. Tôi thực sự không hiểu tại sao điều này xảy ra, tôi đã googled nó nhưng có vẻ như không có ai khác với vấn đề này.
Bất kỳ trợ giúp nào được đánh giá cao,
Cảm ơn!
Làm cách nào để tạo các trường hợp 'Tin nhắn'? Bạn có sử dụng triển khai mặc định JavaMail không, phiên bản nào? Bạn có thao túng thân thể của các thông điệp của mình bằng cách nào đó trước khi cho chúng ăn 'thói quen getInhoud' không? Tôi vừa thử mẫu mã của bạn và nó đã làm việc cho tôi (JM 1.4.5). –
Gợi ý hữu ích: Nếu bạn muốn câu trả lời cụ thể cho câu hỏi của bạn, hãy thử cung cấp cho chúng tôi một SSCCE (http://sscce.org/). –