user3123469
user3123469

Reputation: 105

android send email automatically

I want to send email automatically (without user interface). When i execute the application i have no error but when i check my inbox i find no email

MainActivity:

 public void onClick(View v) {
       // TODO Auto-generated method stub

       try {   
            GMailSender sender = new GMailSender("[email protected]","password");
            sender.sendMail("This is Subject", "This is Body", "[email protected]",   
            "[email protected]");  
       } catch (Exception e) {   
            Log.e("send", "error");  
       } 
  }

GMailSender.java:

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) 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);   
        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.java:

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

jar files : https://code.google.com/p/javamail-android/downloads/list

Manifest permission : <uses-permission android:name="android.permission.INTERNET" />

Upvotes: 3

Views: 5364

Answers (4)

Hari Lee
Hari Lee

Reputation: 31

if u put a log message in the catch block of the sendEmail() you will get to know what the issue is, based on that you can make changes to the code

Also the problem I faced was that I calling the method to send the mail in main thread, you can create a separate thread to call the mail operation and it will work like a charm.

Upvotes: 0

Sagar Limbani
Sagar Limbani

Reputation: 105

hey your code is perfect because i have used this code so you need to add one thread policy for NETWORK ERROR EXCEPTION add below two lines in your onCreate() method

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
            .permitAll().build();
    StrictMode.setThreadPolicy(policy);

Upvotes: 1

user3123469
user3123469

Reputation: 105

The problem was that the wifi network of the campus where I am blocks the sending of emails. when I used the 3G it has worked.

Upvotes: 0

praveen
praveen

Reputation: 420

replace Transport.send(message); with below code should work

   Transport transport = session.getTransport("smtp");
    transport.connect("smtp.gmail.com", 587, _user, _pass);
    transport.sendMessage(msg, msg.getAllRecipients());

Upvotes: 1

Related Questions