Надсилання електронної пошти в Android за допомогою API JavaMail без використання програми за замовчуванням / вбудованим додатком


653

Я намагаюся створити додаток для надсилання пошти в Android.

Якщо я використовую:

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

Це запустить вбудований додаток Android; Я намагаюся надіслати пошту на натискання кнопки безпосередньо, не використовуючи цю програму.


3
javax.mail.AuthenticationFailedException при надсиланні електронної пошти, хоча користувач / пароль є правильними. Будь-яке рішення?
TD Nguyen

1
Зауважте, що станом на 1.5.5, JavaMail заявляє, що підтримує Android
artbristol

1
Хіба SendGrid не є варіантом? Наскільки я знаю, ви також маєте можливість отримати статистику надсилаємих вами електронних
листів

Відповіді:


757

Надсилання електронної пошти в Android за допомогою API JavaMail за допомогою аутентифікації 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("username@gmail.com", "password");
                    sender.sendMail("This is Subject",   
                            "This is Body",   
                            "user@gmail.com",   
                            "user@yahoo.com");   
                } 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<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;
            }
        });
    }
}

ДОДАТИ 3 банки, знайдені в наступному посиланні на ваш Android Project

Клацніть тут - Як додати зовнішні банки

І не забудьте додати цей рядок у свій маніфест:

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

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

Запустіть проект і перевірте, чи є у вашому обліковому записі одержувача. Ура!

PS І не забувайте, що ви не можете робити мережеві операції з будь-якої діяльності в Android. Тому рекомендується використовувати AsyncTaskабо IntentServiceуникати мережу за винятком основного потоку.

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


52
Схоже, ваш код використовує жорстко закодовані ім’я користувача та пароль. Чи є це наразі ризиком безпеки (тобто, декомпілювались програми, які завантажуються на ринок)?
Багатий

11
Для мене працює !!! не забудьте додати у свій додаток маніфест використання дозволу INTERNET
Avi Shukron

15
чи все-таки можна отримати електронний лист, не вводячи пароль у код? Я думаю, що користувачі будуть здивовані, якби я попросив їх електронну пошту ...
pumpkee

7
Привіт Спасибі за код. але я отримав java.lang.NoClassDefFoundError на GMailSender відправника = новий GMailSender (...) на mailsenderactivity. Я включив усі банки і додав до складання шляху. я витратив деякий час, щоб вирішити це. але я не отримую рішення. будь ласка, допоможи мені.
МАМуралі

53
Для тих, хто скаржиться / запитує про те, як отримати пароль користувача - тут не ідея. Це призначено для використання з вашим обліковим записом електронної пошти (розробника). Якщо ви хочете покластися на обліковий запис електронної пошти користувача, ви повинні використовувати наміри електронної пошти, які широко обговорюються в інших публікаціях.
Том

70

Дякую за цінну інформацію. Код працює нормально. Я можу додати вкладення також, додавши наступний код.

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

6
Додайте це до GmailSender.java
Сміття

коли я зателефонував на setcontent, це змінило вміст мого тіла. я роблю щось не так. Я хочу додати вкладення з іншим текстовим вмістом тіла
Калвін

1
для filenameзмінної тут потрібно вказати шлях до файлу. Наприклад:String path = Environment.getExternalStorageDirectory().getPath() + "/temp_share.jpg";

Цей код допоможе вам додати кілька файлів stackoverflow.com/a/3177640/2811343 ;) :)
AndroidManifester

54

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

Додайте цей рядок у свій маніфест:

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

39

Для обробки завдань електронної пошти можна використовувати API JavaMail. API JavaMail доступний у пакеті JavaEE, і його банку доступна для завантаження. На жаль, його не можна використовувати безпосередньо в додатку для Android, оскільки він використовує компоненти AWT, які повністю сумісні в Android.

Ви можете знайти порт Android для JavaMail у такому місці: http://code.google.com/p/javamail-android/

Додайте банки до програми та використовуйте метод SMTP


1
Будь-яке сховище Maven для цього?
користувач1050755

Вибачте, але я цього не знаю
Kshitij Aggarwal

6
Я переніс останню версію JavaMail, і вона доступна в Maven Central підeu.ocathain.com.sun.mail:javax.mail:1.5.2
artbristol

29

Для того, щоб допомогти тим, хто отримує виняток у мережі на головній нитці, за допомогою цілі SDK> 9. Для цього використовується код дропі, описаний вище, але він працює аналогічно для будь-якого.

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 <Void, Void, Boolean> {
    Mail m = new Mail("from@gmail.com", "my password");

    public SendEmailAsyncTask() {
        if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "SendEmailAsyncTask()");
        String[] toArr = { "to mail@gmail.com"};
        m.setTo(toArr);
        m.setFrom("from mail@gmail.com");
        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;
        }
    }

Куди додати цей клас
Gunaseelan

25

100% робочий код з демонстраційним повідомленням Ви також можете надіслати кілька електронних листів за допомогою цієї відповіді.

Завантажити проект ТУТ

Крок 1: Завантажте пошту, активацію, додаткові файли jar та додайте в папку libs вашого проекту в студії Android. Я додав знімок екрана, див. Нижче Посилання для завантаження

губки додати

Увійти з допомогою Gmail ( використовуючи ваш від пошти ) і ВКЛЮЧИТИ тумблер кнопка LINK

Більшість людей забувають про цей крок, я сподіваюся, що ви цього не зробите.

Крок 2: Після завершення цього процесу. Скопіюйте та вставте цей клас у свій проект.

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<String> toEmailList;
    String emailSubject;
    String emailBody;

    Properties emailProperties;
    Session mailSession;
    MimeMessage emailMessage;

    public GMail() {

    }

    public GMail(String fromEmail, String fromPassword,
            List<String> 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: Тепер ви можете змінити цей клас відповідно до ваших потреб, також ви можете надіслати кілька повідомлень за допомогою цього класу. Я надаю файл XML та Java.

activity_mail.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingLeft="20dp"
    android:paddingRight="20dp"
    android:paddingTop="30dp">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:text="From Email" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FFFFFF"
        android:cursorVisible="true"
        android:editable="true"
        android:ems="10"
        android:enabled="true"
        android:inputType="textEmailAddress"
        android:padding="5dp"
        android:textColor="#000000">

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:text="Password (For from email)" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FFFFFF"
        android:ems="10"
        android:inputType="textPassword"
        android:padding="5dp"
        android:textColor="#000000" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:text="To Email" />

    <EditText
        android:id="@+id/editText3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:ems="10"
        android:inputType="textEmailAddress"
        android:padding="5dp"
        android:textColor="#000000" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:text="Subject" />

    <EditText
        android:id="@+id/editText4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:ems="10"
        android:padding="5dp"
        android:textColor="#000000" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:text="Body" />

    <EditText
        android:id="@+id/editText5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:ems="10"
        android:inputType="textMultiLine"
        android:padding="35dp"
        android:textColor="#000000" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send Email" />

</LinearLayout>

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<String> 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

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

Сподіваюсь, що це спрацює, якщо не, просто прокоментуйте нижче.


2
Це безпечно? Якщо я заміню "fromEmail" та "fromPassword" жорстким кодом користувача та пароля, чи потрібно мені турбуватися з питань безпеки?
Йона Карп

Чи можливо отримувати електронну пошту за допомогою вашого методу? Я хочу отримати електронний лист
user3051460

1
@ArpitPatel це працює досить акуратно. Але я також переживаю за безпеку. Якщо ви використовуєте gmail, google може заблокувати певні програми, які намагаються зробити саме це.
Тотум Максим

@TotumusMaximus Якщо ви переживаєте за безпеку, то можете використовувати електронну пошту та пароль, використовуючи api
Arpit Patel

23

SMTP

Використання SMTP - це один із способів, а інші вже вказали, як це зробити. Просто зауважте, що, роблячи це, ви повністю обходите вбудований поштовий додаток, і вам доведеться вказати адресу SMTP-сервера, ім’я користувача та пароль для цього сервера, або статично у своєму коді, або запитувати його у користувача. .

HTTP

Інший спосіб передбачає простий серверний скрипт, наприклад, php, який приймає деякі параметри URL-адреси та використовує їх для надсилання пошти. Таким чином, вам потрібно зробити лише запит HTTP з пристрою (це легко можливо за допомогою вбудованих бібліотек) і не потрібно зберігати дані входу SMTP на пристрої. Це ще одна непряма порівняно з прямим використанням SMTP, але оскільки так легко зробити HTTP-запит і надсилати пошту з PHP, це може бути навіть простіше, ніж прямий шлях.

Поштовий додаток

Якщо пошту надсилатимуть з облікового запису користувача за замовчуванням, який він уже зареєстрував у телефоні, вам доведеться скористатися іншим підходом. Якщо у вас є достатньо часу та досвіду, ви можете перевірити вихідний код програми для електронної пошти Android, щоб побачити, чи він пропонує якусь точку входу для відправлення пошти без взаємодії з користувачем (я не знаю, але, можливо, є такий).

Можливо, ви навіть знайдете спосіб запитати дані облікових записів користувачів (щоб ви могли використовувати їх для SMTP), хоча я дуже сумніваюся, що це можливо, оскільки це був би величезний ризик для безпеки, а Android побудований досить надійно.


22

ось альт-версія, яка також працює для мене і має вкладені файли (розміщено вже вище, але повна версія на відміну від вихідного посилання, яке люди розміщували, вони не можуть змусити її працювати, оскільки її відсутні дані)

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("gmailusername@gmail.com", "password"); 

      String[] toArr = {"bla@bla.com", "lala@lala.com"}; 
      m.setTo(toArr); 
      m.setFrom("wooo@wooo.com"); 
      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); 
      } 
    } 
  }); 
} 

@KeyLimePiePhotonAndroid Додайте Інтернет-дозвіл на свій маніфест
noob

як використовувати цей код, якщо я хочу використовувати будь-який інший клієнт електронної пошти, такий як мій org? Чи достатньо змінити лише ім'я хоста та порт?
roger_that

javax.mail.AuthenticationFailedException будь-яке рішення для Android 4.4.4?
TD Nguyen

2
для javax.mail.AuthenticationFailedException потрібно ввімкнути це налаштування google.com/settings/security/lesssecureapps
Razel Soco

1
Вирішувати Could not send email android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork необхідно , щоб побачити це рішення stackoverflow.com/questions/25093546 / ...
jgrocha

14

GmailBackground - це невелика бібліотека для надсилання електронного листа у фоновому режимі без взаємодії з користувачем:

Використання:

    BackgroundMail.newBuilder(this)
            .withUsername("username@gmail.com")
            .withPassword("password12345")
            .withMailto("toemail@gmail.com")
            .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'
    }

Дозволи:

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

Також для вкладених файлів потрібно встановити дозвіл READ_EXTERNAL_STORAGE:

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

Джерело

(Я сам тестував)


Я використовую його і працює ідеально. Але я вніс деякі зміни для використання його з різними постачальниками електронної пошти, і коли надсилати електронну пошту на Gmail, він повертає мені заголовок "Від" ... Як це вирішити?
Еріх Гарсія

Привіт, я використовую цю програму у своєму додатку, але вона не працює і завжди дзвонить onfailcallback
Jawad Malik

13

Слово попередження, якщо ви використовуєте "smtp.gmail.com" як сервер smtp за замовчуванням.

Google змусить вас часто змінювати пароль пов’язаного облікового запису електронної пошти через занадто ретельну політику "підозрілої діяльності". По суті, він розглядає неодноразові SMTP-запити з різних країн за короткий проміжок часу як "підозрілу діяльність". Як вони припускають, ви (власник облікового запису електронної пошти) одночасно можете перебувати лише в одній країні.

Коли системи Google виявляють "підозрілу активність", це запобігатиме подальшим повідомленням електронної пошти, поки ви не зміните пароль. Оскільки у вас буде жорстко закодований пароль у програмі, ви повинні повторно випускати додаток щоразу, коли це станеться, не ідеально. Це траплялося зі мною 3 рази на тиждень, я навіть зберігав пароль на іншому сервері і динамічно добирав пароль кожного разу, коли Google змушував мене змінювати його.

Тому я рекомендую використовувати один із безлічі безкоштовних постачальників smtp замість "smtp.gmail.com", щоб уникнути цієї проблеми безпеки. Використовуйте той самий код, але змініть "smtp.gmail.com" на новий хост переадресації smtp.


2
Це хороший момент. Але чи можете ви надати приклад альтернативного постачальника електронної пошти, який працював з кодом (замінюючи лише smtp та дані про вхід). Я спробував це з hushmail та email.com, але без успіху. Будемо намагатися з іншими.
Пауло Матукі

@PauloMatuki, @Mark, Привіт, ви вирішили suspicioud activityпроблему?
Веслі

7

Редагувати: 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


що лінія Maven / Gradle не працювала для мене. завантаження 1.5.4 з вашого бітбукета також не працювало для мене. це не вдалося в тому ж рядку, що і звичайний Javamail, який не є Android, який є MimeMessage.setText (текст).
wrapperapps

@wrapperapps шкода, що це чую. "це працює для мене!". Не соромтеся відкривати випуск на репортажі про bitbucket
artbristol

7

Я знайшов більш коротку альтернативу для інших, хто потребує допомоги. Код такий:

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

Ті, хто ClassDefNotFoundErrorнамагається перемістити ці три файли jar в папку вашого проекту, це працювало для мене !!


4

Для надсилання пошти з вкладенням ..

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

Додати jar файли activation.jar, addnal.jar, javax.mail.jar
Рашид

1
Я отримую таку помилку при спробі вашого методу: 05-13 11: 51: 50.454: E / AndroidRuntime (4273): android.os.NetworkOnMainThreadException 05-13 11: 51: 50.454: E / AndroidRuntime (4273): на android. os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1156). У мене є доступ до Інтернету. Будь-яка порада?
кодартча

1
Спробуйте зателефонувати методу всередині потоку ... Це трудомісткий процес ... він не може працювати на головній нитці ...
Rashid

Я використовую саме цей код у своєму Android Project. Пошта для мене працює добре. Але частина вкладення не працює. Я намагаюся вкласти файл .txt. Але повідомлення, що я отримую, складається з невідомого типу файлу, який неможливо відкрити. Будь ласка, допоможіть.
Сямантак Басу

@Rashid звичайно я це зробив. Коли я раніше використовував Намір, мій доданий файл підходив правильно.
Сямантак Басу

4

Я не можу запустити код Vinayak B. Нарешті я вирішив це питання, виконавши наступне:

1.Використовуючи це

2.Застосування AsyncTask.

3.Зміна зміни безпеки для облікового запису відправника (змініть на "ВКЛЮЧИТИ") у цьому



3

Без втручання користувача ви можете надсилати наступне:

  1. Надіслати електронний лист від клієнта apk. Тут mail.jar, activation.jar необхідний, щоб надіслати java електронний лист. Якщо ці банки будуть додані, це може збільшити розмір APK.

  2. Крім того, ви можете скористатися веб-сервісом на стороні сервера, який використовуватиме той же mail.jar та activation.jar для надсилання електронної пошти. Ви можете зателефонувати на веб-сервіс через асинтакт і надіслати електронний лист. Перейдіть по тому ж посиланню.

(Але вам потрібно знати облікові дані поштового облікового запису)


2

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

Ви можете вибрати потрібні бібліотеки jar із веб-сторінки javanet , наприклад, mailapi.jar + imap.jar може дозволити вам отримати доступ до icloud, сервера гарячої пошти в протоколі IMAP. (за допомогою Additional.jar та activation.jar)


2

Я спробував використати код, який подав @Vinayak B. Однак я отримую помилку: "Немає провайдера для smtp

Я створив нове запитання для цього з більшою інформацією ТУТ

Я зміг це все виправити. Мені довелося використовувати інший mail.jar, і я повинен був переконатися в тому, що мій " доступ для менш захищених програм " увімкнено.

Я сподіваюся, що це допоможе всім, хто має ту саму проблему. Після цього цей фрагмент коду працює і на склі Google.


2

Весь код, наданий в інших відповідях, є правильним і працює нормально, але трохи безладно, тому я вирішив опублікувати бібліотеку (хоча ще в розробці), щоб використовувати її простіше: 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'

Будь ласка, дайте мені знати, якщо у вас є якісь проблеми з цим! :)



0
 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 = {"ekkatrainfo@gmail.com",sEmailId};
 m.setFrom("ekkatrainfo@gmail.com"); 

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


   }

0

Програмно надсилати електронну пошту з Kotlin.

  • просте надсилання електронної пошти, не всі інші функції (наприклад, вкладення).
  • TLS завжди увімкнено
  • Також потрібна лише залежність електронної пошти від 1 градуса.

Я також вважаю цей список послуг POP електронною поштою дуже корисними:

https://support.office.com/en-gb/article/pop-and-imap-email-settings-for-outlook-8361e398-8af4-4e97-b147-6c6c4ac95353

Як користуватись:

    val auth = EmailService.UserPassAuthenticator("you@gmail.com", "yourPassword")
    val to = listOf(InternetAddress("to@email.com"))
    val from = InternetAddress("you@gmail.com")
    val email = EmailService.Email(auth, to, from, "Test Subject", "Hello Body World")
    val emailService = EmailService("smtp.gmail.com", 465)

    GlobalScope.launch { // or however you do background threads
        emailService.send(email)
    }

Код:

import java.util.*
import javax.mail.*
import javax.mail.internet.InternetAddress
import javax.mail.internet.MimeBodyPart
import javax.mail.internet.MimeMessage
import javax.mail.internet.MimeMultipart

class EmailService(private val server: String, private val port: Int) {

    data class Email(
        val auth: Authenticator,
        val toList: List<InternetAddress>,
        val from: Address,
        val subject: String,
        val body: String
    )

    class UserPassAuthenticator(private val username: String, private val password: String) : Authenticator() {
        override fun getPasswordAuthentication(): PasswordAuthentication {
            return PasswordAuthentication(username, password)
        }
    }

    fun send(email: Email) {
        val props = Properties()
        props["mail.smtp.auth"] = "true"
        props["mail.user"] = email.from
        props["mail.smtp.host"] = server
        props["mail.smtp.port"] = port
        props["mail.smtp.starttls.enable"] = "true"
        props["mail.smtp.ssl.trust"] = server
        props["mail.mime.charset"] = "UTF-8"
        val msg: Message = MimeMessage(Session.getDefaultInstance(props, email.auth))
        msg.setFrom(email.from)
        msg.sentDate = Calendar.getInstance().time
        msg.setRecipients(Message.RecipientType.TO, email.toList.toTypedArray())
//      msg.setRecipients(Message.RecipientType.CC, email.ccList.toTypedArray())
//      msg.setRecipients(Message.RecipientType.BCC, email.bccList.toTypedArray())
        msg.replyTo = arrayOf(email.from)

        msg.addHeader("X-Mailer", CLIENT_NAME)
        msg.addHeader("Precedence", "bulk")
        msg.subject = email.subject

        msg.setContent(MimeMultipart().apply {
            addBodyPart(MimeBodyPart().apply {
                setText(email.body, "iso-8859-1")
                //setContent(email.htmlBody, "text/html; charset=UTF-8")
            })
        })
        Transport.send(msg)
    }

    companion object {
        const val CLIENT_NAME = "Android StackOverflow programmatic email"
    }
}

Gradle:

dependencies {
    implementation 'com.sun.mail:android-mail:1.6.4'
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3"
}

AndroidManifest:

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

-3

Щоб додати вкладення, не забудьте додати.

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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.