【问题标题】:attaching file and sending mail using smtp in android在android中使用smtp附加文件和发送邮件
【发布时间】:2013-03-21 12:57:43
【问题描述】:

在我的应用程序中,我正在使用 smtp 发送邮件。我想将图像文件附加到邮件中。我该如何附加它?我试过了。但没有在邮件中获取图像。它给出了小图标。 请帮助。在此先感谢。 下面是邮件代码和邮件的外观-

 public class MailImageFile extends javax.mail.Authenticator {

public MailImageFile(){

}
public void Mail(String user, String pass) {    

    Properties props = new Properties();
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.socketFactory.port", "465");
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.port", "465");

    Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(USERNAME, PASSWORD);
        }
        });
    try {

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress(USERNAME));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(TO));
        message.setSubject("Testing Subject");     
       Multipart multipart = new MimeMultipart();


        MimeBodyPart messageBodyPart = new MimeBodyPart();
        DataSource source = new FileDataSource(new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/wallpaper.jpg"));
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName("image.png");
        messageBodyPart.setDisposition(MimeBodyPart.ATTACHMENT);
        messageBodyPart.setHeader("Content-ID","<vogue>");
        multipart.addBodyPart(messageBodyPart);

                  message.setContent(multipart);

        Transport.send(message);
    } catch (MessagingException e) {
        throw new RuntimeException(e);
    }           
}   
 }

【问题讨论】:

    标签: android gmail image-file


    【解决方案1】:

    你可以像这样附加文件

    指定将附加该文件的路径

    已编辑:

    Multipart _multipart; = new MimeMultipart();
    
    BodyPart messageBodyPart = new MimeBodyPart();
    
    File sdCard =Environment.getExternalStorageDirectory();     
    
    String path=sdCard.getAbsolutePath() + "/AttendanceSystem/MonthlyReport.xls";
    
    messageBodyPart.setFileName(path);
    
    _multipart.addBodyPart(messageBodyPart);
    
    // Put parts in message 
    
    msg.setContent(_multipart)
    

    按照上述方式进行操作,我刚刚在我的设备上测试了它的工作 n 附加 chk itenter code here

    【讨论】:

    • 我使用了您的代码。但无法正常工作。 ' 字符串路径 = sdCard.getAbsolutePath()+"xyz.JPEG"; message.setContent("Hi..."+"","text/html; charset=utf-8"); ' 但它不起作用。
    • 嘿,j0k,我刚刚编辑并看到它,我在我的设备上对其进行了测试,它的工作原理与你所说的推广网站的人相同..
    • 获取运行时异常。,IOExceptions - 无内容
    • 检查您的代码是否在清单文件中具有互联网权限
    • 字符串路径 = sdCard.getAbsolutePath()+"/v.png"; attachPart .setFileName(path);试试这条路
    【解决方案2】:

    三思而后行:

    使用javax.mail.util.ByteArrayDataSource:

    Multipart multipart = new MimeMultipart();
    DataSource source = new ByteArrayDataSource(imageFile, "image/bmp");
    
    // creates body part for the message
    MimeBodyPart messageBodyPart = new MimeBodyPart();
    messageBodyPart.setContent("Hi...", "text/html; charset=utf-8");
    
    MimeBodyPart attachPart;
    attachPart = new MimeBodyPart();
    attachPart .setDataHandler(new DataHandler(source));
    attachPart .setFileName(filename);
    
    multipart.addBodyPart(messageBodyPart);
    multipart.addBodyPart(attachPart);
    
    message.setContent(multipart);
    

    ByteArrayDataSource 的构造函数需要字节数组或 InputStream 作为参数。所以,如果你在变量 bmp 中有你的位图,你会像这样把它放到 byteArray 中:

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    

    并且会像这样在 ByteArrayDataSource 中使用它:

    DataSource source = new ByteArrayDataSource(byteArray, "image/png");
    

    【讨论】:

    • 这里的bundle有什么用,你只传递位图。没有任何方法setData()
    • 我知道我必须为其分配路径值。我没有只是复制和过去。
    • 首先没有setData(Bundle)这样的方法
    • 它的部分工作,你在 ByteArrayDataSource() 中传递的图像文件是什么,我在那里写了我的图像文件的路径,当我执行代码时,在邮件的附件中我正在获取图像路径和原始小图标而不是图像
    【解决方案3】:

    试试这个代码:

    public class Mail extends javax.mail.Authenticator { 
    private String _user; 
    private String _pass; 
    
    private String[] _to; 
    private String _from; 
    
    private String _port; 
    private String _sport; 
    
    private String _host; 
    
    private String _subject; 
    private String _body; 
    
    private boolean _auth; 
    
    private boolean _debuggable; 
    
    private Multipart _multipart; 
    
    
    public Mail() { 
        _host = "smtp.gmail.com"; // default smtp server 
        _port = "465"; // default smtp port 
        _sport = "465"; // default socketfactory port 
    
        _user = ""; // username 
        _pass = ""; // password 
        _from = ""; // email sent from 
        _subject = ""; // email subject 
        _body = ""; // email body 
    
        _debuggable = false; // debug mode on or off - default off 
        _auth = true; // smtp authentication - default on 
    
        _multipart = new MimeMultipart(); 
    
        // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added. 
        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); 
        CommandMap.setDefaultCommandMap(mc); 
    } 
    
    public Mail(String user, String pass) { 
        this(); 
    
        _user = user; 
        _pass = pass; 
    } 
    
    public boolean send() throws Exception { 
        Properties props = _setProperties(); 
    
        if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
            Session session = Session.getInstance(props, this); 
    
            MimeMessage msg = new MimeMessage(session); 
    
            msg.setFrom(new InternetAddress(_from)); 
    
            InternetAddress[] addressTo = new InternetAddress[_to.length]; 
            for (int i = 0; i < _to.length; i++) { 
                addressTo[i] = new InternetAddress(_to[i]); 
            } 
            msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 
    
            msg.setSubject(_subject); 
            msg.setSentDate(new Date()); 
    
            // setup message body 
            BodyPart messageBodyPart = new MimeBodyPart(); 
            messageBodyPart.setText(_body); 
            _multipart.addBodyPart(messageBodyPart); 
    
            // Put parts in message 
            msg.setContent(_multipart); 
    
            // send email 
            Transport.send(msg); 
    
            return true; 
        } else { 
            return false; 
        } 
    } 
    
    @Override 
    public PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication(_user, _pass); 
    } 
    
    private Properties _setProperties() { 
        Properties props = new Properties(); 
    
        props.put("mail.smtp.host", _host); 
    
        if(_debuggable) { 
            props.put("mail.debug", "true"); 
        } 
    
        if(_auth) { 
            props.put("mail.smtp.auth", "true"); 
        } 
    
        props.put("mail.smtp.port", _port); 
        props.put("mail.smtp.socketFactory.port", _sport); 
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
        props.put("mail.smtp.socketFactory.fallback", "false"); 
    
        return props; 
    } 
    
    // the getters and setters 
    public String getBody() { 
        return _body; 
    } 
    
    public void setBody(String _body) { 
        this._body = _body; 
    } 
    
    public void setTo(String[] toArr) {
        this._to = toArr;
    }
    
    public void setFrom(String string) {
        this._from = string;
    }
    
    public void setSubject(String string) {
        this._subject = string;
    }
    
    // more of the getters and setters ….. 
    } 
    

    对于附件添加此代码:

    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); 
    } 
    

    【讨论】:

    • 我在我的代码中使用了您的附件代码。但它不起作用。请告诉我应该在我的代码中为此写什么?
    猜你喜欢
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2013-01-12
    • 2012-08-17
    • 1970-01-01
    相关资源
    最近更新 更多