Ссылка вложения JavaMail MIME по cid - PullRequest
0 голосов
/ 27 апреля 2018

Фон

Я некоторое время ударился об это головой и не добился большого прогресса. Я создаю файлы MPEG_4 / AAC в Android и отправляю их по электронной почте в формате .mp3. Я знаю, что они на самом деле не являются файлами .mp3, но это позволяет Hotmail и Gmail воспроизводить их в Preview. Они не работают на iPhone, если только они не отправляются в виде файлов .m4a, что нарушает предварительный просмотр Outlook / Gmail.

Итак, я подумал о другом подходе, который заключается в том, чтобы прикреплять его как файл .mp3, но в теле письма есть ссылка HTML, которая позволяет загружать прикрепленный файл и задает имя файла .m4a. Пользователи Gmail / Outlook могут щелкнуть вложение напрямую, тогда как пользователи iPhone могут использовать ссылку HTML.

Issue

Я могу отправить электронное письмо, используя JavaMail с HTML-кодом, включая ссылку, которая должна указывать на вложенный файл, чтобы разрешить загрузку этого файла по ссылке. Нажав на ссылку в Gmail (Chrome на ПК), вы получите страницу 404, и iPhone просто игнорирует мое нажатие на ссылку.

Ниже приведен код, в котором я генерирую составное сообщение и назначаю CID для вложения, к которому я затем пытаюсь получить доступ, используя ссылку в части html. Такое ощущение, что я рядом, но, возможно, это иллюзия. Я был бы чрезвычайно благодарен, если бы кто-то мог помочь мне исправить это или спасти меня от боли, если это невозможно.

private int send_email_temp(){
    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.host", smtp_host_setting);
    //props.put("mail.debug", "true");
    props.put("mail.smtp.ssl.enable", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.port", smtp_port_setting);

    session = Session.getInstance(props);

    ActuallySendAsync_temp asy = new ActuallySendAsync_temp(true);
    asy.execute();

    return 0;
}


class ActuallySendAsync_temp extends AsyncTask<String, String, Void> {

    public ActuallySendAsync_temp(boolean boo) {
        // something to do before sending email
    }

    @Override
    protected Void doInBackground(String... params) {
        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username));
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse(recipient_email_address));
            message.setSubject(email_subject);

            Multipart multipart = new MimeMultipart();
            MimeBodyPart messageBodyPart = new MimeBodyPart();
            String file = mFileName;
            /**/
            DataSource source = new FileDataSource(file);
            messageBodyPart.setDataHandler(new DataHandler(source));
            /* /
            File ff = new File(file);
            try {
                messageBodyPart.attachFile(ff);
            } catch(IOException eio) {
                Log.e("Message Error", "Old Macdonald");
            }
            /* /
            messageBodyPart = new PreencodedMimeBodyPart("base64");
            byte[] file_bytes = null;
            File ff = new File(file);
            try {
                int length = (int) ff.length();
                BufferedInputStream reader = new BufferedInputStream(new FileInputStream(ff));
                file_bytes = new byte[length];
                reader.read(file_bytes, 0, length);
                reader.close();
            } catch (IOException eio) {
                Log.e("Message Error", "Old Macdonald");
            }
            messageBodyPart.setText(Base64.encodeToString(file_bytes, Base64.DEFAULT));
            messageBodyPart.setHeader("Content-Transfer-Encoding", "base64");
            /**/
            messageBodyPart.setFileName( DEFAULT_AUDIO_FILENAME );//"AudioClip.mp3");
            //messageBodyPart.setContentID("<audio_clip>");
            String content_id = UUID.randomUUID().toString();
            messageBodyPart.setContentID("<" + content_id + ">");
            messageBodyPart.setDisposition(Part.ATTACHMENT);//INLINE);
            messageBodyPart.setHeader("Content-Type", "audio/mp4");
            multipart.addBodyPart(messageBodyPart);
            MimeBodyPart messageBodyText = new MimeBodyPart();
            //final String MY_HTML_MESSAGE = "<h1>My HTML</h1><a download=\"AudioClip.m4a\" href=\"cid:audio_clip\">iPhone Download</a>";
            final String MY_HTML_MESSAGE = "<h1>My HTML</h1><a download=\"AudioClip.m4a\" href=\"cid:" + content_id + "\">iPhone Download</a>";
            messageBodyText.setContent( MY_HTML_MESSAGE, "text/html");
            multipart.addBodyPart(messageBodyText);
            message.setContent(multipart);

            Print_Message_To_Console(message);

            Transport transport = session.getTransport("smtp");
            transport.connect(smtp_host_setting, username, password);
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        } catch (MessagingException e) {
            e.printStackTrace();
        } finally {

        }

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        // something to do after sending email
    }
}

int Print_Message_To_Console(Message msg) {
    int ret_val = 0;
    int line_num = 0;

    InputStream in = null;
    InputStreamReader inputStreamReader = null;
    BufferedReader buff_reader = null;
    try {
        in = msg.getInputStream();
        inputStreamReader = new InputStreamReader(in);
        buff_reader = new BufferedReader(inputStreamReader);
        String temp = "";
        while ((temp = buff_reader.readLine()) != null) {
            Log.d("Message Line " + Integer.toString(line_num++), temp);
        }
    } catch(Exception e) {
        Log.d("Message Lines", "------------ OOPS! ------------");
        ret_val = 1;
    } finally {
        try {
            if (buff_reader != null) buff_reader.close();
            if (inputStreamReader != null) inputStreamReader.close();
            if (in != null) in.close();
        } catch(Exception e2) {
            Log.d("Message Lines", "----------- OOPS! 2 -----------");
            ret_val = 2;
        }
    }

    return ret_val;
}

1 Ответ

0 голосов
/ 27 апреля 2018

Вам необходимо создать составную / связанную и установить основную текстовую часть в качестве первой части тела.

...