cid

时间:2018-04-26 22:14:31

标签: ios javamail html-email email-attachments

背景

我已经反对这一段时间了,并没有取得多大进展。我在Android中生成MPEG_4 / AAC文件,并通过电子邮件发送为.mp3文件。我知道它们实际上并不是.mp3文件,但允许Hotmail和Gmail在预览中播放它们。他们不会在iPhone上工作,除非他们以.m4a文件的形式发送,而不会破坏Outlook / Gmail预览。

所以我想到了一种不同的方法,即附加为.mp3文件,但在电子邮件正文中有一个HTML链接,允许下载附加文件并指定.m4a文件名。 Gmail / Outlook用户可以直接点击附件,而iPhone用户可以使用HTML链接。

问题

我可以使用带有HTML的JavaMail发送一封电子邮件,其中包含一个指向附件的链接,以便链接下载该文件。点击Gmail中的链接(Chrome上的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 :(得分:0)

您需要create a multipart/related并将主要文本部分设置为第一个正文部分。