Autore Topic: Gmail Sender, mandare una mail in background  (Letto 576 volte)

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 316
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Gmail Sender, mandare una mail in background
« il: 01 Aprile 2015, 11:32:17 CEST »
0
Salve a tutti!

Quello che cerco di fare con la mia applicazione è fare in modo che l'utente possa mandare una mail in background senza dover ricorrere ad altre applicazioni.
Il mio problema è che il codice che uso mi dice che la mail è stata inviata correttamente ma tale mail non arriva mai!

Questi sono le classi che uso:

GMailSender.class:
Codice (Java): [Seleziona]
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
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 java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Security;
import java.util.Properties;

public class GMailSender extends javax.mail.Authenticator {
    private String mailhost = "smtp.gmail.com";
    private String user;
    private String password;
    private Session session;

    static {
        Security.addProvider(new JSSEProvider());
    }

    public GMailSender(String user, String password) {
        this.user = user;
        this.password = password;

        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");
        props.setProperty("mail.host", mailhost);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.quitwait", "false");

        session = Session.getDefaultInstance(props, this);
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(user, password);
    }

    public synchronized void sendMail(String subject, String body, String sender, String recipients, String filePath) throws Exception {
        try{
            MimeMessage message = new MimeMessage(session);
            DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));

            message.setSender(new InternetAddress(sender));
            message.setSubject(subject);

            // message.setDataHandler(handler);

            //modification starts here

            Multipart multipart = new MimeMultipart();
            BodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.setContent(body, "text/plain");
            multipart.addBodyPart(messageBodyPart);
            //File Attachment part
//        if(!filePath.equals("")){
//            BodyPart messageAttachmentPart = new MimeBodyPart();
//            DataSource source = new FileDataSource(filePath);
//            messageAttachmentPart.setDataHandler(new DataHandler(source));
//            messageAttachmentPart.setFileName(filePath);
//            multipart.addBodyPart(messageAttachmentPart);
//        }
            message.setContent(multipart );

            //modification ends here


            if (recipients.indexOf(',') > 0)
                message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));
            else
                message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));

            Transport.send(message);
        }catch(Exception e){

        }
    }

    public class ByteArrayDataSource implements DataSource {
        private byte[] data;
        private String type;

        public ByteArrayDataSource(byte[] data, String type) {
            super();
            this.data = data;
            this.type = type;
        }

        public ByteArrayDataSource(byte[] data) {
            super();
            this.data = data;
        }

        public void setType(String type) {
            this.type = type;
        }

        public String getContentType() {
            if (type == null)
                return "application/octet-stream";
            else
                return type;
        }

        public InputStream getInputStream() throws IOException {
            return new ByteArrayInputStream(data);
        }

        public String getName() {
            return "ByteArrayDataSource";
        }

        public OutputStream getOutputStream() throws IOException {
            throw new IOException("Not Supported");
        }
    }
}

JSSEProvider.class:
Codice (Java): [Seleziona]
import java.security.Provider;

/**
 * Created by adorni on 01/04/2015.
 */

import java.security.AccessController;
import java.security.Provider;

@SuppressWarnings("serial")
public final class JSSEProvider extends Provider {

    public JSSEProvider() {
        super("HarmonyJSSE", 1.0, "Harmony JSSE Provider");
        AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() {
            public Void run() {
                put("SSLContext.TLS",
                        "org.apache.harmony.xnet.provider.jsse.SSLContextImpl");
                put("Alg.Alias.SSLContext.TLSv1", "TLS");
                put("KeyManagerFactory.X509",
                        "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl");
                put("TrustManagerFactory.X509",
                        "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl");
                return null;
            }
        });
    }
}

ed infine:

email.class:
Codice (Java): [Seleziona]
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.util.Properties;

import javax.mail.*;
import javax.activation.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;


public class email extends  Activity {
    /** Called when the activity is first created. */
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            Button login = (Button) findViewById(R.id.mBtnSubmit);
            login.setOnClickListener(new View.OnClickListener() {

                public void onClick(View arg0) {
                    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("valerioado81@gmail.com", "stasibinaria12");
                        }
                    });

                    try {
                        Message message = new MimeMessage(session);
                        message.setFrom(new InternetAddress("valerioado@live.it"));
                        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("valerioado81@gmail.com"));
                        message.setSubject("Testing Subject");
                        message.setContent("Hi Dipak Keshariya (Android Developer)", "text/html; charset=utf-8");

                        Transport.send(message);

                    } catch (MessagingException e) {
                        throw new RuntimeException(e);
                    }
                }
            });
        }
    }

l'applicazione mi dice che ha mandato la mail però (come detto prima) tale mail non arriva.


In alternativa ho provato a cambiare il tutto in questo modo:

email.class:
Codice (Java): [Seleziona]
 
public class email extends  Activity {
    /** Called when the activity is first created. */
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            Button login = (Button) findViewById(R.id.mBtnSubmit);
           login.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                   new SendMail().execute();
               }
           });
        }

    protected class SendMail extends AsyncTask<Void, Void,Void> {


        @Override
        protected Void doInBackground(Void... params) {

            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("miaMail@live.it", "miaPassword");
                }
            });

            try {
                Message message = new MimeMessage(session);
                message.setFrom(new InternetAddress("miaMail@live.it"));
                message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("mail@gmail.com"));
                message.setSubject("Testing Subject");
                message.setContent("Hi Dipak Keshariya (Android Developer)", "text/html; charset=utf-8");

                Transport.send(message);

            } catch (MessagingException e) {
                throw new RuntimeException(e);
            }


            return null;
        }
    }
}

ma in questo modo al momento di mandare la mail ( Transport.send(message); ) l'applicazione crasha con questo logcat:
Codice: [Seleziona]
04-01 09:31:14.180      949-972/com.adorni.email E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:299)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
            at java.util.concurrent.FutureTask.run(FutureTask.java:239)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
            at java.lang.Thread.run(Thread.java:856)
     Caused by: java.lang.RuntimeException: javax.mail.AuthenticationFailedException
            at com.adorni.email.email$SendMail.doInBackground(email.java:66)
            at com.adorni.email.email$SendMail.doInBackground(email.java:37)
            at android.os.AsyncTask$2.call(AsyncTask.java:287)
            at java.util.concurrent.FutureTask.run(FutureTask.java:234)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
            at java.lang.Thread.run(Thread.java:856)
     Caused by: javax.mail.AuthenticationFailedException
            at javax.mail.Service.connect(Service.java:319)
            at javax.mail.Service.connect(Service.java:169)
            at javax.mail.Service.connect(Service.java:118)
            at javax.mail.Transport.send0(Transport.java:188)
            at javax.mail.Transport.send(Transport.java:118)
            at com.adorni.email.email$SendMail.doInBackground(email.java:63)
            at com.adorni.email.email$SendMail.doInBackground(email.java:37)
            at android.os.AsyncTask$2.call(AsyncTask.java:287)
            at java.util.concurrent.FutureTask.run(FutureTask.java:234)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
            at java.lang.Thread.run(Thread.java:856)

qualche suggerimento?

Grazie mille!

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Gmail Sender, mandare una mail in background
« Risposta #1 il: 01 Aprile 2015, 12:18:06 CEST »
0
Errore causato da errata autenticazione

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 316
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Gmail Sender, mandare una mail in background
« Risposta #2 il: 01 Aprile 2015, 12:28:44 CEST »
0
Errore causato da errata autenticazione

L'autenticazione è corretta infatto andando su questo link:https://www.google.com/settings/security/lesssecureapps e mettendo la spunta a "turn off" la mail arriva correttamente, ma solo quelle di google e non penso che l'utente medio sia in grado di sapere una cosa del genere la prima volta che accede all'app.
Lui vedrà che l'app crasha e la disinstallerà subito.

Ci sono altri servizi che mi permettono di mandare mail in backround da tutti gli indirizzi di posta?

grazie mille!

Offline tommy95

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4 mini
  • Sistema operativo:
    Windows 8.1
Re:Gmail Sender, mandare una mail in background
« Risposta #3 il: 03 Giugno 2015, 12:11:48 CEST »
0
L'autenticazione è corretta infatto andando su questo link:https://www.google.com/settings/security/lesssecureapps e mettendo la spunta a "turn off" la mail arriva correttamente, ma solo quelle di google e non penso che l'utente medio sia in grado di sapere una cosa del genere la prima volta che accede all'app.
Lui vedrà che l'app crasha e la disinstallerà subito.

Ci sono altri servizi che mi permettono di mandare mail in backround da tutti gli indirizzi di posta?

grazie mille!

Ciao, ti ho mandato un messaggio privato? Appena puoi, potresti dargli un'occhiata? Grazie