13

Realizzo un'app che consente all'utente di scattare una foto e inviarla automaticamente via e-mail all'e-mail che sceglie. Finora sono stato in grado di scattare una foto e archiviarla nella scheda SD. Ora ho solo bisogno di funzioni per ottenere l'immagine dalla cartella (/ sdcard/Pictures/PhotoSender /) e inviarla automaticamente all'e-mail che l'utente ha richiesto. Come posso fare questo?Android: invia automaticamente l'e-mail con allegato in background

Ho l'immagine in quella cartella. Ho solo bisogno di alcune funzioni per generare l'e-mail, mettere l'immagine (.jpg) come allegato e inviare (tutto questo sullo sfondo). Quando l'e-mail viene inviata completamente, dovrebbe apparire un brindisi che dice "Upload Done". Nel frattempo l'utente dovrebbe essere libero di fare più foto, quindi le richieste di caricamento dovrebbero essere messe in coda. L'utente non deve accedere con il proprio account e-mail per l'invio. Se necessario, posso creare un account e-mail affinché la mia app sia il "mittente". Mi aiuti per favore!

+0

mostra per favore cosa hai fatto. – BBdev

risposta

11

Qui di seguito è una classe completa che supporta l'invio di email con allegati in Android

Ed ecco una funzione di utilità per inviare mail con allegato in cui l'allegato nel tuo caso è semplicemente l'immagine (s) file percorso completo

public static boolean sendEmail(String to, String from, String subject,           
           String message,String[] attachements) throws Exception {  
    Mail mail = new Mail(); 
    if (subject != null && subject.length() > 0) { 
     mail.setSubject(subject); 
    } else { 
     mail.setSubject("Subject"); 
    } 

    if (message != null && message.length() > 0) { 
     mail.setBody(message); 
    } else { 
     mail.setBody("Message"); 
    } 

    mail.setTo(new String[] {to}); 

    if (attachements != null) { 
     for (String attachement : attachements) {  
      mail.addAttachment(attachement); 
     } 
    } 
    return mail.send(); 
} 

Ecco la completa Mail classe utilizzata nella funzione di cui sopra

import java.io.File; 
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.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 Mail extends javax.mail.Authenticator { 
private String user; 
private String password; 

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 String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

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

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

public String getFrom() { 
    return from; 
} 

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

public String getHost() { 
    return host; 
} 

public void setHost(String host) { 
    this.host = host; 
} 

public String getSubject() { 
    return subject; 
} 

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

public Multipart getMultipart() { 
    return multipart; 
} 

public void setMultipart(Multipart multipart) { 
    this.multipart = multipart; 
} 

public Mail() { 
    host = "smtp.googlemail.com"; // default smtp server 
    port = "465"; // default smtp port 
    sport = "465"; // default socketfactory port 

    user = ""; // username 
    password = ""; // 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(); 

    this.user = user; 
    password = pass; 
} 

public boolean send() throws Exception { 
    Properties props = _setProperties(); 

    if (!user.equals("") && !password.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(new File(filename).getName()); 

    multipart.addBodyPart(messageBodyPart); 
} 

@Override 
public PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(user, password); 
} 

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

Nota:

  • Sarà necessario activiation.jar e mail.jar nel classpath cioè JavaMail API
  • Il codice deve essere eseguito da AsynchTask o dedicati Thread
+0

contrassegna la sua domanda come risposta corretta se è @ user2155460 –

+2

come ottenere da questa soluzione la password dell'account creato in Android? –

+1

@iTech è la migliore risposta. Un sacco di ringraziamenti – NickUnuchek

2

Assumendo che il dispositivo di Emualtor ha un'applicazione di posta elettronica, il seguente codice può essere utilizzato per inviare una mail. Puoi utilizzare qualsiasi applicazione di posta elettronica installata sul tuo emulatore o dispositivo sia su yahoomail che su google. Se vuoi eseguire lo stesso tp in background, usa un servizio.

Intent i = new Intent(Intent.ACTION_SEND); 
//i.setType("text/plain"); //use this line for testing in the emulator 
i.setType("message/rfc822") ; // use from live device 
i.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail");//sending email via gmail 
i.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"}); 
i.putExtra(Intent.EXTRA_SUBJECT,"subject goes here"); 
i.putExtra(Intent.EXTRA_TEXT,"body goes here"); 
startActivity(i); 
+0

Ma questo è il problema. Se lo utilizzo, l'utente dovrà selezionare l'applicazione che utilizzerà per inviare l'e-mail. Ad esempio, se usa Hotmail, dovrà accedere utilizzando il suo account. L'utente dovrebbe semplicemente premere il pulsante "invia" nella mia app e non preoccuparsi di una cosa in più. L'e-mail verrà automaticamente creata e inviata, che non si verifica se usiamo questo intento = ( – user2155460

+0

controlla la risposta dietetica, ma richiede l'accesso da parte dell'utente. Se vuoi solo inviare e-mail facendo clic su un pulsante, hai fornito l'autenticazione di accesso programmaticamente Il collegamento fornito da Mehul Joisar è buono per questo scopo. – Raghunandan