1

可能重复:
如何在自定义邮件发件人中从文件浏览器和相机传递附件

我有一个自定义邮件发件人,它使用,activation.jar向多个人发送电子邮件而无需用户交互。additional.jarmail.jar

添加附件的代码块是

   try {
      m.addAttachment(filePah);

      if(m.send()) {
        Toast.makeText(Comunic.this, "Ok", Toast.LENGTH_LONG).show();
      } else {
        Toast.makeText(Comunic.this, "Error.", Toast.LENGTH_LONG).show();
      }
    } catch(Exception e) {
      Toast.makeText(Comunic.this, "Error Attachment.", Toast.LENGTH_LONG).show();
    } 

在行

m.addAttachment(filePath);

我以这种形式传递文件路径

/mnt/sdcard/mnt/sdcard/AAAAAA/readme.txt

m是一个Mail Object

Mail m = new Mail(username, password);

邮件类是

    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 = ""; 
        _pass = "";
        _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;
        }
      }


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

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



      public String getBody() {
        return _body;
      }


      public String getFrom() {
            return _from;
      }


      public String[] getTo() {
            return _to;
      }


      public String getSubject() {
            return _subject;
      }


      public void setBody(String _body) {
        this._body = _body;
      }


      public void setFrom(String _from) {
            this._from = _from;
      }


      public void setTo(String[] _to) {
            this._to = _to;
      }


      public void setSubject(String _subject) {
            this._subject = _subject;
      }



    }

但我得到这个错误

Email(10235): javax.mail.MessagingException: IOException while sending message;
Email(10235):   nested exception is:
Email(10235):   java.io.FileNotFoundException: /mnt/sdcard/mnt/sdcard/AAAAAA/readme.txt (No such file or directory)
Email(10235):   at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:676)
Email(10235):   at javax.mail.Transport.send0(Transport.java:189)
Email(10235):   at javax.mail.Transport.send(Transport.java:118)
Email(10235):   at my.app.Mail.send(Mail.java:108)

我使用获取文件路径

private void openFile() {
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.setType("file/*");
    startActivityForResult(i, FILE_REQ_CODE);
}

(在galaxy上显示我的文件管理器列表,但不是默认文件管理器,所以我使用了Astro)。

如何解决这个问题?我的代码有什么问题?

4

0 回答 0