Mengirim Email di Android menggunakan JavaMail API tanpa menggunakan aplikasi bawaan / bawaan

653

Saya mencoba membuat aplikasi pengiriman surat di Android.

Jika saya menggunakan:

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

Ini akan meluncurkan aplikasi Android bawaan; Saya mencoba mengirim surat pada klik tombol langsung tanpa menggunakan aplikasi ini.

Vinayak Bevinakatti
sumber
3
javax.mail.AuthenticationFailedException saat mengirim email meskipun pengguna / kata sandi sudah benar. Ada solusi?
TD Nguyen
1
Perhatikan bahwa pada 1.5.5, JavaMail mengklaim mendukung Android
artbristol
1
Bukankah SendGrid merupakan opsi? Sejauh yang saya tahu Anda juga memiliki kemungkinan untuk mendapatkan statistik tentang emai yang Anda kirim
Stamatis Stiliats

Jawaban:

756

Kirim email di Android menggunakan JavaMail API menggunakan otentikasi Gmail.

Langkah-langkah untuk membuat Proyek sampel:

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

TAMBAH 3 botol yang ditemukan di tautan berikut ke Proyek Android Anda

Klik di sini - Cara menambahkan Stoples Eksternal

Dan jangan lupa untuk menambahkan baris ini dalam manifes Anda:

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

Cukup klik tautan di bawah ini untuk mengubah akses akun untuk aplikasi yang kurang aman https://www.google.com/settings/security/lesssecureapps

Jalankan proyek dan periksa akun email penerima Anda untuk surat tersebut. Bersulang!

PS Dan jangan lupa bahwa Anda tidak dapat melakukan operasi jaringan dari Aktivitas apa pun di android. Oleh karena itu disarankan untuk menggunakan AsyncTaskatau IntentServicemenghindari jaringan pada pengecualian utas utama.

File jar: https://code.google.com/archive/p/javamail-android/

Vinayak Bevinakatti
sumber
52
Kode Anda tampaknya menggunakan nama pengguna dan kata sandi yang dikodekan. Apakah ini risiko keamanan saat ini (artinya, apakah apk yang diunggah ke pasar telah diurai)?
Kaya
11
Bekerja untukku !!! jangan lupa untuk menambahkan ke manifes aplikasi Anda izin-izin INTERNET
Avi Shukron
15
apakah ada cara untuk mendapatkan email yang dikirim tanpa memasukkan kata sandi ke dalam kode? Saya pikir pengguna akan terkejut jika saya akan meminta mereka untuk email mereka ...
pumpkee
7
Hai, Terima kasih untuk kodenya. tetapi saya mendapat java.lang.NoClassDefFoundError pada GMailSender sender = GMailSender baru (...) pada mailsenderactivity. saya memasukkan semua stoples dan ditambahkan untuk membangun jalur. Saya menghabiskan beberapa waktu untuk menyelesaikannya. Tapi saya tidak mendapatkan solusi. tolong bantu aku.
MAMurali
53
Bagi mereka yang mengeluh / bertanya tentang cara mendapatkan kata sandi pengguna - itu bukan ide di sini. Ini dimaksudkan untuk digunakan dengan akun email Anda (pengembang). Jika Anda ingin mengandalkan akun email pengguna Anda harus menggunakan maksud email, yang banyak dibahas dalam posting lain.
Tom
70

Terima kasih atas informasi Anda yang berharga. Kode berfungsi dengan baik. Saya dapat menambahkan lampiran juga dengan menambahkan kode berikut.

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);
ashok reddy
sumber
6
Tambahkan ini ke GmailSender.java
Garbage
ketika saya menelepon setcontent itu menimpa konten tubuh saya. apakah saya melakukan sesuatu yang salah. saya ingin menambahkan lampiran dengan konten tubuh tekstual lainnya
Calvin
1
untuk filenamevariabel di sini, Anda harus menentukan path file. Sebagai contoh:String path = Environment.getExternalStorageDirectory().getPath() + "/temp_share.jpg";
Kode ini membantu Anda untuk menambahkan banyak file stackoverflow.com/a/3177640/2811343 ;) :)
AndroidManifester
54

Tidak dapat terhubung ke host SMTP: smtp.gmail.com, port: 465

Tambahkan baris ini di manifes Anda:

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

Anda dapat menggunakan JavaMail API untuk menangani tugas email Anda. JavaMail API tersedia dalam paket JavaEE dan toplesnya tersedia untuk diunduh. Sayangnya itu tidak dapat digunakan secara langsung dalam aplikasi Android karena menggunakan komponen AWT yang sepenuhnya tidak kompatibel di Android.

Anda dapat menemukan port Android untuk JavaMail di lokasi berikut: http://code.google.com/p/javamail-android/

Tambahkan toples ke aplikasi Anda dan gunakan metode SMTP

Kshitij Aggarwal
sumber
1
Adakah repositori pakar untuk itu?
user1050755
Maaf tapi saya tidak menyadarinya
Kshitij Aggarwal
6
Saya telah porting JavaMail terbaru dan tersedia di Maven Central di bawaheu.ocathain.com.sun.mail:javax.mail:1.5.2
artbristol
29

Untuk membantu mereka yang mendapatkan Pengecualian Utas Pada Jaringan dengan Target SDK> 9. Ini menggunakan kode droopie di atas tetapi akan bekerja sama untuk semua.

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

StrictMode.setThreadPolicy(policy); 

android.os.NetworkOnMainThreadException

Anda dapat menggunakan AsyncTask seperti di bawah ini

public void onClickMail(View view) {
    new SendEmailAsyncTask().execute();
}

class SendEmailAsyncTask extends AsyncTask <Void, Void, Boolean> {
    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;
        }
    }
Ryan Heitner
sumber
Di mana menambahkan kelas ini
Gunaseelan
25

100% kode kerja dengan demo Anda juga dapat mengirim beberapa email menggunakan jawaban ini.

Unduh Proyek DI SINI

Langkah 1: Unduh email, aktivasi, file jar tambahan dan tambahkan folder libs proyek Anda di android studio. Saya menambahkan cuplikan layar lihat di bawah Tautan unduhan

libs tambahkan

Login dengan gmail ( menggunakan email Anda ) dan MENGHIDUPKAN tombol sakelar LINK

Sebagian besar orang lupa tentang langkah ini saya harap Anda tidak akan melakukannya.

Langkah 2: Setelah menyelesaikan proses ini. Salin dan lewati kelas ini ke proyek Anda.

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

}

Langkah 3: Sekarang Anda dapat mengubah kelas ini sesuai dengan kebutuhan Anda juga Anda dapat mengirim banyak surat menggunakan kelas ini. saya memberikan file xml dan java keduanya.

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

Catatan Jangan lupa menambahkan izin internet di file AndroidManifest.xml Anda

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

Semoga berhasil jika tidak maka cukup komentar di bawah.

Arpit Patel
sumber
2
Apakah ini aman? Jika saya mengganti "fromEmail" dan "fromPassword" dengan kata sandi pengguna dan kata sandi, apakah saya harus khawatir dengan masalah keamanan?
Yonah Karp
Apakah mungkin menerima email menggunakan metode Anda? Saya ingin menerima email
user3051460
1
@ArpitPatel ini berfungsi cukup rapi. Tetapi saya juga khawatir tentang keamanan. Jika Anda menggunakan gmail, google mungkin memblokir aplikasi tertentu yang mencoba melakukan hal ini.
Totumus Maximus
@TotumusMaximus Jika Anda khawatir tentang keamanan daripada Anda dapat menggunakan email dan kata sandi menggunakan api
Arpit Patel
23

SMTP

Menggunakan SMTP adalah salah satu cara untuk melangkah, dan yang lain telah menunjukkan cara bagaimana melakukannya. Perhatikan bahwa saat melakukan ini, Anda benar-benar menghindari aplikasi surat bawaan, dan Anda harus memberikan alamat server SMTP, nama pengguna dan kata sandi untuk server itu, baik secara statis dalam kode Anda, atau permintaan dari pengguna .

HTTP

Cara lain akan melibatkan skrip sisi server sederhana, seperti php, yang mengambil beberapa parameter URL dan menggunakannya untuk mengirim email. Dengan cara ini, Anda hanya perlu membuat permintaan HTTP dari perangkat (mudah dilakukan dengan perpustakaan bawaan) dan tidak perlu menyimpan data login SMTP pada perangkat. Ini adalah satu lagi tipuan dibandingkan dengan penggunaan SMTP langsung, tetapi karena sangat mudah untuk membuat permintaan HTTP dan mengirim email dari PHP, itu mungkin bahkan lebih sederhana daripada cara langsung.

Aplikasi Surat

Jika surat akan dikirim dari akun email default pengguna yang sudah terdaftar di telepon, Anda harus melakukan pendekatan lain. Jika Anda memiliki cukup waktu dan pengalaman, Anda mungkin ingin memeriksa kode sumber aplikasi Email Android untuk melihat apakah ia menawarkan beberapa titik masuk untuk mengirim email tanpa interaksi pengguna (saya tidak tahu, tetapi mungkin ada satu).

Mungkin Anda bahkan menemukan cara untuk menanyakan detail akun pengguna (sehingga Anda dapat menggunakannya untuk SMTP), meskipun saya sangat ragu bahwa ini mungkin, karena itu akan menjadi risiko keamanan yang sangat besar dan Android dibangun agak aman.

Lena Schimmel
sumber
22

di sini adalah versi alt yang juga berfungsi untuk saya dan memiliki lampiran (diposting sudah di atas tetapi versi lengkap tidak seperti tautan sumber, yang orang-orang diposting mereka tidak bisa berfungsi karena data yang hilang)

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 ….. 
}

dan menyebutnya dalam suatu kegiatan ...

@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); 
      } 
    } 
  }); 
} 
droopie
sumber
@KeyLimePiePhotonAndroid Tambahkan izin internet ke manifes Anda
noob
bagaimana cara menggunakan kode ini jika saya ingin menggunakan klien email lain seperti dari org saya? Apakah mengubah hanya nama host dan port sudah cukup?
roger_that
javax.mail.AuthenticationFailedException solusi apa pun untuk android 4.4.4?
TD Nguyen
2
untuk javax.mail.AuthenticationFailedException, Anda harus mengaktifkan pengaturan ini google.com/settings/security/lesssecureapps
Razel Soco
1
Untuk mengatasinya Could not send email android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetworkperlu untuk melihat solusi ini stackoverflow.com/questions/25093546/…
jgrocha
14

GmailBackground adalah pustaka kecil untuk mengirim email di latar belakang tanpa interaksi pengguna:

Pemakaian:

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

Konfigurasi:

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

Izin:

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

Juga untuk lampiran, Anda harus menetapkan izin READ_EXTERNAL_STORAGE:

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

Sumber

(Saya sudah mengujinya sendiri)

SR
sumber
Saya menggunakannya dan bekerja dengan sempurna. Tapi saya membuat beberapa modifikasi untuk menggunakannya dengan penyedia email yang berbeda dan ketika mengirim email ke Gmail itu mengembalikan saya "Dari" header hilang ... Bagaimana mengatasinya?
Erich García
Halo, saya menggunakan api ini di aplikasi saya tetapi tidak berfungsi dan selalu memanggil onfailcallback
Jawad Malik
13

Kata peringatan jika menggunakan "smtp.gmail.com" sebagai server smtp default.

Google akan memaksa Anda untuk mengubah kata sandi akun email tertaut Anda sering karena kebijakan "aktivitas mencurigakan" yang terlalu bersemangat. Pada dasarnya ia memperlakukan permintaan smtp berulang dari berbagai negara dalam jangka waktu pendek sebagai "aktivitas mencurigakan". Karena mereka menganggap Anda (pemegang akun email) hanya dapat berada di satu negara pada suatu waktu.

Ketika sistem google mendeteksi "aktivitas mencurigakan" itu akan mencegah email lebih lanjut sampai Anda mengubah kata sandi. Karena Anda akan memiliki kode sandi yang sulit untuk dimasukkan ke dalam aplikasi, Anda harus merilis ulang aplikasi setiap kali ini terjadi, bukan yang ideal. Ini terjadi 3 kali dalam seminggu kepada saya, saya bahkan menyimpan kata sandi di server lain dan secara dinamis mengambil kata sandi setiap kali google memaksa saya untuk mengubahnya.

Jadi saya sarankan menggunakan salah satu dari banyak penyedia smtp gratis alih-alih "smtp.gmail.com" untuk menghindari masalah keamanan ini. Gunakan kode yang sama tetapi ubah "smtp.gmail.com" menjadi host penerusan smtp baru Anda.

Menandai
sumber
2
Itu poin yang bagus. Tapi bisakah Anda memberikan contoh penyedia email alternatif yang bekerja dengan kode (hanya mengganti rincian smtp dan login). Saya sudah mencobanya dengan hushmail dan email.com tetapi tidak berhasil. Akan terus berusaha dengan orang lain.
Paulo Matuki
@PauloMatuki, @Mark, Hai, sudahkah kalian menyelesaikan suspicioud activitymasalahnya?
Wesley
7

Sunting: JavaMail 1.5.5 mengklaim untuk mendukung Android , jadi Anda tidak perlu yang lain.

Saya telah mengirim JavaMail (1.5.4) terbaru ke Android. Ini tersedia di Maven Central, cukup tambahkan yang berikut ke build.gradle~~

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

Anda kemudian dapat mengikuti tutorial resmi .

Kode sumber tersedia di sini: https://bitbucket.org/artbristol/javamail-forked-android

artbristol
sumber
garis maven / gradle tidak bekerja untuk saya. unduhan 1.5.4 dari bitbucket Anda juga tidak berfungsi untuk saya. gagal pada baris yang sama dengan javamail non-Android biasa, yaitu MimeMessage.setText (teks).
wrapperapps
@wrapperapps menyesal mendengarnya. "Ini bekerja untukku!". Jangan ragu untuk membuka masalah pada repo
bitbucket
7

Saya menemukan alternatif yang lebih pendek untuk orang lain yang membutuhkan bantuan. Kode tersebut adalah:

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 = "[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);
        }
    }
}

Sumber: Mengirim Email melalui JavaMail API

Semoga ini membantu! Semoga berhasil!

Shreshth Kharbanda
sumber
5

Mereka yang ClassDefNotFoundErrormencoba memindahkan tiga file jar ke folder Lib Proyek Anda, itu berhasil bagi saya !!

Omkar Gokhale
sumber
4

Untuk mengirim surat dengan lampiran ..

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();}
                  }
                }
Rashid
sumber
Tambahkan jar jar aktivasi.jar, Selain itu.jar, javax.mail.jar
Rashid
1
Saya mendapatkan kesalahan berikut ketika mencoba metode Anda: 05-13 11: 51: 50.454: E / AndroidRuntime (4273): android.os.NetworkOnMainThreadException 05-13 11: 51: 50.454: E / AndroidRuntime (4273): di android. os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1156). Saya punya izin internet. Ada saran?
kodartcha
1
Coba panggil metode di dalam utas ... Ini proses yang memakan waktu ... itu tidak dapat berjalan pada utas utama ...
Rashid
Saya menggunakan persis kode ini di Android Project. Email saya berfungsi dengan baik untuk saya. Tetapi bagian lampiran tidak berfungsi. Saya mencoba melampirkan file .txt. Tetapi email yang saya terima terdiri dari jenis file yang tidak dikenal yang tidak dapat saya buka. Tolong bantu.
Syamantak Basu
@Rashid ofcourse saya melakukan itu. Ketika saya menggunakan Intent sebelumnya, file terlampir saya datang tepat.
Syamantak Basu
4

Saya tidak dapat menjalankan kode Vinayak B. Akhirnya saya memecahkan masalah ini dengan mengikuti:

1. Menggunakan ini

2. Menerapkan AsyncTask.

3.Mengubah masalah keamanan akun gmail pengirim. (Ubah ke "TURN ON") dalam hal ini

Patriotik
sumber
3

Tanpa campur tangan pengguna, Anda dapat mengirim sebagai berikut:

  1. Kirim email dari apk klien. Di sini mail.jar, aktivasi.jar diperlukan untuk mengirim email java. Jika botol ini ditambahkan, ini mungkin meningkatkan Ukuran APK.

  2. Atau, Anda dapat menggunakan layanan web di kode sisi server, yang akan menggunakan mail.jar yang sama dan aktivasi.jar untuk mengirim email. Anda dapat menghubungi layanan web melalui asynctask dan mengirim email. Lihat tautan yang sama.

(Tapi, Anda harus mengetahui kredensial akun email)

Nishanthi Grashia
sumber
2

Jika Anda diminta untuk menyimpan pustaka jar sekecil mungkin, Anda bisa menyertakan fungsi SMTP / POP3 / IMAP secara terpisah untuk menghindari masalah "terlalu banyak metode dalam dex".

Anda dapat memilih pustaka jar yang diinginkan dari halaman web javanet , misalnya, mailapi.jar + imap.jar dapat memungkinkan Anda untuk mengakses server mail icloud, hotmail dalam protokol IMAP. (dengan bantuan tambahan. jar dan aktivasi. jar)

Angin barat
sumber
2

Saya mencoba menggunakan kode yang @Vinayak B kirimkan. Namun saya mendapatkan pesan kesalahan: Tidak ada penyedia untuk smtp

Saya membuat pertanyaan baru untuk ini dengan informasi lebih lanjut DI SINI

Lagipula aku bisa memperbaikinya sendiri. Saya harus menggunakan mail.jar lain dan saya harus memastikan " akses saya untuk aplikasi yang kurang aman " dihidupkan.

Saya harap ini membantu siapa saja yang memiliki masalah yang sama. Setelah ini selesai, kode ini juga berfungsi di google glass.

NoSixties
sumber
2

Semua kode yang disediakan di jawaban lain sudah benar dan berfungsi dengan baik, tapi agak berantakan, jadi saya memutuskan untuk menerbitkan perpustakaan (masih dalam pengembangan) untuk menggunakannya dengan cara yang lebih mudah: AndroidMail .

Anda baru saja membuat MailSender, membuat surat dan mengirimkannya (sudah ditangani di latar belakang dengan 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);

Anda dapat menerima pemberitahuan untuk email yang dikirim dan juga memiliki dukungan untuk berbagai jenis Penerima (TO, CC dan BCC), lampiran, dan 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 :(
    }
});

Anda bisa mendapatkannya melalui Gradle atau Maven:

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

Tolong beri tahu saya jika Anda memiliki masalah dengan itu! :)

Enrichman
sumber
1

Berikut ini banyak solusi. Namun saya pikir kita harus mengubah konfigurasi GMail untuk memungkinkan akses dari perangkat yang kurang aman. Buka tautan di bawah dan aktifkan. Ini bekerja untuk saya

https://myaccount.google.com/lesssecureapps?pli=1

Nguyen Minh Hien
sumber
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 = {"[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;
  }  


   }
dhiraj kakran
sumber
0

Mengirim email secara terprogram dengan Kotlin.

  • pengiriman email sederhana, tidak semua fitur lainnya (seperti lampiran).
  • TLS selalu aktif
  • Hanya 1 ketergantungan email gradle diperlukan juga.

Saya juga menemukan daftar layanan POP email ini sangat membantu:

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

Cara Penggunaan:

    val auth = EmailService.UserPassAuthenticator("[email protected]", "yourPassword")
    val to = listOf(InternetAddress("[email protected]"))
    val from = InternetAddress("[email protected]")
    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)
    }

Kode:

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" />
Blundell
sumber
-3

Untuk menambahkan lampiran, jangan lupa untuk menambahkan.

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);
della pramukti raharjo
sumber