Android 在电子邮件中发送图像不起作用

Android 在电子邮件中发送图像不起作用,android,Android,我正在使用此代码(如下所示)通过电子邮件从我的android应用程序发送图像,该电子邮件已收到,但没有图像。请告诉我代码中有什么问题 收到的邮件: 电子邮件正文 代码: package com.example.appdeveloper.appname; import android.content.Context; import android.net.Uri; import android.os.AsyncTask; import java.io.File; import java.ut

我正在使用此代码(如下所示)通过电子邮件从我的android应用程序发送图像,该电子邮件已收到,但没有图像。请告诉我代码中有什么问题

收到的邮件: 电子邮件正文

代码:

package com.example.appdeveloper.appname;

import android.content.Context;
import android.net.Uri;
import android.os.AsyncTask;

import java.io.File;
import java.util.Properties;


import android.content.Context;
import android.os.AsyncTask;
import android.os.Environment;

import java.util.Properties;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;



public class EmailHandler extends AsyncTask<Void, Void, Boolean> {

    private static String to = "reciever@example.com";
    private static String from = "sender@example.com";
    private static String subject = "Subject";
    private static String sender = "Android App";
    private static String mail;
    private static String username = "sender";
    private static String password = "password";


    EmailHandler(Context context) {
        String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+"/test.png";
        mail ="<!DOCTYPE html><html><body><img src="+path+"></body></html>";
    }


    @Override
    protected Boolean doInBackground(Void... nothing) {
        try {
            Authenticator auth = new EmailAutherticator();
            Properties properties = new Properties();
            properties.setProperty("mail.smtp.auth", "true");
            properties.setProperty("mail.smtp.starttls.enable", "true");
            properties.setProperty("mail.smtp.host", "smtp.gmail.com");
            properties.setProperty("mail.smtp.port", "587");
            properties.setProperty("mail.smtp.user", username);
            properties.setProperty("mail.smtp.password", password);
            Session session = Session.getDefaultInstance(properties,auth);

            MimeMessage message = new MimeMessage(session);
            message.setSubject(subject);
            message.setContent(mail, "text/html; charset=utf-8");
            Address address = new InternetAddress(from,sender);
            message.setFrom(address);

            InternetAddress ad[] = new InternetAddress[2];
            ad[0] = new InternetAddress(to);
            ad[1] = new InternetAddress(from);
            message.addRecipients( Message.RecipientType.TO, ad );
            Transport.send(message);

            return true;
        }
        catch(Exception exp) {
            exp.printStackTrace();
            return false;
        }
    }

}



class EmailAutherticator extends Authenticator {

    private String username = "sender";
    private String password = "password";

    public EmailAutherticator() {
        super();
    }

    public EmailAutherticator(String user,String pwd){
        super();
        username = user;
        password = pwd;
    }

    public PasswordAuthentication getPasswordAuthentication(){
        return new PasswordAuthentication(username,password);
    }

}
package com.example.appdeveloper.appname;
导入android.content.Context;
导入android.net.Uri;
导入android.os.AsyncTask;
导入java.io.File;
导入java.util.Properties;
导入android.content.Context;
导入android.os.AsyncTask;
导入android.os.Environment;
导入java.util.Properties;
导入javax.mail.Address;
导入javax.mail.Authenticator;
导入javax.mail.Message;
导入javax.mail.PasswordAuthentication;
导入javax.mail.Session;
导入javax.mail.Transport;
导入javax.mail.internet.InternetAddress;
导入javax.mail.internet.mimessage;
公共类EmailHandler扩展了异步任务{
私有静态字符串to=”reciever@example.com";
私有静态字符串from=”sender@example.com";
私有静态字符串subject=“subject”;
私有静态字符串sender=“Android应用程序”;
私有静态字符串邮件;
私有静态字符串username=“sender”;
私有静态字符串password=“password”;
EmailHandler(上下文){
字符串路径=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u PICTURES)+“/test.png”;
mail=“”;
}
@凌驾
受保护的布尔doInBackground(无效…无){
试一试{
Authenticator auth=新的EmailAuthenticator();
属性=新属性();
setProperty(“mail.smtp.auth”、“true”);
properties.setProperty(“mail.smtp.starttls.enable”、“true”);
setProperty(“mail.smtp.host”、“smtp.gmail.com”);
setProperty(“mail.smtp.port”,“587”);
setProperty(“mail.smtp.user”,用户名);
setProperty(“mail.smtp.password”,password);
Session Session=Session.getDefaultInstance(属性,身份验证);
MimeMessage message=新MimeMessage(会话);
message.setSubject(主题);
message.setContent(邮件,“text/html;charset=utf-8”);
地址=新的Internet地址(发件人,发件人);
message.setFrom(地址);
InternetAddress ad[]=新的InternetAddress[2];
ad[0]=新的Internet地址(收件人);
ad[1]=新的Internet地址(从);
message.addRecipients(message.RecipientType.TO,ad);
传输。发送(消息);
返回true;
}
捕获(异常扩展){
exp.printStackTrace();
返回false;
}
}
}
类EmailAuthenticator扩展验证器{
私有字符串username=“sender”;
私有字符串password=“password”;
公共EmailAuthenticator(){
超级();
}
公共EmailAuthenticator(字符串用户,字符串pwd){
超级();
用户名=用户;
密码=pwd;
}
公共密码身份验证getPasswordAuthentication(){
返回新密码身份验证(用户名、密码);
}
}

所以你的电子邮件的正文是这样的(有点):


除非您在手机上阅读电子邮件,否则您的电子邮件将无法到达该位置

编辑1


您可以使用
intent.extra_STREAM
将额外数据附加到您的intent中,如Android文档中所述

您的HTML将如下所示:
如果您将该HTML复制到一个文件中,并尝试在桌面Web浏览器中查看它,它将无法工作。
src
属性没有任何方案,因此它将被解释为相对于显示HTML文件的位置,并且您的桌面计算机在该路径上没有图像。@Commonware那么我应该如何成功发送图像?将图像作为附件发送。或者,将图像上载到Web服务器,然后在HTML电子邮件正文中使用Web服务器上的
https
URL。仅引用电子邮件正文中的文件系统路径不会传输图像。@Commonware我希望在不与用户交互的情况下发送电子邮件。我的任何一条评论中都没有需要用户交互的内容。因此,我应该如何成功发送图像?请参阅我希望在不与用户交互的情况下发送电子邮件。那么,是什么阻止了您?您将
Intent.EXTRA\u流、Uri.fromFile(downloadedPic)
附加到
android.content.Intent.ACTION\u SEND
Intent。我尝试过您的解决方案,它会弹出选择器
startActivity(Intent.createChooser(emailIntent,“发送邮件…”)请检查它。
<!DOCTYPE html><html><body><img src="\myPhone\DCIM\image.png"></body></html>