Gửi email trong Android bằng API JavaMail mà không cần sử dụng ứng dụng mặc định / tích hợp


653

Tôi đang cố gắng tạo một ứng dụng gửi thư trong Android.

Nếu tôi sử dụng:

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

Điều này sẽ khởi chạy ứng dụng Android tích hợp; Tôi đang cố gắng gửi thư trên nút bấm trực tiếp mà không sử dụng ứng dụng này.


3
javax.mail.AuthenticationFailedException khi gửi email mặc dù người dùng / mật khẩu là chính xác. Bất kì giải pháp nào?
TD Nguyễn

1
Lưu ý rằng kể từ ngày 1.5.5, JavaMail tuyên bố sẽ hỗ trợ Android
artbristol vào

1
Không phải SendGrid là một tùy chọn? Theo như tôi biết, bạn cũng có khả năng lấy số liệu thống kê về emai bạn gửi
Stamatis Stiliats

Câu trả lời:


757

Gửi e-mail trong Android bằng API JavaMail bằng xác thực Gmail.

Các bước để tạo một dự án mẫu:

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

THÊM 3 lọ được tìm thấy trong liên kết sau đến Dự án Android của bạn

Bấm vào đây - Cách thêm bình bên ngoài

Và đừng quên thêm dòng này vào bảng kê khai của bạn:

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

Chỉ cần nhấp vào liên kết bên dưới để thay đổi quyền truy cập tài khoản cho các ứng dụng kém an toàn hơn https://www.google.com.vn/sinstall/security/lesssecur

Chạy dự án và kiểm tra tài khoản thư người nhận của bạn cho thư. Chúc mừng!

PS Và đừng quên rằng bạn không thể thực hiện thao tác mạng từ bất kỳ Hoạt động nào trong Android. Do đó nên sử dụng AsyncTaskhoặcIntentService để tránh mạng trên ngoại lệ luồng chính.

Tệp Jar: https://code.google.com.vn/archive/p/javamail-android/


52
Mã của bạn dường như sử dụng tên người dùng và mật khẩu được mã hóa cứng. Đây có phải là một rủi ro bảo mật (có nghĩa là các apk được tải lên thị trường đã được dịch ngược) không?
Giàu

11
Làm việc cho tôi !!! đừng quên thêm vào ứng dụng của bạn bản kê khai INTERNET cho phép sử dụng
Avi Shukron

15
Có cách nào để nhận một email được gửi mà không cần đặt mật khẩu vào mã không? Tôi nghĩ người dùng sẽ giật mình nếu tôi hỏi họ về email của họ ...
pumpkee

7
Xin chào Cảm ơn mã. nhưng tôi đã nhận java.lang.NoClassDefFoundError trên GMailSender sender = new GMailSender (...) về khả năng gửi thư. tôi bao gồm tất cả các lọ và thêm vào để xây dựng đường dẫn. tôi đã dành một chút thời gian để giải quyết nó. Nhưng tôi không nhận được giải pháp. làm ơn giúp tôi.
MAMurali

53
Đối với những người phàn nàn / hỏi về cách lấy mật khẩu của người dùng - đó không phải là ý tưởng ở đây. Điều này có nghĩa là được sử dụng với tài khoản e-mail (nhà phát triển) của bạn. Nếu bạn muốn dựa vào tài khoản e-mail của người dùng, bạn nên sử dụng mục đích e-mail, được thảo luận rộng rãi trong các bài đăng khác.
Tom

70

Cảm ơn bạn đã thông tin có giá trị của bạn. Mã đang hoạt động tốt. Tôi có thể thêm tệp đính kèm bằng cách thêm mã sau đây.

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
Thêm phần này vào GmailSender.java
Rác

Khi tôi gọi setcontent, nó sẽ ghi đè lên nội dung cơ thể của tôi. tôi đang làm gì sai à tôi muốn thêm tệp đính kèm với nội dung cơ thể văn bản khác
Calvin

1
cho filenamebiến ở đây, bạn phải xác định đường dẫn tệp. Ví dụ:String path = Environment.getExternalStorageDirectory().getPath() + "/temp_share.jpg";

Mã này giúp bạn thêm nhiều tệp stackoverflow.com/a/3177640/2811343 ;) :)
AndroidManifester

54

Không thể kết nối với máy chủ SMTP: smtp.gmail.com, port: 465

Thêm dòng này trong bảng kê khai của bạn:

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

39

Bạn có thể sử dụng API JavaMail để xử lý các tác vụ email của mình. API JavaMail có sẵn trong gói JavaEE và jar của nó có sẵn để tải xuống. Đáng buồn thay, nó không thể được sử dụng trực tiếp trong một ứng dụng Android vì nó sử dụng các thành phần AWT hoàn toàn không tương thích trong Android.

Bạn có thể tìm thấy cổng Android cho JavaMail tại vị trí sau: http://code.google.com.vn/p/javamail-android/

Thêm các lọ vào ứng dụng của bạn và sử dụng phương thức SMTP


1
Bất kỳ kho lưu trữ maven cho điều đó?
dùng1050755

Xin lỗi nhưng tôi không biết điều đó
Kshitij Aggarwal

6
Tôi đã chuyển JavaMail mới nhất và nó có sẵn trên Maven Central dướieu.ocathain.com.sun.mail:javax.mail:1.5.2
artbristol

29

Để giúp những người nhận được Mạng trên Ngoại lệ chủ đề chính với Mục tiêu SDK> 9. Điều này đang sử dụng mã của droopie ở trên nhưng sẽ hoạt động tương tự cho bất kỳ.

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

StrictMode.setThreadPolicy(policy); 

android.os.NetworkOnMainThreadException

Bạn có thể sử dụng AsyncTask như dưới đây

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

Nơi để thêm lớp này
Gunaseelan

25

Mã làm việc 100% với bản demo Bạn cũng có thể gửi nhiều email bằng câu trả lời này.

Tải dự án TẠI ĐÂY

Bước 1: Tải xuống thư, kích hoạt, tệp jar bổ sung và thêm vào thư mục libs dự án của bạn trong studio android. Tôi đã thêm một ảnh chụp màn hình xem bên dưới Liên kết tải xuống

thêm vào

Đăng nhập bằng gmail ( sử dụng từ thư của bạn ) và TẮT nút chuyển đổi LINK

Hầu hết mọi người quên đi bước này tôi hy vọng bạn sẽ không làm thế.

Bước 2: Sau khi hoàn thành quá trình này. Sao chép và qua các lớp này vào dự án của bạn.

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

}

Bước 3: Bây giờ bạn có thể thay đổi lớp này theo nhu cầu của mình, bạn cũng có thể gửi nhiều thư bằng lớp này. tôi cung cấp cả tập tin xml và 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);
            }
        });
    }
}

Lưu ý Đừng quên thêm quyền internet trong tệp AndroidManifest.xml của bạn

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

Hy vọng nó hoạt động nếu nó không sau đó chỉ cần bình luận xuống dưới.


2
Điều này có an toàn không? Nếu tôi thay thế "fromEmail" và "fromPassword" bằng mật khẩu và người dùng được mã hóa cứng, tôi có phải lo lắng về các vấn đề bảo mật không?
Yonah Karp

Có thể nhận email bằng phương pháp của bạn? Tôi muốn nhận email
user3051460 29/07/2016

1
@ArpitPatel cái này hoạt động khá gọn gàng. Nhưng tôi cũng lo lắng về an ninh. Nếu bạn sử dụng gmail, google có thể chặn một số ứng dụng cố gắng làm điều này.
Totumus Maximus

@TotumusMaximus Nếu bạn lo lắng về bảo mật hơn bạn có thể sử dụng email và mật khẩu của mình bằng api
Arpit Patel

23

SMTP

Sử dụng SMTP là một cách để đi và những người khác đã chỉ ra các cách để làm điều đó. Chỉ cần lưu ý rằng trong khi thực hiện việc này, bạn hoàn toàn phá vỡ ứng dụng thư được tích hợp và bạn sẽ phải cung cấp địa chỉ của máy chủ SMTP, tên người dùng và mật khẩu cho máy chủ đó, hoặc tĩnh trong mã của bạn hoặc truy vấn nó từ người dùng .

HTTP

Một cách khác sẽ liên quan đến một tập lệnh phía máy chủ đơn giản, như php, lấy một số tham số URL và sử dụng chúng để gửi thư. Theo cách này, bạn chỉ cần thực hiện một yêu cầu HTTP từ thiết bị (có thể dễ dàng với các thư viện tích hợp) và không cần lưu trữ dữ liệu đăng nhập SMTP trên thiết bị. Đây là một sự gián tiếp hơn so với việc sử dụng SMTP trực tiếp, nhưng vì việc thực hiện yêu cầu HTTP và gửi thư từ PHP rất dễ dàng, nên nó thậm chí có thể đơn giản hơn so với cách trực tiếp.

Ứng dụng thư

Nếu thư sẽ được gửi từ tài khoản thư mặc định của người dùng mà anh ta đã đăng ký với điện thoại, bạn phải thực hiện một số cách tiếp cận khác. Nếu bạn có đủ thời gian và kinh nghiệm, bạn có thể muốn kiểm tra mã nguồn của ứng dụng Email Android để xem liệu nó có cung cấp một số điểm nhập để gửi thư mà không có sự tương tác của người dùng không (tôi không biết, nhưng có thể có một).

Có thể bạn thậm chí tìm cách truy vấn chi tiết tài khoản người dùng (vì vậy bạn có thể sử dụng chúng cho SMTP), mặc dù tôi rất nghi ngờ rằng điều này là có thể, bởi vì nó sẽ là một rủi ro bảo mật rất lớn và Android được xây dựng khá an toàn.


22

đây là phiên bản alt cũng hoạt động với tôi và có tệp đính kèm (đã được đăng ở trên nhưng phiên bản hoàn chỉnh không giống như liên kết nguồn, mọi người đã đăng họ không thể làm cho nó hoạt động được vì dữ liệu bị thiếu)

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

và gọi nó trong một hoạt động ...

@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 Thêm quyền internet vào bảng kê khai của bạn
noob

Làm thế nào để sử dụng mã này nếu tôi muốn sử dụng bất kỳ ứng dụng email nào khác, chẳng hạn như org của tôi? Chỉ cần thay đổi tên máy chủ và cổng là đủ?
roger_that

javax.mail.AuthenticationFailedException giải pháp nào cho Android 4.4.4?
TD Nguyễn

2
đối với javax.mail.AuthenticationFailedException, bạn cần bật cài đặt này google.com/sinstall/security/lesssecur
Ứng dụng lại

1
Để giải quyết Could not send email android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork, cần phải xem giải pháp này stackoverflow.com/questions/25093546/
Kẻ

14

GmailBackground là thư viện nhỏ để gửi email ở chế độ nền mà không cần tương tác của người dùng:

Sử dụng:

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

Cấu hình:

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

Quyền:

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

Ngoài ra đối với các tệp đính kèm, bạn cần đặt quyền READ_EXTERNAL_STORAGE:

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

Nguồn

(Tôi đã tự mình kiểm tra)


Tôi sử dụng nó và hoạt động hoàn hảo. Nhưng tôi đã thực hiện một số sửa đổi để sử dụng nó với nhà cung cấp email khác nhau và khi gửi email đến Gmail, nó trả lại cho tôi tiêu đề "Từ" bị thiếu ... Làm thế nào để giải quyết nó?
Erich García

Xin chào, tôi đang sử dụng api này trong ứng dụng của mình nhưng nó không hoạt động và luôn gọi onfailcallback
Jawad Malik

13

Lời cảnh báo nếu sử dụng "smtp.gmail.com" làm máy chủ smtp mặc định.

Google sẽ buộc bạn thay đổi mật khẩu tài khoản email được liên kết thường xuyên do chính sách "hoạt động đáng ngờ" quá nhiệt tình của họ. Về bản chất, nó coi các yêu cầu smtp lặp đi lặp lại từ các quốc gia khác nhau trong một khung thời gian ngắn là "hoạt động đáng ngờ". Vì họ cho rằng bạn (chủ tài khoản email) chỉ có thể ở một quốc gia tại một thời điểm.

Khi hệ thống google phát hiện "hoạt động đáng ngờ", nó sẽ ngăn các email khác cho đến khi bạn thay đổi mật khẩu. Vì bạn sẽ khó mã hóa mật khẩu vào ứng dụng, bạn phải phát hành lại ứng dụng mỗi khi điều này xảy ra, không lý tưởng. Điều này đã xảy ra 3 lần trong một tuần với tôi, tôi thậm chí còn lưu trữ mật khẩu trên một máy chủ khác và tự động lấy mật khẩu mỗi lần google buộc tôi phải thay đổi nó.

Vì vậy, tôi khuyên bạn nên sử dụng một trong nhiều nhà cung cấp smtp miễn phí thay vì "smtp.gmail.com" để tránh vấn đề bảo mật này. Sử dụng cùng một mã nhưng thay đổi "smtp.gmail.com" thành máy chủ chuyển tiếp smtp mới của bạn.


2
Đó là một điểm tốt. Nhưng bạn có thể vui lòng cho một ví dụ về nhà cung cấp email thay thế làm việc với mã (chỉ thay thế smtp và chi tiết đăng nhập). Tôi đã thử nó với hushmail và email.com nhưng không thành công. Sẽ tiếp tục cố gắng với người khác.
Paulo Matuki

@PauloMatuki, @Mark, Xin chào, các bạn đã giải quyết suspicioud activityvấn đề chưa?
Wesley

7

Chỉnh sửa: JavaMail 1.5.5 tuyên bố hỗ trợ Android , vì vậy bạn không cần bất cứ điều gì khác.

Tôi đã chuyển JavaMail mới nhất (1.5.4) sang Android. Nó có sẵn trong Maven Central, chỉ cần thêm phần sau vào build.gradle~ ~

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

Sau đó bạn có thể làm theo hướng dẫn chính thức .

Mã nguồn có sẵn ở đây: https://bitbucket.org/artbristol/javamail-forked-android


dòng maven / gradle không làm việc cho tôi. Tải xuống 1.5.4 từ bitbucket của bạn cũng không hoạt động với tôi. nó đã thất bại ở cùng dòng với javamail không phải Android thông thường, đó là MimeMessage.setText (văn bản).
Wrapperapps

@wrapperapps rất tiếc khi nghe điều đó. "nó làm việc cho tôi!". Vui lòng mở một vấn đề trên repo bitbucket
artbristol

7

Tôi tìm thấy một sự thay thế ngắn hơn cho những người khác cần giúp đỡ. Mã này là:

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

Nguồn: Gửi email qua API JavaMail

Hi vọng điêu nay co ich! Chúc may mắn!


5

Những người đang ClassDefNotFoundErrorcố gắng di chuyển Ba tệp jar đó vào thư mục lib của Dự án của bạn, nó hoạt động với tôi !!


4

Để gửi thư có tệp đính kèm ..

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

Thêm các tệp jar activ.jar, thêmnal.jar, javax.mail.jar
Rashid

1
Tôi gặp phải lỗi sau khi thử phương pháp của bạn: 05-13 11: 51: 50.454: E / AndroidR.78 (4273): android.os.NetworkOnMainThreadException 05-13 11: 51: 50.454: E / AndroidR.78 (4273): tại android. os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1156). Tôi có quyền internet. Có lời khuyên nào không?
kodartcha

1
Hãy thử gọi phương thức bên trong một luồng ... Đó là một quá trình tốn thời gian ... nó không thể chạy trên luồng chính ...
Rashid

Đang sử dụng chính xác mã này trong Dự án Android của tôi. Thư hoạt động tốt với tôi. Nhưng phần đính kèm không hoạt động. Đang cố gắng đính kèm tệp .txt. Nhưng thư đang nhận bao gồm một loại tệp không xác định không thể mở. Xin vui lòng giúp đỡ.
Syamantak Basu

@Rashid ofcference Tôi đã làm điều đó. Khi tôi đang sử dụng Ý định trước đó, tệp đính kèm của tôi đã xuất hiện đúng.
Syamantak Basu

4

Tôi không thể chạy mã của Vinayak B. Cuối cùng tôi đã giải quyết vấn đề này bằng cách làm theo:

1. Sử dụng này

2. Áp dụng AsyncTask.

3. Thay đổi vấn đề bảo mật của tài khoản gmail của người gửi. (Thay đổi thành "BẬT") trong này



3

Nếu không có sự can thiệp của người dùng, bạn có thể gửi như sau:

  1. Gửi email từ apk khách hàng. Ở đây mail.jar, activ.jar được yêu cầu gửi email java. Nếu những lọ này được thêm vào, nó có thể tăng Kích thước APK.

  2. Ngoài ra, Bạn có thể sử dụng dịch vụ web tại mã phía máy chủ, dịch vụ này sẽ sử dụng cùng một mail.jar và activ.jar để gửi email. Bạn có thể gọi dịch vụ web qua asynctask và gửi email. Tham khảo cùng một liên kết.

(Nhưng, bạn sẽ cần biết thông tin đăng nhập của tài khoản thư)


2

Trong trường hợp bạn được yêu cầu giữ thư viện jar càng nhỏ càng tốt, bạn có thể bao gồm riêng chức năng SMTP / POP3 / IMAP để tránh vấn đề "quá nhiều phương pháp trong dex".

Bạn có thể chọn các thư viện jar mong muốn từ trang web javanet , ví dụ, mailapi.jar + imap.jar có thể cho phép bạn truy cập icloud, máy chủ thư hotmail trong giao thức IMAP. (với sự trợ giúp của thêm.jar và activ.jar)


2

Tôi đã thử sử dụng mã mà @Vinayak B đã gửi. Tuy nhiên tôi đang gặp lỗi khi nói: Không có nhà cung cấp nào cho smtp

Tôi đã tạo một câu hỏi mới cho điều này với nhiều thông tin hơn TẠI ĐÂY

Tôi đã có thể tự sửa nó sau tất cả. Tôi đã phải sử dụng một mail.jar khác và tôi phải đảm bảo rằng " quyền truy cập cho các ứng dụng kém an toàn " của tôi đã được bật.

Tôi hy vọng điều này sẽ giúp bất cứ ai có cùng một vấn đề. Với điều này được thực hiện, đoạn mã này cũng hoạt động trên kính google.


2

Tất cả các mã được cung cấp trong các câu trả lời khác là chính xác và đang hoạt động tốt, nhưng hơi lộn xộn, vì vậy tôi đã quyết định xuất bản một thư viện (vẫn đang trong quá trình phát triển) để sử dụng nó theo cách dễ dàng hơn: AndroidMail .

Bạn chỉ cần tạo MailSender, tạo thư và gửi nó (đã được xử lý ở chế độ nền với 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);

Bạn có thể nhận được thông báo cho email đã gửi và nó cũng có hỗ trợ cho các loại Người nhận khác nhau (TO, CC và BCC), tệp đính kèm và 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 :(
    }
});

Bạn có thể lấy nó qua Gradle hoặc Maven:

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

Xin vui lòng cho tôi biết nếu bạn có bất kỳ vấn đề với nó! :)



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

Gửi email theo chương trình với Kotlin.

  • gửi email đơn giản, không phải tất cả các tính năng khác (như tệp đính kèm).
  • TLS luôn bật
  • Chỉ cần 1 lớp phụ thuộc email cũng cần thiết.

Tôi cũng thấy danh sách các dịch vụ POP email này thực sự hữu ích:

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

Cách sử dụng:

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

Mật mã:

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

Học sinh lớp

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

AndroidQuản lý:

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

-3

Để thêm tệp đính kèm, đừng quên thêm.

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.