Failed to send mail using JavaMail API.

I have the following code that is trying to send an email in the background. I used a text view to see the exception. However, although nothing is displayed in the text view, I also cannot receive mail. So I'm not sure if the mail was delivered successfully or not. Can anybody help me?

Based on the suggestions, I changed my program as follows:

new sender.java

public class Sender extends Activity { Button Send; TextView text; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sender); Send = (Button) findViewById(R.id.mail); text = (TextView) findViewById(R.id.textView1); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() .permitAll().build(); StrictMode.setThreadPolicy(policy); Send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub new SendMail().execute(); } }); } private class SendMail extends AsyncTask<String, Void, String> { ProgressDialog pd = null; String error = null; Integer result; @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); pd = new ProgressDialog(Sender.this); pd.setTitle("Uploading"); pd.setMessage("Uploading logs. Please wait"); pd.setCancelable(false); pd.show(); } @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub MailSender sender = new MailSender(" me@gmail.com ", "password"); String[] toAddress = {" me@gmail.com "}; sender.setTo(toAddress); sender.setFrom(" me@gmail.com "); sender.setSubject("Test mail"); sender.setBody("This is the mail body"); try { if(sender.send()) { System.out.println("Message sent"); result = 1; } else { result = 2; } } catch (Exception e) { error = e.getMessage(); Log.e("SendMail", e.getMessage(), e); } result = 3; return null; } protected void onPostExecute() { pd.dismiss(); if(error!=null) { text.setText(error); } if(result==1) { Toast.makeText(Sender.this, "Email was sent successfully.", Toast.LENGTH_LONG) .show(); } else if(result==2) { Toast.makeText(Sender.this, "Email was not sent.", Toast.LENGTH_LONG).show(); } else if(result==3) { Toast.makeText(Sender.this, "There was a problem sending the email.", Toast.LENGTH_LONG).show(); } } } } 

new MailSender.java

 public class MailSender extends 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 multi; public MailSender(){ host = "smtp.gmail.com"; port = "465"; sport = "465"; user = ""; password = ""; from = ""; subject = ""; body = ""; debuggable = false; auth = true; multi = 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/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 MailSender(String user, String password){ this(); user = user; password = password; } public boolean send() throws Exception { Properties props = setProperties(); try{ Session session = Session.getInstance(props, this); session.setDebug(true); 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()); BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText(body); multi.addBodyPart(messageBodyPart); msg.setContent(multi); Transport transport = session.getTransport("smtps"); transport.connect(host, 465, user, password); transport.sendMessage(msg, msg.getAllRecipients()); transport.close(); return true; } catch (Exception e) { 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(filename); multi.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; } public void setTo(String[] toAddress) { this.to = toAddress; } public void setFrom(String fromAddress) { this.from = fromAddress; } public void setSubject(String subject) { this.subject = subject; } public void setBody(String body) { this.body = body; } } 

After I changed the program, when I press the button, it stops in the pre-execution state, showing "Downloading logs. Wait." Mail cannot be sent.

And in the error log:

 08-14 16:26:29.872: I/System.out(22439): DEBUG: setDebug: JavaMail version 1.4.1 08-14 16:26:29.888: I/System.out(22439): DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc.,1.4.1] 08-14 16:26:29.896: I/System.out(22439): DEBUG SMTP: useEhlo true, useAuth false 08-14 16:26:29.896: I/System.out(22439): DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL true 08-14 16:26:30.568: I/System.out(22439): 220 mx.google.com ESMTP nq6sm593334pbc.56 08-14 16:26:30.568: I/System.out(22439): DEBUG SMTP: connected to host "smtp.gmail.com", port: 465 08-14 16:26:30.568: I/System.out(22439): EHLO localhost 08-14 16:26:30.716: I/System.out(22439): 250-mx.google.com at your service, [202.155.209.250] 08-14 16:26:30.716: I/System.out(22439): 250-SIZE 35882577 08-14 16:26:30.716: I/System.out(22439): 250-8BITMIME 08-14 16:26:30.716: I/System.out(22439): 250-AUTH LOGIN PLAIN XOAUTH 08-14 16:26:30.716: I/System.out(22439): 250 ENHANCEDSTATUSCODES 08-14 16:26:30.716: I/System.out(22439): DEBUG SMTP: Found extension "SIZE", arg "35882577" 08-14 16:26:30.716: I/System.out(22439): DEBUG SMTP: Found extension "8BITMIME", arg "" 08-14 16:26:30.716: I/System.out(22439): DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH" 08-14 16:26:30.716: I/System.out(22439): DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg "" 08-14 16:26:30.716: I/System.out(22439): DEBUG SMTP: Attempt to authenticate 08-14 16:26:30.724: I/System.out(22439): AUTH LOGIN 08-14 16:26:30.872: I/System.out(22439): 334 VXNlcm5hbWU6 08-14 16:26:30.872: I/System.out(22439): 08-14 16:26:31.021: I/System.out(22439): 334 UGFzc3dvcmQ6 08-14 16:26:31.021: I/System.out(22439): 08-14 16:26:31.169: I/System.out(22439): 334 UGFzc3dvcmQ6 08-14 16:26:31.177: I/System.out(22439): DEBUG SMTP: useEhlo true, useAuth false 08-14 16:26:31.177: I/System.out(22439): DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL true 08-14 16:26:31.552: D/dalvikvm(22439): GC_CONCURRENT freed 341K, 4% free 11097K/11527K, paused 13ms+3ms, total 37ms 08-14 16:26:31.794: I/System.out(22439): 220 mx.google.com ESMTP st6sm593199pbc.58 08-14 16:26:31.794: I/System.out(22439): DEBUG SMTP: connected to host "smtp.gmail.com", port: 465 08-14 16:26:31.794: I/System.out(22439): EHLO localhost 08-14 16:26:31.943: I/System.out(22439): 250-mx.google.com at your service, [202.155.209.250] 08-14 16:26:31.943: I/System.out(22439): 250-SIZE 35882577 08-14 16:26:31.943: I/System.out(22439): 250-8BITMIME 08-14 16:26:31.943: I/System.out(22439): 250-AUTH LOGIN PLAIN XOAUTH 08-14 16:26:31.943: I/System.out(22439): 250 ENHANCEDSTATUSCODES 08-14 16:26:31.950: I/System.out(22439): DEBUG SMTP: Found extension "SIZE", arg "35882577" 08-14 16:26:31.950: I/System.out(22439): DEBUG SMTP: Found extension "8BITMIME", arg "" 08-14 16:26:31.950: I/System.out(22439): DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH" 08-14 16:26:31.950: I/System.out(22439): DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg "" 08-14 16:26:31.950: I/System.out(22439): DEBUG SMTP: Attempt to authenticate 08-14 16:26:31.950: I/System.out(22439): AUTH LOGIN 08-14 16:26:32.099: I/System.out(22439): 334 VXNlcm5hbWU6 08-14 16:26:32.099: I/System.out(22439): 08-14 16:26:32.247: I/System.out(22439): 334 UGFzc3dvcmQ6 08-14 16:26:32.247: I/System.out(22439): 08-14 16:26:32.403: I/System.out(22439): 334 UGFzc3dvcmQ6 08-14 16:27:00.200: I/Choreographer(22439): Skipped 35 frames! The application may be doing too much work on its main thread. 

Since it does not work, so I try to hide the onpreexecute function, but nothing changes, mail cannot be sent, here are the messages in the error log:

 08-14 16:31:18.958: I/System.out(22759): DEBUG: setDebug: JavaMail version 1.4.1 08-14 16:31:18.974: I/System.out(22759): DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc.,1.4.1] 08-14 16:31:18.974: I/System.out(22759): DEBUG SMTP: useEhlo true, useAuth false 08-14 16:31:18.974: I/System.out(22759): DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL true 08-14 16:31:19.739: I/System.out(22759): 220 mx.google.com ESMTP og7sm597805pbb.62 08-14 16:31:19.739: I/System.out(22759): DEBUG SMTP: connected to host "smtp.gmail.com", port: 465 08-14 16:31:19.739: I/System.out(22759): EHLO localhost 08-14 16:31:19.888: I/System.out(22759): 250-mx.google.com at your service, [202.155.209.250] 08-14 16:31:19.888: I/System.out(22759): 250-SIZE 35882577 08-14 16:31:19.888: I/System.out(22759): 250-8BITMIME 08-14 16:31:19.888: I/System.out(22759): 250-AUTH LOGIN PLAIN XOAUTH 08-14 16:31:19.888: I/System.out(22759): 250 ENHANCEDSTATUSCODES 08-14 16:31:19.888: I/System.out(22759): DEBUG SMTP: Found extension "SIZE", arg "35882577" 08-14 16:31:19.888: I/System.out(22759): DEBUG SMTP: Found extension "8BITMIME", arg "" 08-14 16:31:19.888: I/System.out(22759): DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH" 08-14 16:31:19.888: I/System.out(22759): DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg "" 08-14 16:31:19.888: I/System.out(22759): DEBUG SMTP: Attempt to authenticate 08-14 16:31:19.896: I/System.out(22759): AUTH LOGIN 08-14 16:31:20.044: I/System.out(22759): 334 VXNlcm5hbWU6 08-14 16:31:20.044: I/System.out(22759): 08-14 16:31:20.185: I/System.out(22759): 334 UGFzc3dvcmQ6 08-14 16:31:20.185: I/System.out(22759): 08-14 16:31:20.341: I/System.out(22759): 334 UGFzc3dvcmQ6 08-14 16:31:20.341: I/System.out(22759): DEBUG SMTP: useEhlo true, useAuth false 08-14 16:31:20.341: I/System.out(22759): DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL true 08-14 16:31:20.786: I/System.out(22759): 220 mx.google.com ESMTP og7sm597845pbb.62 08-14 16:31:20.786: I/System.out(22759): DEBUG SMTP: connected to host "smtp.gmail.com", port: 465 08-14 16:31:20.786: I/System.out(22759): EHLO localhost 08-14 16:31:20.935: I/System.out(22759): 250-mx.google.com at your service, [202.155.209.250] 08-14 16:31:20.935: I/System.out(22759): 250-SIZE 35882577 08-14 16:31:20.935: I/System.out(22759): 250-8BITMIME 08-14 16:31:20.935: I/System.out(22759): 250-AUTH LOGIN PLAIN XOAUTH 08-14 16:31:20.935: I/System.out(22759): 250 ENHANCEDSTATUSCODES 08-14 16:31:20.943: I/System.out(22759): DEBUG SMTP: Found extension "SIZE", arg "35882577" 08-14 16:31:20.943: I/System.out(22759): DEBUG SMTP: Found extension "8BITMIME", arg "" 08-14 16:31:20.943: I/System.out(22759): DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH" 08-14 16:31:20.943: I/System.out(22759): DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg "" 08-14 16:31:20.943: I/System.out(22759): DEBUG SMTP: Attempt to authenticate 08-14 16:31:20.943: I/System.out(22759): AUTH LOGIN 08-14 16:31:21.091: I/System.out(22759): 334 VXNlcm5hbWU6 08-14 16:31:21.091: I/System.out(22759): 08-14 16:31:21.239: I/System.out(22759): 334 UGFzc3dvcmQ6 08-14 16:31:21.239: I/System.out(22759): 08-14 16:31:21.380: I/System.out(22759): 334 UGFzc3dvcmQ6 08-14 16:31:49.357: W/IInputConnectionWrapper(22759): clearMetaKeyStates on inactive InputConnection 

I am already performing a send operation in AsyncTask, may I ask why it still does not work?

+4
source share
6 answers

as the log shows, you invoke network-related tasks from the main user interface thread. You must use AsyncTask for these messages. and remove StrictMode by doing

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

Also see my answer in this post regarding the use of the JavaMail API .

EDIT: Added code inside com.max.mactest package;

 import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.os.StrictMode; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class Sender extends Activity { Button Send; TextView text; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_login); Send = (Button) findViewById(R.id.cmdDoLogin); text = (TextView) findViewById(R.id.textView2); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() .permitAll().build(); StrictMode.setThreadPolicy(policy); Send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub new SendMail().execute(); } }); } private class SendMail extends AsyncTask<String, Void, Integer> { ProgressDialog pd = null; String error = null; Integer result; @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); pd = new ProgressDialog(Sender.this); pd.setTitle("Sending Mail"); pd.setMessage("Please wait..."); pd.setCancelable(false); pd.show(); } @Override protected Integer doInBackground(String... params) { // TODO Auto-generated method stub MailSender sender = new MailSender(" yourmail@gmail.com ", "yourpassword"); sender.setTo(new String[]{" tomail@gmail.com "}); sender.setFrom(" yourmail@gmail.com "); sender.setSubject("Test mail"); sender.setBody("This is the mail body"); try { if(sender.send()) { System.out.println("Message sent"); return 1; } else { return 2; } } catch (Exception e) { error = e.getMessage(); Log.e("SendMail", e.getMessage(), e); } return 3; } protected void onPostExecute(Integer result) { pd.dismiss(); if(error!=null) { text.setText(error); } if(result==1) { Toast.makeText(Sender.this, "Email was sent successfully.", Toast.LENGTH_LONG) .show(); } else if(result==2) { Toast.makeText(Sender.this, "Email was not sent.", Toast.LENGTH_LONG).show(); } else if(result==3) { Toast.makeText(Sender.this, "There was a problem sending the email.", Toast.LENGTH_LONG).show(); } } } } 

Updated MailSender

 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.Authenticator; 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 MailSender extends 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 multi; public MailSender(){ host = "smtp.gmail.com"; port = "465"; sport = "465"; user = ""; password = ""; from = ""; subject = ""; body = ""; debuggable = false; auth = true; multi = 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/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 MailSender(String user, String password){ this(); this.user = user; this.password = password; } public boolean send() throws Exception { Properties props = setProperties(); try{ Session session = Session.getInstance(props, this); session.setDebug(true); 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()); BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText(body); multi.addBodyPart(messageBodyPart); msg.setContent(multi); Transport transport = session.getTransport("smtps"); transport.connect(host, 465, user, password); transport.sendMessage(msg, msg.getAllRecipients()); transport.close(); return true; } catch (Exception e) { e.printStackTrace(); 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(filename); multi.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; } public void setTo(String[] toAddress) { this.to = toAddress; } public void setFrom(String fromAddress) { this.from = fromAddress; } public void setSubject(String subject) { this.subject = subject; } public void setBody(String body) { this.body = body; } } 
+6
source

ADDs 3 cans found in the following link to your Android project (right-click on the project - add external banks)

Click here - How to add external JARs

Run the project and check the recipient's mail account for mail. Hooray!!

Hope this helps.

+2
source

After checking my work Email Application . I posted it here

Before this, please confirm that you have added

<uses-permission android:name="android.permission.INTERNET"/> in the manifest

+2
source

I think you are working with API level 9+

You need to read about StrictMode .

In your case, you are trying to block the network API in the main user interface thread, so that an error occurs.

As a solution, you can do this in your onCreate()

 if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); } 

Read: This Blog , API Guide ,

Also read about AsyncTask and use it to complete the task that you are performing in the main thread.

+2
source

For NetworkOnMainThreadException, you need to use AsyncTask to perform network activity. To do this, you can try and check the following code. I did not check it, maybe you need some settings in the code.

First create a class for AsyncTask, for example:

 private class SendMail extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub try { MailSender sender = new MailSender(" me@gmail.com ", "password"); sender.sendMail("Testing", "This is a test mail", " me@gmail.com ", " me@gmail.com "); } catch (Exception e) { text.setText(e.getMessage()); Log.e("SendMail", e.getMessage(), e); } return null; } } 

Now you can simply complete your network activity task by calling new SendMail().execute() from your onCreate method.

0
source

if you use an asynchronous task to send emails just follow this

 private class DownloadImageTask extends AsyncTask<String, String, Void> { int flag=0; protected Void doInBackground(String... arg0) { try{ m = new Mail(emailaddress, password); m.setFrom(emailaddress.trim()); toArr = email.split(","); for(int i=0;i<toArr.length;i++) { // checking all emails entered are correct or not if (toArr[i].trim().matches(EMAIL_PATTERN)) { emailflag = true; } else { emailflag = false; break; } } m.setTo(toArr); if(!Subject.equals("")) { m.setSubject(txtSubject.getText().toString()); } else { m.setSubject("No Subject"); } if(!EmailBody.equals("")) { m.setBody(txtEmailBody.getText().toString()); } else { m.setBody("No Message"); } if(!attachefile.equals("")) { String[] temp; temp = attachefile.split("\\*"); if(temp.length>0) { for(int i =0; i < temp.length ; i++) { m.addAttachment(temp[i]); } } } if(emailflag && m.send()) { flag=1; Intent intent = new Intent(SendEmail.this,SendEmail.class); startActivity(intent); } else { flag = 0; } }catch(Exception e){ e.printStackTrace(); } return null; } protected void onPostExecute(Void result) { progressDialog.dismiss(); if(flag==1) { Toast.makeText(SendEmail.this, "Sent Successfully", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(SendEmail.this, "Failed please give correct email address", Toast.LENGTH_SHORT).show(); } } } 

This is a regular expression for email.

 private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; 
0
source

All Articles