Отправка электронной почты в Android с использованием JavaMail API без использования встроенного приложения по умолчанию - PullRequest
631 голосов
/ 07 января 2010

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

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

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

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

Ответы [ 22 ]

7 голосов
/ 05 апреля 2015

Редактировать: 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

6 голосов
/ 18 февраля 2018

Я нашел более короткую альтернативу для тех, кто нуждается в помощи. Код:

package com.example.mail;

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 = "username@gmail.com";
        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("from-email@gmail.com"));
            message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("to-email@gmail.com"));
            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);
        }
    }
}

Источник: Отправка электронной почты через JavaMail API

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

5 голосов
/ 01 декабря 2014

Те, кто получают ClassDefNotFoundError, пытаются переместить эти три jar-файла в папку lib вашего проекта, у меня это сработало !!

4 голосов
/ 06 октября 2015

Я не могу запустить код Vinayak B. Наконец я решил эту проблему следующим образом:

1.Использование этого

2.Применение AsyncTask.

3.Изменяется проблема безопасности учетной записи отправителя Gmail. (Измените на «ВКЛЮЧЕНО») в this

4 голосов
/ 06 мая 2014

Для отправки письма с вложением ..

public class SendAttachment{
                    public static void main(String [] args){ 
             //to address
                    String to="abc@abc.com";//change accordingly
                    //from address
                    final String user="efg@efg.com";//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();}
                  }
                }
3 голосов
/ 30 июля 2014

Без вмешательства пользователя вы можете отправить следующим образом:

  1. Отправить письмо от клиента apk. Здесь mail.jar, Activation.jar требуется для отправки электронной почты Java. Если эти банки добавить, это может увеличить размер APK.

  2. В качестве альтернативы, вы можете использовать веб-сервис на стороне сервера, который будет использовать те же mail.jar и activ.jar для отправки электронной почты. Вы можете позвонить в веб-сервис через asynctask и отправить электронное письмо. Обратитесь по той же ссылке.

(Но вам нужно будет знать учетные данные почтовой учетной записи)

3 голосов
/ 18 июня 2013

Рассматривали ли вы использование Apache Commons Net? Начиная с версии 3.3, только одна банка (и вы можете рассчитывать на нее, используя gradle или maven), и все готово: http://blog.dahanne.net/2013/06/17/sending-a-mail-in-java-and-android-with-apache-commons-net/

2 голосов
/ 23 июня 2016

Весь код, предоставленный в других ответах, является правильным и работает нормально, но немного грязно, поэтому я решил опубликовать библиотеку (все еще в разработке), чтобы использовать ее более простым способом: AndroidMail .

Вам нужно только создать MailSender, создать почту и отправить ее (уже обработано в фоновом режиме с помощью 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);

Вы можете получить уведомление об отправленном электронном письме, а также оно поддерживает различные типы получателей (TO, CC и BCC), вложения и 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("<h1 style=\"color:red;\">Hello</h1>")
    .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 :(
    }
});

Вы можете получить его через Gradle или Maven:

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

Пожалуйста, дайте мне знать, если у вас есть какие-либо проблемы с этим! :)

2 голосов
/ 24 февраля 2015

Я пытался использовать код, представленный @Vinayak B. Однако я получаю сообщение об ошибке: нет поставщика SMTP

Я создал новый вопрос для этого с дополнительной информацией ЗДЕСЬ

Я все-таки смог это исправить сам. Я должен был использовать другой mail.jar и я должен был убедиться, что мой « доступ для менее безопасных приложений » включен.

Надеюсь, это поможет любому, у кого такая же проблема. После этого этот фрагмент кода работает и на стекле Google.

2 голосов
/ 26 сентября 2014

В случае, если от вас требуется, чтобы библиотека jar была как можно меньше, можно отдельно включить функцию SMTP / POP3 / IMAP, чтобы избежать проблемы «слишком много методов в dex».

Вы можете выбрать нужные библиотеки jar из веб-страницы javanet , например, mailapi.jar + imap.jar может предоставить вам доступ к icloud, почтовому серверу hotmail по протоколу IMAP. (с помощью Additional.jar и Activation.jar)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...