【问题标题】:JavaMail MIME attachment link by cidcid 的 JavaMail MIME 附件链接
【发布时间】:2018-04-26 22:14:30
【问题描述】:

背景

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

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

问题

我可以使用包含 HTML 的 JavaMail 发送一封电子邮件,其中包含一个链接,该链接应指向附件,以允许通过该链接下载该文件。点击 Gmail 中的链接(PC 上的 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;
}

【问题讨论】:

    标签: ios jakarta-mail html-email email-attachments


    【解决方案1】:

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

    【讨论】:

    • 我已经改成 Multipart multipart = new MimeMultipart("related");并移动了 multipart.addBodyPart(messageBodyPart);在 multipart.addBodyPart(messageBodyText); 之后但仍然在 Gmail 上获得 404。附件在 Gmail 中可见,但在 iPhone 上的“邮件”中不再可见。
    • 404。这是一个错误。在此服务器上未找到请求的 URL /zaFuceKimZiT1vmMERY.......=s0-l75-ft-l75-ft。这就是我们所知道的。
    • 如果我将字符串文件设置为图像文件并且字符串 MY_HTML_MESSAGE = "

      My HTML

      " ,注释掉 messageBodyPart.setFileName 行和 messageBodyPart.setHeader 行,图像确实出现在生成的电子邮件中
    • 对不起比尔。不,它不能解决我需要的问题。它似乎适用于图像,但不适用于下载链接。您认为这是电子邮件客户端软件的限制吗?
    • 可能。你真的在挑战大多数邮寄者的极限。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多