【问题标题】:I am sending different-different PDF to different mail from excel file using Java mail API, getting corrupted on receivers mail?我正在使用 Java 邮件 API 从 excel 文件将不同的 PDF 发送到不同的邮件,在接收者邮件上被损坏?
【发布时间】:2018-03-26 15:20:12
【问题描述】:

我是 java 邮件 API 的新用户。我正在尝试发送不同的- 不同的 PDF 到不同的电子邮件 ID。这里的电子邮件 ID 和文件路径是 使用另一个返回的 ArrayList 从 excel 文件中获取 班级。但附件在接收者邮件上已损坏。一世 已经检查了堆栈溢出相关的所有问题和答案 到这个问题,但什么都行不通。请帮我。我有 给定我写的程序。请帮帮我。

package emailsending;

import java.util.ArrayList;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class Email {

    String username;
    String password;
    String excelFileName;
    String result = null;
    String filename, status;
    ArrayList email;

    byte[] buf = {};
    ArrayList list_filename;
    public Email(String username, String password, String excelFileName) {
        this.username = username;
        this.password = password;
        this.excelFileName = excelFileName;
        excelReading er = new excelReading(excelFileName);
        ArrayList li = er.email_file();
        email = (ArrayList) li.get(0);
        list_filename = (ArrayList) li.get(1);
    }

    public Email() {

    }

    public String sendToAll() {
        try {
            Properties props = System.getProperties();
            props.put("mail.smtp.starttls.enable", "true");
            props.setProperty("mail.transport.protocol", "smtp");
            props.setProperty("mail.host", "smtp.gmail.com");
            props.put("mail.smtp.port", "465");
            props.put("mail.smtp.SocketFactory.port", "465");
            props.put("mail.smtp.SocketFactory.class", "javax.net.ssl.ssLSocketFactory");
            System.err.println("Properties set----");

            Session session = Session.getDefaultInstance(props);
            session.setDebug(false);

            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username));
            message.setSubject("Client Receipt");
            //1. First body part
            MimeBodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.setText("This is your receipt");

            MimeMultipart multipart = new MimeMultipart();

            MimeBodyPart fileBodyPart = new MimeBodyPart();
            for (int i = 0; i < email.size(); i++) {
                status = "Sending first mail:-" + email.get(i);
                System.err.println(status);
                message.setRecipients(Message.RecipientType.TO,
                        InternetAddress.parse(((String) email.get(i)).trim()));
                filename = ((String) list_filename.get(i)).trim();
                DataSource source = new FileDataSource(filename);
                DataHandler lDataHandler = new DataHandler(source);

                fileBodyPart.setDataHandler(lDataHandler);
                fileBodyPart.setFileName(filename);

                multipart.addBodyPart(fileBodyPart);
                multipart.addBodyPart(messageBodyPart);

                message.setContent(multipart);

                Transport transport = session.getTransport("smtps");
                transport.connect("smtp.gmail.com", username, password);
                transport.sendMessage(message, message.getAllRecipients());
                result = "Sucessfully sent Email";
            }
        } catch (Exception ex) {
            result = "Unable to send Email" + ex.getMessage();
            System.out.print(ex);
        }
        return result;
    }
}

【问题讨论】:

    标签: java email pdf jakarta-mail email-attachments


    【解决方案1】:

    JavaMail 尝试根据附件的内容为附件选择正确的编码。在极少数情况下,某些文件(例如 pdf 文件)看起来像是纯文本文件,但实际上包含二进制数据,从而导致 JavaMail 选择错误的编码。尝试使用MimeBodyPart method that allows you to specify the encoding,并使用“base64”编码。如果这不能解决问题,我们将需要更多关于接收到的文件是如何“损坏”的详细信息。

    【讨论】:

    • 我已经尝试过你的建议,但还是不行。我已经尝试过的标题: fileBodyPart.setDataHandler(lDataHandler); fileBodyPart.setFileName(lDataHandler.getName()); fileBodyPart.setHeader("Content-Type", "multipart/mixed"); fileBodyPart.setHeader("内容传输编码", "base64"); multipart.addBodyPart(fileBodyPart); multipart.addBodyPart(messageBodyPart);
    • 您是否添加了所有这些标题,或者您是否按照我的建议进行操作?如果它仍然不起作用,我需要更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多