Тело Javamail не отображается вместе с вложением - PullRequest
0 голосов
/ 11 февраля 2020

Итак, у меня проблема с Javamail, когда при отправке вложения в теле тело исчезает. Когда я не отправляю вложение вместе с почтой, я вижу только тело.

Мой GMailSender. java:

public GMailSender(String user, String password) {
        this.user = user;
        this.password = password;

        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");
        props.setProperty("mail.host", mailhost);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.quitwait", "false");

        session = Session.getDefaultInstance(props, this);
        _multipart = new MimeMultipart();
    }


    protected PasswordAuthentication getPasswordAuthentication()
    {
        return new PasswordAuthentication(user, password);
    }

    public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception
    {
        MimeMessage message = new MimeMessage(session);
        DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));
        message.setSender(new InternetAddress(sender));
        message.setSubject(subject);

        message.setText(body);
        message.setDataHandler(handler);
        if(_multipart.getCount() > 0)
            message.setContent(_multipart);
        if (recipients.indexOf(',') > 0)
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));
        else
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));
        Transport.send(message);

    }

    public void addAttachment(String filename) throws Exception
    {
        BodyPart messageBodyPart = new MimeBodyPart();
        DataSource source = new FileDataSource(filename);
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName(filename);

        _multipart.addBodyPart(messageBodyPart);
    }

Моя основная деятельность. java

        Button bt_send = findViewById(R.id.Alert);
        bt_send.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                BackgroundMail bm = new BackgroundMail(context);
                bm.setGmailUserName("***@gmail.com");
                bm.setGmailPassword("******");
                bm.setMailTo(to);
                bm.setFormSubject(value + " DOC/" + mTvResult.getText().toString());
                bm.setFormBody("Document Nummer:\n" + mTvResult.getText().toString() + "\n \nDocument Type:\n" + value);
                if (images.size() > 0) {
                    for (Object file : images) {
                        bm.setAttachment(file.toString());
                    }
                }
                bm.setSendingMessage("Loading...");
                bm.setSendingMessageSuccess("The mail has been sent successfully.");
                bm.send();
            }
        });

Так как же я могу добавить вложение, но при этом видеть само тело?

Заранее спасибо!

1 Ответ

0 голосов
/ 11 февраля 2020

Похоже, вы скопировали GMailSender от кого-то еще. Вам следует начать с исправления всех этих распространенных ошибок .

. Вы никогда не вызываете метод addAttachment. (Обратите внимание, что вы можете заменить этот метод методом MimeBodyPart.attachFile ). Пожалуйста, не забудьте опубликовать код, который вы фактически используете.

Главное, чего вам не хватает, это то, что для составного сообщения основная часть тела должна быть первой частью тела в многочастном. Ваш вызов Message.setContent(_multipart); перезаписывает содержимое сообщения, которое было установлено вашим вызовом на message.setDataHandler(handler);, что также перезаписывает содержимое, установленное вашим вызовом на message.setText(body);.

Вместо установки этого содержимого в сообщении, вам нужно создать еще один MimeBodyPart, установить содержимое этого MimeBodyPart, а затем добавить этот MimeBodyPart в качестве первой части составного элемента.

...