Отправка электронной почты на Android с использованием API JavaMail без использования стандартного / встроенного приложения

Я пытаюсь создать приложение для отправки почты в Android.

Если я использую:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 

Это запустит встроенное приложение для Android; Я пытаюсь отправить почту по кнопке напрямую, не используя это приложение.

Отправьте электронное письмо на Android с помощью JavaMail API, используя проверку подлинности Gmail.

Шаги по созданию образца проекта:

MailSenderActivity.java:

 public class MailSenderActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final Button send = (Button) this.findViewById(R.id.send); send.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { 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("SendMail", e.getMessage(), e); } } }); } } 

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 com.provider.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:

 /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @author Alexander Y. Kleymenov * @version $Revision$ */ import java.security.AccessController; import java.security.Provider; public final class JSSEProvider extends Provider { public JSSEProvider() { super("HarmonyJSSE", 1.0, "Harmony JSSE Provider"); AccessController.doPrivileged(new java.security.PrivilegedAction() { 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; } }); } } 

ДОБАВИТЬ 3 банки, найденные в следующей ссылке на ваш Android-проект

  • mail.jar
  • activation.jar
  • additional.jar

Нажмите здесь – Как добавить внешние банки

И не забудьте добавить эту строку в ваш манифест:

  

Просто нажмите ссылку ниже, чтобы изменить доступ к учетной записи для менее безопасных приложений. https://www.google.com/settings/security/lesssecureapps

Запустите проект и проверьте почтовую учетную запись получателя на почту. Ура!

PS И не забывайте, что вы не можете выполнять сетевую операцию с любого Activity in android. Следовательно, рекомендуется использовать AsyncTask или IntentService чтобы избежать сети при исключении основной нити.

Файлы Jar: https://code.google.com/archive/p/javamail-android/

Благодарим вас за ценную информацию. Код работает нормально. Я могу добавить вложение, добавив следующий код.

 private Multipart _multipart; _multipart = new MimeMultipart(); public void addAttachment(String filename,String subject) throws Exception { BodyPart messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName(filename); _multipart.addBodyPart(messageBodyPart); BodyPart messageBodyPart2 = new MimeBodyPart(); messageBodyPart2.setText(subject); _multipart.addBodyPart(messageBodyPart2); } message.setContent(_multipart); 

Не удалось подключиться к хосту SMTP: smtp.gmail.com, порт: 465

Добавьте эту строку в свой манифест:

  

Вы можете использовать API JavaMail для обработки ваших задач электронной почты. API JavaMail доступен в пакете JavaEE, и его фляга доступна для загрузки. К сожалению, он не может использоваться непосредственно в приложении для Android, поскольку он использует компоненты AWT, которые полностью несовместимы с Android.

Порт Android для JavaMail можно найти в следующем месте: http://code.google.com/p/javamail-android/

Добавьте банки в приложение и используйте SMTP-метод

Чтобы помочь тем, кто получает исключение Network On Main Thread Exception с помощью SDK Target> 9. Это использует вышеприведенный код droopie, но будет работать аналогично для любого.

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

Вы можете использовать AsyncTask, как показано ниже.

 public void onClickMail(View view) { new SendEmailAsyncTask().execute(); } class SendEmailAsyncTask extends AsyncTask  { Mail m = new Mail("[email protected]", "my password"); public SendEmailAsyncTask() { if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "SendEmailAsyncTask()"); String[] toArr = { "to [email protected]"}; m.setTo(toArr); m.setFrom("from [email protected]"); m.setSubject("Email from Android"); m.setBody("body."); } @Override protected Boolean doInBackground(Void... params) { if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "doInBackground()"); try { m.send(); return true; } catch (AuthenticationFailedException e) { Log.e(SendEmailAsyncTask.class.getName(), "Bad account details"); e.printStackTrace(); return false; } catch (MessagingException e) { Log.e(SendEmailAsyncTask.class.getName(), m.getTo(null) + "failed"); e.printStackTrace(); return false; } catch (Exception e) { e.printStackTrace(); return false; } } . public void onClickMail(View view) { new SendEmailAsyncTask().execute(); } class SendEmailAsyncTask extends AsyncTask  { Mail m = new Mail("[email protected]", "my password"); public SendEmailAsyncTask() { if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "SendEmailAsyncTask()"); String[] toArr = { "to [email protected]"}; m.setTo(toArr); m.setFrom("from [email protected]"); m.setSubject("Email from Android"); m.setBody("body."); } @Override protected Boolean doInBackground(Void... params) { if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "doInBackground()"); try { m.send(); return true; } catch (AuthenticationFailedException e) { Log.e(SendEmailAsyncTask.class.getName(), "Bad account details"); e.printStackTrace(); return false; } catch (MessagingException e) { Log.e(SendEmailAsyncTask.class.getName(), m.getTo(null) + "failed"); e.printStackTrace(); return false; } catch (Exception e) { e.printStackTrace(); return false; } } 

SMTP

Использование SMTP – это один из способов, и другие уже указали, как это сделать. Просто имейте в виду, что при этом вы полностью обходите встроенное почтовое приложение, и вам нужно будет указать адрес SMTP-сервера, имя пользователя и пароль для этого сервера, либо статически в вашем коде, либо запросить его у пользователя ,

HTTP

Другой способ – простой скрипт на стороне сервера, например php, который принимает некоторые параметры URL и использует их для отправки почты. Таким образом, вам нужно только сделать HTTP-запрос с устройства (это легко возможно со встроенными библиотеками) и не нужно хранить данные входа SMTP на устройстве. Это еще одно косвенное сравнение по сравнению с прямым использованием SMTP, но поскольку так просто сделать HTTP-запрос и отправлять письма с PHP, это может быть даже проще, чем прямой путь.

Почтовое приложение

Если почта отправляется с учетной записи электронной почты по умолчанию, которую он уже зарегистрировал на телефоне, вам придется воспользоваться другим подходом. Если у вас достаточно времени и опыта, вы можете проверить исходный код приложения электронной почты Android, чтобы узнать, предлагает ли он какую-либо точку входа для отправки почты без взаимодействия с пользователем (я не знаю, но, возможно, есть один).

Возможно, вы даже найдете способ запросить детали учетной записи пользователя (так что вы можете использовать их для SMTP), хотя я очень сомневаюсь, что это возможно, потому что это будет огромный риск для безопасности, и Android построен достаточно надежно.

вот альт-версия, которая также работает для меня и имеет вложения (размещена уже выше, но полная версия, в отличие от исходной ссылки, которую люди опубликовали, они не могут заставить ее работать с отсутствием данных)

 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 _pass; 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 Mail() { _host = "smtp.gmail.com"; // default smtp server _port = "465"; // default smtp port _sport = "465"; // default socketfactory port _user = ""; // username _pass = ""; // 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(); _user = user; _pass = pass; } public boolean send() throws Exception { Properties props = _setProperties(); if(!_user.equals("") && !_pass.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(filename); _multipart.addBodyPart(messageBodyPart); } @Override public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(_user, _pass); } 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; } public void setTo(String[] toArr) { // TODO Auto-generated method stub this._to=toArr; } public void setFrom(String string) { // TODO Auto-generated method stub this._from=string; } public void setSubject(String string) { // TODO Auto-generated method stub this._subject=string; } // more of the getters and setters ….. } 

и назвать это в своей деятельности ...

 @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); Button addImage = (Button) findViewById(R.id.send_email); addImage.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Mail m = new Mail("[email protected]", "password"); String[] toArr = {"[email protected]", "[email protected]"}; m.setTo(toArr); m.setFrom("[email protected]"); m.setSubject("This is an email sent using my Mail JavaMail wrapper from an Android device."); m.setBody("Email body."); try { m.addAttachment("/sdcard/filelocation"); if(m.send()) { Toast.makeText(MailApp.this, "Email was sent successfully.", Toast.LENGTH_LONG).show(); } else { Toast.makeText(MailApp.this, "Email was not sent.", Toast.LENGTH_LONG).show(); } } catch(Exception e) { //Toast.makeText(MailApp.this, "There was a problem sending the email.", Toast.LENGTH_LONG).show(); Log.e("MailApp", "Could not send email", e); } } }); } 

100% рабочий код с демо. Вы также можете отправить несколько писем с помощью этого ответа.

Загрузить проект ЗДЕСЬ

Шаг 1. Загрузите почту, активацию, дополнительные файлы jar и добавьте в папку проекта libs в студии Android. Я добавил снимок экрана ниже.

добавить libs

Войдите в систему с помощью gmail ( используя ваш почтовый ящик ) и включите кнопку переключения LINK

Большинство людей забывают об этом шаге, надеюсь, вы этого не сделаете.

Шаг 2: После завершения этого процесса. Скопируйте и пропустите эти classы в свой проект.

GMail.java

 import android.util.Log; import java.io.UnsupportedEncodingException; import java.util.List; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class GMail { final String emailPort = "587";// gmail's smtp port final String smtpAuth = "true"; final String starttls = "true"; final String emailHost = "smtp.gmail.com"; String fromEmail; String fromPassword; List toEmailList; String emailSubject; String emailBody; Properties emailProperties; Session mailSession; MimeMessage emailMessage; public GMail() { } public GMail(String fromEmail, String fromPassword, List toEmailList, String emailSubject, String emailBody) { this.fromEmail = fromEmail; this.fromPassword = fromPassword; this.toEmailList = toEmailList; this.emailSubject = emailSubject; this.emailBody = emailBody; emailProperties = System.getProperties(); emailProperties.put("mail.smtp.port", emailPort); emailProperties.put("mail.smtp.auth", smtpAuth); emailProperties.put("mail.smtp.starttls.enable", starttls); Log.i("GMail", "Mail server properties set."); } public MimeMessage createEmailMessage() throws AddressException, MessagingException, UnsupportedEncodingException { mailSession = Session.getDefaultInstance(emailProperties, null); emailMessage = new MimeMessage(mailSession); emailMessage.setFrom(new InternetAddress(fromEmail, fromEmail)); for (String toEmail : toEmailList) { Log.i("GMail", "toEmail: " + toEmail); emailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail)); } emailMessage.setSubject(emailSubject); emailMessage.setContent(emailBody, "text/html");// for a html email // emailMessage.setText(emailBody);// for a text email Log.i("GMail", "Email Message created."); return emailMessage; } public void sendEmail() throws AddressException, MessagingException { Transport transport = mailSession.getTransport("smtp"); transport.connect(emailHost, fromEmail, fromPassword); Log.i("GMail", "allrecipients: " + emailMessage.getAllRecipients()); transport.sendMessage(emailMessage, emailMessage.getAllRecipients()); transport.close(); Log.i("GMail", "Email sent successfully."); } } 

SendMailTask.java

 import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.util.Log; import java.util.List; public class SendMailTask extends AsyncTask { private ProgressDialog statusDialog; private Activity sendMailActivity; public SendMailTask(Activity activity) { sendMailActivity = activity; } protected void onPreExecute() { statusDialog = new ProgressDialog(sendMailActivity); statusDialog.setMessage("Getting ready..."); statusDialog.setIndeterminate(false); statusDialog.setCancelable(false); statusDialog.show(); } @Override protected Object doInBackground(Object... args) { try { Log.i("SendMailTask", "About to instantiate GMail..."); publishProgress("Processing input...."); GMail androidEmail = new GMail(args[0].toString(), args[1].toString(), (List) args[2], args[3].toString(), args[4].toString()); publishProgress("Preparing mail message...."); androidEmail.createEmailMessage(); publishProgress("Sending email...."); androidEmail.sendEmail(); publishProgress("Email Sent."); Log.i("SendMailTask", "Mail Sent."); } catch (Exception e) { publishProgress(e.getMessage()); Log.e("SendMailTask", e.getMessage(), e); } return null; } @Override public void onProgressUpdate(Object... values) { statusDialog.setMessage(values[0].toString()); } @Override public void onPostExecute(Object result) { statusDialog.dismiss(); } } 

Шаг 3: Теперь вы можете изменить этот class в соответствии с вашими потребностями, и вы можете отправить несколько писем с помощью этого classа. Я предоставляю xml и java-файл.

activity_mail.xml

                 

SendMailActivity.java

 import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.util.Arrays; import java.util.List; public class SendMailActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final Button send = (Button) this.findViewById(R.id.button1); send.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Log.i("SendMailActivity", "Send Button Clicked."); String fromEmail = ((TextView) findViewById(R.id.editText1)) .getText().toString(); String fromPassword = ((TextView) findViewById(R.id.editText2)) .getText().toString(); String toEmails = ((TextView) findViewById(R.id.editText3)) .getText().toString(); List toEmailList = Arrays.asList(toEmails .split("\\s*,\\s*")); Log.i("SendMailActivity", "To List: " + toEmailList); String emailSubject = ((TextView) findViewById(R.id.editText4)) .getText().toString(); String emailBody = ((TextView) findViewById(R.id.editText5)) .getText().toString(); new SendMailTask(SendMailActivity.this).execute(fromEmail, fromPassword, toEmailList, emailSubject, emailBody); } }); } } 

Примечание. Не забудьте добавить разрешение на использование Интернета в файле AndroidManifest.xml.

Надеюсь, что это сработает, если это не так, просто прокомментируйте ниже.

Слово предупреждения при использовании «smtp.gmail.com» в качестве сервера smtp по умолчанию.

Google заставит вас часто менять свой пароль для учетной записи электронной почты из-за их усердной политики «подозрительной деятельности». По сути, он рассматривает повторяющиеся запросы smtp из разных стран в короткие сроки как «подозрительные действия». Поскольку они предполагают, что вы (владелец учетной записи электронной почты) могут находиться только в одной стране одновременно.

Когда google-системы обнаруживают «подозрительную активность», это предотвратит дальнейшие электронные письма, пока вы не измените пароль. Поскольку у вас будет жестко закодированный пароль в приложении, вы должны переиздавать приложение каждый раз, когда это происходит, а не идеально. Это случалось 3 раза в неделю для меня, я даже хранил пароль на другом сервере и динамически извлекал пароль каждый раз, когда Google заставлял меня его менять.

Поэтому я рекомендую использовать один из многих бесплатных smtp-поставщиков вместо «smtp.gmail.com», чтобы избежать этой проблемы безопасности. Используйте тот же код, но измените «smtp.gmail.com» на свой новый хост пересылки smtp.

GmailBackground – небольшая библиотека для отправки электронной почты в фоновом режиме без взаимодействия с пользователем:

Применение:

  BackgroundMail.newBuilder(this) .withUsername("[email protected]") .withPassword("password12345") .withMailto("[email protected]") .withType(BackgroundMail.TYPE_PLAIN) .withSubject("this is the subject") .withBody("this is the body") .withOnSuccessCallback(new BackgroundMail.OnSuccessCallback() { @Override public void onSuccess() { //do some magic } }) .withOnFailCallback(new BackgroundMail.OnFailCallback() { @Override public void onFail() { //do some magic } }) .send(); 

Конфигурация:

 repositories { // ... maven { url "https://jitpack.io" } } dependencies { compile 'com.github.yesidlazaro:GmailBackground:1.2.0' } 

Разрешения:

   

Также для вложений вам необходимо установить READ_EXTERNAL_STORAGE разрешение:

  

Источник

(Я сам тестировал)

Изменить: JavaMail 1.5.5 утверждает, что поддерживает Android , поэтому вам не нужно ничего другого.

Я портировал последнюю версию JavaMail (1.5.4) на Android. Он доступен в Maven Central, просто добавьте следующее для build.gradle ~~

 compile 'eu.ocathain.com.sun.mail:javax.mail:1.5.4' 

Затем вы можете следовать официальному руководству .

Исходный код доступен здесь: https://bitbucket.org/artbristol/javamail-forked-android

For sending a mail with attachment..

 public class SendAttachment{ public static void main(String [] args){ //to address String to="[email protected]";//change accordingly //from address final String user="[email protected]";//change accordingly final String password="password";//change accordingly 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); //1) get the session object Properties properties = System.getProperties(); properties.put("mail.smtp.port", "465"); properties.put("mail.smtp.host", "smtp.gmail.com"); properties.put("mail.smtp.socketFactory.port", "465"); properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); properties.put("mail.smtp.auth", "true"); properties.put("mail.smtp.port", "465"); Session session = Session.getDefaultInstance(properties, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user,password); } }); //2) compose message try{ MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(user)); message.addRecipient(Message.RecipientType.TO,new InternetAddress(to)); message.setSubject("Hii"); //3) create MimeBodyPart object and set your message content BodyPart messageBodyPart1 = new MimeBodyPart(); messageBodyPart1.setText("How is This"); //4) create new MimeBodyPart object and set DataHandler object to this object MimeBodyPart messageBodyPart2 = new MimeBodyPart(); //Location of file to be attached String filename = Environment.getExternalStorageDirectory().getPath()+"/R2832.zip";//change accordingly DataSource source = new FileDataSource(filename); messageBodyPart2.setDataHandler(new DataHandler(source)); messageBodyPart2.setFileName("Hello"); //5) create Multipart object and add MimeBodyPart objects to this object Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart1); multipart.addBodyPart(messageBodyPart2); //6) set the multiplart object to the message object message.setContent(multipart ); //7) send message Transport.send(message); System.out.println("MESSAGE SENT...."); }catch (MessagingException ex) {ex.printStackTrace();} } } 

Did you consider using Apache Commons Net ? Since 3.3, just one jar (and you can depend on it using gradle or maven) and you’re done : http://blog.dahanne.net/2013/06/17/sending-a-mail-in-java-and-android-with-apache-commons-net/

Those who are getting ClassDefNotFoundError try to move that Three jar files to lib folder of your Project,it worked for me!!

I found a shorter alternative for others who need help. Код:

 package com.mkyong.common; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class SendMailTLS { public static void main(String[] args) { final String username = "[email protected]"; final String password = "password"; Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.port", "587"); Session session = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("username", "password"); } }); try { Message message = new MimeMessage(session); message.setFrom(new InternetAddress("[email protected]")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("[email protected]")); message.setSubject("Testing Subject"); message.setText("Dear Mail Crawler," + "\n\n No spam to my email, please!"); Transport.send(message); System.out.println("Done"); } catch (MessagingException e) { throw new RuntimeException(e); } } } 

Source: Sending Email via JavaMail API

Надеюсь это поможет! Удачи!

I am unable to run Vinayak B’s code. Finally i solved this issue by following :

1.Using this

2.Applying AsyncTask.

3.Changing security issue of sender gmail account.(Change to “TURN ON”) in this

Without user intervention, you can send as follows:

  1. Send email from client apk. Here mail.jar, activation.jar is required to send java email. If these jars are added, it might increase the APK Size.

  2. Alternatively, You can use a web-service at the server side code, which will use the same mail.jar and activation.jar to send email. You can call the web-service via asynctask and send email. Refer same link.

(But, you will need to know the credentials of the mail account)

  Add jar files mail.jar,activation.jar,additionnal.jar String sub="Thank you for your online registration" ; Mail m = new Mail("emailid", "password"); String[] toArr = {"[email protected]",sEmailId}; m.setFrom("[email protected]"); m.setTo(toArr); m.setSubject(sub); m.setBody(msg); try{ if(m.send()) { } else { } } catch(Exception e) { Log.e("MailApp", "Could not send email", e); } package com.example.ekktra; 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 _pass; 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 Mail() { _host = "smtp.gmail.com"; // default smtp server _port = "465"; // default smtp port _sport = "465"; // default socketfactory port _user = ""; // username _pass = ""; // 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(); _user = user; _pass = pass; } public boolean send() throws Exception { Properties props = _setProperties(); if(!_user.equals("") && !_pass.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(filename); _multipart.addBodyPart(messageBodyPart); } @Override public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(_user, _pass); } 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; } public void setTo(String[] toArr) { // TODO Auto-generated method stub this._to=toArr; } public void setFrom(String string) { // TODO Auto-generated method stub this._from=string; } public void setSubject(String string) { // TODO Auto-generated method stub this._subject=string; } } 

In case that you are demanded to keep the jar library as small as possible, you can include the SMTP/POP3/IMAP function separately to avoid the “too many methods in the dex” problem.

You can choose the wanted jar libraries from the javanet web page , for example, mailapi.jar + imap.jar can enable you to access icloud, hotmail mail server in IMAP protocol. (with the help of additional.jar and activation.jar)

I tried using the code that @Vinayak B submitted. However I’m getting an error saying: No provider for smtp

I created a new question for this with more information HERE

I was able to fix it myself after all. I had to use an other mail.jar and I had to make sure my ” access for less secure apps ” was turned on.

I hope this helps anyone who has the same problem. With this done, this piece of code works on the google glass too.

All the code provided in the other answers is correct and is working fine, but a bit messy, so I decided to publish a library (still in development though) to use it in a easier way: AndroidMail .

You have just to create a MailSender, build a mail and send it (already handled in background with an AsyncTask).

 MailSender mailSender = new MailSender(email, password); Mail.MailBuilder builder = new Mail.MailBuilder(); Mail mail = builder .setSender(senderMail) .addRecipient(new Recipient(recipient)) .setText("Hello") .build(); mailSender.sendMail(mail); 

You can receive a notification for the email sent and it has also the support for different Recipients types (TO, CC and BCC), attachments and html:

 MailSender mailSender = new MailSender(email, password); Mail.MailBuilder builder = new Mail.MailBuilder(); Mail mail = builder .setSender(senderMail) .addRecipient(new Recipient(recipient)) .addRecipient(new Recipient(Recipient.TYPE.CC, recipientCC)) .setText("Hello") .setHtml("

Hello

") .addAttachment(new Attachment(filePath, fileName)) .build(); mailSender.sendMail(mail, new MailSender.OnMailSentListener() { @Override public void onSuccess() { // mail sent! } @Override public void onError(Exception error) { // something bad happened :( } });

You can get it via Gradle or Maven:

 compile 'it.enricocandino:androidmail:1.0.0-SNAPSHOT' 

Please let me know if you have any issue with it! 🙂

To add attachment, don’t forget to add.

 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); 
  • Почему Spring MVC отвечает 404 и сообщает «Нет сопоставления для HTTP-запроса с URI в DispatcherServlet»?
  • Что означает этот символ в IntelliJ? (красный круг в нижнем левом углу имени файла, в нем «J»)
  • Как проверить, существует ли class в пакете?
  • Как увеличить размер кучи JVM
  • java.lang.ClassCastException
  • Что такое JAVA_HOME? Как JVM находит путь javac, хранящийся в JAVA_HOME?
  • Строковый постоянный пул
  • Не удалось создать Android Virtual Device
  • Как читать / писать строки из файла на Android
  • Получение NoClassDefFoundError при использовании common.lang.StringUtils в javas-коде android?
  • Какую библиотеку OCR Java я должен использовать в Android?
  • Interesting Posts

    Совместное использование куки-файлов ASP.NET в поддоменах

    Как открыть файлы EPS под Windows 7?

    Как отключить глобальный фильтр в ASP.Net MVC выборочно

    Выяснение, какие каталоги используют наибольшее пространство на окнах

    Как использовать C # для дезинфекции ввода на странице html?

    C-образный указатель на функцию void pointer

    SwingWorker не обновляет JProgressBar без Thread.sleep () в пользовательской диалоговой панели

    Когда рекомендуется использовать strdup (vs malloc / strcpy)

    Я не могу подключить DMG, получив ошибку «без монтируемых файловых систем»

    Ошибка компиляции C ++?

    длинный двойной (GCC специфический) и __float128

    Перегруженный аргумент группы методов смущает разрешение перегрузки?

    Многорядная вставка с pg-promiseм

    Должны ли все / большинство функций setter в C ++ 11 записываться как шаблоны функций, принимающие универсальные ссылки?

    Почему в параметрах C ++ последнее значение должно быть добавлено последними?

    Давайте будем гением компьютера.