android : error in email sending
<p>my requirement is to send email from smtp server.</p>

<p>for that i am using following code:</p>

<pre><code>&gt;     package com.ixpenseit.email;
&gt;     
&gt;     import java.util.Date;
&gt;     import java.util.Properties;
&gt;     
&gt;     import javax.activation.CommandMap;
&gt;     import javax.activation.DataHandler;
&gt;     import javax.activation.DataSource;
&gt;     import javax.activation.FileDataSource;
&gt;     import javax.activation.MailcapCommandMap;
&gt;     import javax.mail.BodyPart;
&gt;     import javax.mail.MessagingException;
&gt;     import javax.mail.Multipart;
&gt;     import javax.mail.PasswordAuthentication;
&gt;     import javax.mail.Session;
&gt;     import javax.mail.Transport;
&gt;     import javax.mail.internet.AddressException;
&gt;     import javax.mail.internet.InternetAddress;
&gt;     import javax.mail.internet.MimeBodyPart;
&gt;     import javax.mail.internet.MimeMessage;
&gt;     import javax.mail.internet.MimeMultipart;
&gt;     
&gt;     public class Mail extends javax.mail.Authenticator {
&gt;       private String _user;
&gt;       private String _pass;
&gt;     
&gt;       private String[] _to;
&gt;       private String _from;
&gt;     
&gt;       private String _port;
&gt;       private String _sport;
&gt;     
&gt;       private String _host;
&gt;     
&gt;       private String _subject;
&gt;       private String _body;
&gt;     
&gt;       private boolean _auth;
&gt;     
&gt;       private Multipart _multipart;
&gt;     
&gt;       private Mail() {
&gt;           _auth = true; // smtp authentication - default on
&gt;           _multipart = new MimeMultipart();
&gt;       }
&gt;     
&gt;       public Mail(String smtpserver, String smtpport, String
&gt; smtpsocketfactoryport) {
&gt;           _host = smtpserver; // default smtp server
&gt;           _port = smtpport; // default smtp port
&gt;           _sport = smtpsocketfactoryport; // default socketfactory port
&gt;           _auth = true; // smtp authentication - default on
&gt;           _multipart = new MimeMultipart();
&gt;           MailcapCommandMap mc = (MailcapCommandMap) CommandMap
&gt;                   .getDefaultCommandMap();
&gt;           mc
&gt;                   .addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
&gt;           mc
&gt;                   .addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
&gt;           mc
&gt;                   .addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
&gt;           mc
&gt;                   .addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
&gt;           mc
&gt;                   .addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
&gt;           CommandMap.setDefaultCommandMap(mc);
&gt;     
&gt;       }
&gt;     
&gt;       public void setCredential(String username, String password) {
&gt;           _user = username;
&gt;           _pass = password;
&gt;       }
&gt;     
&gt;       public boolean send() throws AddressException, MessagingException 
&gt; {
&gt;           Properties props = _setProperties();
&gt;     
&gt;           if (Utility.isValidString(_user) &amp;&amp; Utility.isValidString(_pass)
&gt;                   &amp;&amp; _to != null &amp;&amp; Utility.isValidString(_from)
&gt;                   &amp;&amp; Utility.isValidString(_body)
&gt;                   &amp;&amp; Utility.isValidString(_subject) &amp;&amp;
&gt; _to.length &gt; 0
&gt;     
&gt;           ) {
&gt;               Session session = Session.getInstance(props, this);
&gt;     
&gt;               MimeMessage msg = new MimeMessage(session);
&gt;                           msg.setFrom(new InternetAddress(_from));
&gt;     
&gt;               InternetAddress[] addressTo = new InternetAddress[_to.length];
&gt;               for (int i = 0; i &lt; _to.length; i++) {
&gt;                   addressTo[i] = new InternetAddress(_to[i]);
&gt;               }
&gt;               msg.setRecipients(MimeMessage.RecipientType.TO,
&gt; addressTo);
&gt;     
&gt;               msg.setSubject(_subject);
&gt;               msg.setSentDate(new Date());
&gt;     
&gt;               // setup message body
&gt;               BodyPart messageBodyPart = new MimeBodyPart();
&gt;               messageBodyPart.setText(_body);
&gt;               _multipart.addBodyPart(messageBodyPart);
&gt;     
&gt;               // Put parts in message
&gt;               msg.setContent(_multipart);
&gt;     
&gt;               // send email
&gt;               Transport.send(msg);
&gt;     
&gt;               return true;
&gt;           } else {
&gt;               return false;
&gt;           }
&gt;       }
&gt;     
&gt;       public void setEmail(String[] to, String from, String subject, String
&gt; body) {
&gt;           _to = to;
&gt;           _body = body;
&gt;           _subject = subject;
&gt;           _from = from;
&gt;     
&gt;       }
&gt;     
&gt;       public void addAttachment(String filename) throws Exception {
&gt;           BodyPart messageBodyPart = new MimeBodyPart();
&gt;           DataSource source = new FileDataSource(filename);
&gt;           messageBodyPart.setDataHandler(new
&gt; DataHandler(source));
&gt;           messageBodyPart.setFileName(filename);
&gt;           _multipart.addBodyPart(messageBodyPart);
&gt;       }
&gt;     
&gt;       public void addAttachment(String folder, String filename) throws
&gt; Exception {
&gt;           BodyPart messageBodyPart = new MimeBodyPart();
&gt;           DataSource source = new FileDataSource(folder + "" +
&gt; filename);
&gt;           messageBodyPart.setDataHandler(new
&gt; DataHandler(source));
&gt;           messageBodyPart.setFileName(filename);
&gt;           _multipart.addBodyPart(messageBodyPart);
&gt;       }
&gt;     
&gt;       @Override
&gt;       public PasswordAuthentication getPasswordAuthentication() {
&gt;           return new PasswordAuthentication(_user, _pass);
&gt;       }
&gt;     
&gt;       private Properties _setProperties() {
&gt;           Properties props = new Properties();
&gt;           props.put("mail.smtp.host", _host);
&gt;           props.put("mail.debug", "true");
&gt;           if (_auth) {
&gt;               props.put("mail.smtp.auth", "true");
&gt;           }
&gt;           props.put("mail.smtp.port", _port);
&gt;           props.put("mail.smtp.socketFactory.port",
&gt; _sport);
&gt;           props.put("mail.smtp.socketFactory.class",
&gt;                   "javax.net.ssl.SSLSocketFactory");
&gt;           props.put("mail.smtp.socketFactory.fallback",
&gt; "false");
&gt;           return props;
&gt;       }
&gt;     
&gt;     }
</code></pre>

<p>main activity code is :</p>

<pre><code>public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            sendEmail();
        }
private void sendEmail()  {
        //Mail m = new Mail("smtp.gmail.com", "465", "465");

        Mail m = new Mail("smtp.dummy.com", "27", "27");
        m.setCredential("abc@dummy", "dummy");

        String[] toArr = { "to@gmail.com" };
        m.setEmail(toArr, "from@no-spam.com", "Auto Generated Expense Report",
                "Auto Generated Body.");

            try {
                if (m.send()) {
                    Toast.makeText(Email.this, "Email was sent successfully.",
                            Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(Email.this, "Email was not sent.",
                            Toast.LENGTH_LONG).show();
                }
            } catch (AddressException e) {
                // TODO Auto-generated catch block
                Log.e("MailApp", "Could not send email", e);
            } catch (MessagingException e) {
                // TODO Auto-generated catch block
                Log.e("MailApp", "Could not send email", e);
            }
</code></pre>

<p>download jars from the following link:</p>

<blockquote>
  <p><a href="http://javamail-android.googlecode.com/files/mail.jar" rel="nofollow">mail.jar</a></p>
  
  <p><a href="http://javamail-android.googlecode.com/files/activation.jar" rel="nofollow">activation.jar</a></p>
  
  <p><a href="http://javamail-android.googlecode.com/files/additionnal.jar" rel="nofollow">additionnal.jar</a></p>
</blockquote>

<p>the above code working good for gmail.
But when i tried it with hotmail, yahoo and my own smtp server then is show the following exception</p>

<blockquote>
  <p>02-24 12:34:31.347:
  ERROR/MailApp(3668):   nested
  exception is: 02-24 12:34:31.347:
  ERROR/MailApp(3668):<br>
  java.io.IOException: SSL handshake
  failure: Failure in SSL library,
  usually a protocol error 02-24
  12:34:31.347: ERROR/MailApp(3668):
  error:140770FC:SSL
  routines:SSL23_GET_SERVER_HELLO:unknown
  protocol
  (external/openssl/ssl/s23_clnt.c:585
  0xaf589bac:0x00000000) 02-24
  12:34:31.347: ERROR/MailApp(3668):<br>
  at
  com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1391)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:412)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  javax.mail.Service.connect(Service.java:288)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  javax.mail.Service.connect(Service.java:169)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  javax.mail.Service.connect(Service.java:118)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  javax.mail.Transport.send0(Transport.java:188)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  javax.mail.Transport.send(Transport.java:118)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  com.ixpenseit.email.Mail.send(Mail.java:106)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  com.email.Email.sendEmail(Email.java:48)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  com.email.Email.onCreate(Email.java:22)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  android.app.ActivityThread.access$2100(ActivityThread.java:116)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  android.os.Handler.dispatchMessage(Handler.java:99)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  android.os.Looper.loop(Looper.java:123)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  android.app.ActivityThread.main(ActivityThread.java:4203)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  java.lang.reflect.Method.invokeNative(Native
  Method) 02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  java.lang.reflect.Method.invoke(Method.java:521)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  dalvik.system.NativeStart.main(Native
  Method) 02-24 12:34:31.347:
  ERROR/MailApp(3668): Caused by:
  java.io.IOException: SSL handshake
  failure: Failure in SSL library,
  usually a protocol error 02-24
  12:34:31.347: ERROR/MailApp(3668):
  error:140770FC:SSL
  routines:SSL23_GET_SERVER_HELLO:unknown
  protocol
  (external/openssl/ssl/s23_clnt.c:585
  0xaf589bac:0x00000000) 02-24
  12:34:31.347: ERROR/MailApp(3668):<br>
  at
  org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.nativeconnect(Native
  Method) 02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:305)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.(OpenSSLSocketImpl.java:502)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.getInputStream(OpenSSLSocketImpl.java:443)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  com.sun.mail.smtp.SMTPTransport.initStreams(SMTPTransport.java:1449)
  02-24 12:34:31.347:
  ERROR/MailApp(3668):     at
  com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1366)</p>
</blockquote>

<p>how can i try it with other smtp server?</p>

<p>help me out.</p>
