2014-11-20 3 views
1

Я начинаю с android, и это моя первая программа.eMail с приложением с использованием java mail api в android

Вот как выглядит мой код. Я могу отправить электронное письмо (в фоновом режиме) с помощью этого кода, но не смог прикрепить файл к нему в виде вложения электронной почты. Я дал разрешение на mainfest.xml

Пожалуйста, дайте мне знать, что я делаю неправильно и что необходимо реализовать.

Любая помощь очень ценится.

import java.net.Authenticator; 
import java.util.Date; 
import java.util.Properties; 
import javax.activation.CommandMap; 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
import javax.activation.MailcapCommandMap; 
import javax.mail.BodyPart; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Multipart; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 

import android.annotation.SuppressLint; 


public class GMailSender 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 GMailSender() { 
    _host = "smtp.gmail.com"; 
    _port = "465"; 
    _sport = "465"; 

    _user = ""; 
    _pass = ""; 
    _from = ""; 
    _subject = ""; 
    _body = ""; 

    _debuggable = false; 
    _auth = true; 

    _multipart = new MimeMultipart(); 

    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 GMailSender(String user, String pass) { 
    this(); 

    _user = user; 
    _pass = pass; 
    } 

    public boolean send(String to, String from, String subject, String text) { 
     return send(new String[] {to}, from, subject, text); 
    } 
    public boolean send(String[] to, String from, String subject, String text) { 
     Properties props = new Properties(); 
     props.put("mail.smtp.auth", "true"); 
     props.put("mail.smtp.host", _host); 
     props.put("mail.smtp.user", _user); 
     props.put("mail.smtp.port", _port); 
     props.put("mail.smtp.password", _pass); 
     props.put("mail.smtp.socketFactory.port", _port); 
     props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
     props.put("mail.smtp.socketFactory.fallback", "false"); 

     Session session = Session.getInstance(props, this); 

     try { 
      Message message = new MimeMessage(session); 
      message.setFrom(new InternetAddress(from)); 
      InternetAddress[] addressTo = new InternetAddress[to.length]; 
      for (int i = 0; i < to.length; i++) { 
       addressTo[i] = new InternetAddress(to[i]); 
      } 
      message.setRecipients(Message.RecipientType.TO, addressTo); 
      message.setSubject(subject); 
      message.setText(text); 
      Transport.send(message); 
     } catch (MessagingException e) { 
      e.printStackTrace(); 
      return false; 
     } 
     return true; 
    } 


    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; 
    } 
    // the getters and setters 
    public String getBody() { 
    return _body; 
    } 
    public void setBody(String _body) { 
    this._body = _body; 
    } 
    // more of the getters and setters ….. 
} 

И как я называю это в своей деятельности

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.text.format.Time; 
import android.util.Log; 

public class mailActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     new PostTask().execute(); 

     finish(); 
    } 

    public class PostTask extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... params) { 
      Log.d("doInBackground","You are in do in background ... "); 

      String filepath = "/storage/sdcard0/Bluetooth/2012.jpg"; 

      Time now = new Time(); 
      now.setToNow(); 
      GMailSender sender = new GMailSender("[email protected]","XXX.Password"); 
      try { 
        sender.addAttachment("/storage/sdcard0/Bluetooth/2012.jpg"); 
        sender.send("[email protected]", "[email protected]", "Silent Mail:" + now.format("%d-%m-%Y %H:%M"), "This eMail was sent silently in background"); 

      catch (Exception e) {     
       Log.e("doInBackground","Mail Exception..."); 
       Log.e("doInBackground", "exception: " + e.toString()); 
       } 
      Log.d("doInBackground", "You completed do in background ... "); 
      return null; 
     } 
    } 
} 
+0

Просто проверьте, не передаете ли вы правильную 'filePath' или нет. Попробуйте проверить, существует ли файл или нет. –

+0

@VikalpPatel: путь к файлу верен, и я уверен, что файл присутствует там ... –

+0

hiiiiiiii у вас есть проблема –

ответ

3
package com.mail.example; 

import java.util.Properties; 

import javax.activation.CommandMap; 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
import javax.activation.MailcapCommandMap; 
import javax.mail.BodyPart; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Multipart; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 

public class SendFileEmail 
{ 
public void send(String filepath) 
{ 

    // Recipient's email ID needs to be mentioned. 
    String to = "[email protected]"; 

    // Sender's email ID needs to be mentioned 
    final String from = "[email protected]"; 
// final String username = "xyz"; 
    final String pass = "xyz123"; 
    // Assuming you are sending email from localhost 
    String host = "smtp.gmail.com"; 

    // Get system properties 
    Properties properties = System.getProperties(); 

    // Setup mail server 
    properties.setProperty("mail.smtp.host", host); 
    properties.put("mail.smtp.user", from); 
    properties.put("mail.smtp.password", pass); 
    properties.put("mail.smtp.port", "587"); 
    properties.put("mail.smtp.starttls.enable","true"); 
    properties.put("mail.smtp.auth", "true"); 

    //Read more: http://mrbool.com/how-to-work-with-java-mail-api-in-android/27800#ixzz3E2T8ZbpJ 


    // Get the default Session object. 
    //Session session = Session.getDefaultInstance(properties); 


    Session session = Session.getInstance(properties, new javax.mail.Authenticator() { 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication(from, pass); 
     } 
    }); 


    try{ 
    // Create a default MimeMessage object. 
    MimeMessage message = new MimeMessage(session); 

    // Set From: header field of the header. 
    message.setFrom(new InternetAddress(from)); 

    // Set To: header field of the header. 
    message.addRecipient(Message.RecipientType.TO, 
           new InternetAddress(to)); 

    // Set Subject: header field 
    message.setSubject("This is the Subject Line!"); 

    // Create the message part 
    BodyPart messageBodyPart = new MimeBodyPart(); 

    // Fill the message 
    messageBodyPart.setText("This is message body"); 

    // Create a multipar message 
    Multipart multipart = new MimeMultipart(); 

    // Set text message part 
    multipart.addBodyPart(messageBodyPart); 

    // Part two is attachment 
    messageBodyPart = new MimeBodyPart(); 
    DataSource source = new FileDataSource(filepath); 
    messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(filepath); 
    multipart.addBodyPart(messageBodyPart); 


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

    // Send the complete message parts 
    message.setContent(multipart); 
    // Send message 
    Transport.send(message); 
    System.out.println("Sent message successfully...."); 
    }catch (MessagingException mex) { 
    mex.printStackTrace(); 
    } 
} 
} 

вызов метода, как этот

public class SendMail { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    new SendFileEmail().send("sample.xlsx"); 
} 

} 

Если файл находится в папке, например test.txt активов

File f = new File(getCacheDir()+"/test.txt"); 
if (!f.exists()) try { 

InputStream is = getAssets().open("test.txt"); 
int size = is.available(); 
byte[] buffer = new byte[size]; 
is.read(buffer); 
is.close(); 


FileOutputStream fos = new FileOutputStream(f); 
fos.write(buffer); 
fos.close(); 
} catch (Exception e) { throw new RuntimeException(e); } 

new SendFileEmail().send(f.getPath()); 
+0

Файл присутствует во внешнем несъемном хранилище, он не является файлом активов. –

+1

Этот ответ помог мне, я взял ссылку на ваш код и внес необходимые изменения в свой код, и он просто сработал. Спасибо. –

0

Сначала очистите свой код на getting rid of the socket factory stuff that's not needed.

Причина, по которой ничего не прилагается, заключается в том, что вы добавляете часть тела к multipart, но вы никогда не используете multipart. Вам необходимо установить multipart как содержимое вашего сообщения, а multipart необходимо включить части тела для основного тела текста и вложения. См. Также метод MimeBodyPart.attachFile.

+0

Я не могу понять, что вы пытаетесь сказать, можете ли вы рассказать об этом с точки зрения кода? Я загрузил свой код, пожалуйста, дайте мне знать, что удалить и что изменить ... Спасибо –

+0

JavaMail поставляется с тоннами кода примера, который поможет вам. Загрузите его из [здесь] (https://java.net/projects/javamail/pages/Home#Samples) и посмотрите пример sendfile.java. –

+0

Вы были полезны, но по-другому, спасибо –

Смежные вопросы