1. 程式人生 > >Android快速實現傳送郵件

Android快速實現傳送郵件

前言

現在一般很少有用Android原生app傳送郵件的需求,但是前段時間公司專案需要在Android app 內部發送郵件,於是就在網上收集資料並整理了一個Demo。雖然最後這個需求被減掉了,但是我這裡還是把Demo的內容給大家分享一下。

第一步、匯入第三方jar包

Android實現傳送郵件,首先需要依賴additional.jar、mail.jar和activation.jar這3個jar包。Google提供了下載地址:https://code.google.com/archive/p/javamail-android/downloads 。下載後新增到依賴(這裡我就不詳細說明了)。

第二步、建立相關類

1、建立MailInfo類,來代表一個即將被髮送的郵件

package com.shidian.mail;

import java.util.Properties;

public class MailInfo {

    private String mailServerHost;// 傳送郵件的伺服器的IP
    private String mailServerPort;// 傳送郵件的伺服器的埠
    private String fromAddress;// 郵件傳送者的地址
    private String toAddress;   // 郵件接收者的地址
    private String userName;// 登陸郵件傳送伺服器的使用者名稱
    private String password;// 登陸郵件傳送伺服器的密碼
    private boolean validate = true;// 是否需要身份驗證
    private String subject;// 郵件主題
    private String content;// 郵件的文字內容
    private String[] attachFileNames;// 郵件附件的檔名

    /**
     * 獲得郵件會話屬性
     */
    public Properties getProperties() {
        Properties p = new Properties();
        p.put("mail.smtp.host", this.mailServerHost);
        p.put("mail.smtp.port", this.mailServerPort);
        p.put("mail.smtp.auth", validate ? "true" : "false");
        return p;
    }

    public String getMailServerHost() {
        return mailServerHost;
    }

    public void setMailServerHost(String mailServerHost) {
        this.mailServerHost = mailServerHost;
    }

    public String getMailServerPort() {
        return mailServerPort;
    }

    public void setMailServerPort(String mailServerPort) {
        this.mailServerPort = mailServerPort;
    }

    public boolean isValidate() {
        return validate;
    }

    public void setValidate(boolean validate) {
        this.validate = validate;
    }

    public String[] getAttachFileNames() {
        return attachFileNames;
    }

    public void setAttachFileNames(String[] fileNames) {
        this.attachFileNames = fileNames;
    }

    public String getFromAddress() {
        return fromAddress;
    }

    public void setFromAddress(String fromAddress) {
        this.fromAddress = fromAddress;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getToAddress() {
        return toAddress;
    }

    public void setToAddress(String toAddress) {
        this.toAddress = toAddress;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String textContent) {
        this.content = textContent;
    }
}

2、建立認證類MyAuthenticator

package com.shidian.mail;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
public class MyAuthenticator extends Authenticator {
    String userName = null;
    String password = null;
    public MyAuthenticator() {
    }
    public MyAuthenticator(String username, String password) {
        this.userName = username;
        this.password = password;
    }
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, password);
    }
}

3、建立郵件傳送類MailSender

package com.shidian.mail;

import android.util.Log;

import java.io.File;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
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;
import javax.mail.internet.MimeUtility;

/**
 * 傳送器
 */
public class MailSender {
    /**
     * 以文字格式傳送郵件
     * @param mailInfo 待發送的郵件的資訊
     */
    public boolean sendTextMail(final MailInfo mailInfo) {

        // 判斷是否需要身份認證
        MyAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
        if (mailInfo.isValidate()) {
            // 如果需要身份認證,則建立一個密碼驗證器
            authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
        }
        // 根據郵件會話屬性和密碼驗證器構造一個傳送郵件的session
        Session sendMailSession = Session.getDefaultInstance(pro, authenticator);

//      Session sendMailSession = Session.getInstance(pro, new Authenticator() {
//          @Override
//          protected PasswordAuthentication getPasswordAuthentication() {
//              return new PasswordAuthentication(mailInfo.getUserName(),mailInfo.getPassword());
//          }
//      });

        try {
            // 根據session建立一個郵件訊息
            Message mailMessage = new MimeMessage(sendMailSession);
            // 建立郵件傳送者地址
            Address from = new InternetAddress(mailInfo.getFromAddress());
            // 設定郵件訊息的傳送者
            mailMessage.setFrom(from);
            // 建立郵件的接收者地址,並設定到郵件訊息中
            Address to = new InternetAddress(mailInfo.getToAddress());
            mailMessage.setRecipient(Message.RecipientType.TO, to);
            // 設定郵件訊息的主題
            mailMessage.setSubject(mailInfo.getSubject());
            // 設定郵件訊息傳送的時間
            mailMessage.setSentDate(new Date());

            // 設定郵件訊息的主要內容
            String mailContent = mailInfo.getContent();
            mailMessage.setText(mailContent);
            // 傳送郵件
            Transport.send(mailMessage);
            return true;
        } catch (MessagingException ex) {
            ex.printStackTrace();
        }
        return false;
    }

    /**
     * 以HTML格式傳送郵件
     * @param mailInfo 待發送的郵件資訊
     */
    public static boolean sendHtmlMail(MailInfo mailInfo) {
        // 判斷是否需要身份認證
        MyAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
        // 如果需要身份認證,則建立一個密碼驗證器
        if (mailInfo.isValidate()) {
            authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
        }
        // 根據郵件會話屬性和密碼驗證器構造一個傳送郵件的session
        Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
        try {
            // 根據session建立一個郵件訊息
            Message mailMessage = new MimeMessage(sendMailSession);
            // 建立郵件傳送者地址
            Address from = new InternetAddress(mailInfo.getFromAddress());
            // 設定郵件訊息的傳送者
            mailMessage.setFrom(from);
            // 建立郵件的接收者地址,並設定到郵件訊息中
            Address to = new InternetAddress(mailInfo.getToAddress());
            // Message.RecipientType.TO屬性表示接收者的型別為TO
            mailMessage.setRecipient(Message.RecipientType.TO, to);
            // 設定郵件訊息的主題
            mailMessage.setSubject(mailInfo.getSubject());
            // 設定郵件訊息傳送的時間
            mailMessage.setSentDate(new Date());
            // MiniMultipart類是一個容器類,包含MimeBodyPart型別的物件
            Multipart mainPart = new MimeMultipart();
            // 建立一個包含HTML內容的MimeBodyPart
            BodyPart html = new MimeBodyPart();
            // 設定HTML內容
            html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
            mainPart.addBodyPart(html);
            // 將MiniMultipart物件設定為郵件內容
            mailMessage.setContent(mainPart);
            // 傳送郵件
            Transport.send(mailMessage);
            return true;
        } catch (MessagingException ex) {
            ex.printStackTrace();
        }
        return false;
    }


    /**
     * 傳送帶附件的郵件
     * @param info
     * @return
     */
    public boolean sendFileMail(MailInfo info, File file){
        Message attachmentMail = createAttachmentMail(info,file);
        try {
            Transport.send(attachmentMail);
            return true;
        } catch (MessagingException e) {
            e.printStackTrace();
            return false;
        }

    }

    /**
     * 建立帶有附件的郵件
     * @return
     */
    private Message createAttachmentMail(final MailInfo info, File file) {
        //建立郵件
        MimeMessage message = null;
        Properties pro = info.getProperties();
        try {

            Session sendMailSession = Session.getInstance(pro, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(info.getUserName(),info.getPassword());
                }
            });

            message = new MimeMessage(sendMailSession);
            // 設定郵件的基本資訊
            //建立郵件傳送者地址
            Address from = new InternetAddress(info.getFromAddress());
            //設定郵件訊息的傳送者
            message.setFrom(from);
            //建立郵件的接受者地址,並設定到郵件訊息中
            Address to = new InternetAddress(info.getToAddress());
            //設定郵件訊息的接受者, Message.RecipientType.TO屬性表示接收者的型別為TO
            message.setRecipient(Message.RecipientType.TO, to);
            //郵件標題
            message.setSubject(info.getSubject());

            // 建立郵件正文,為了避免郵件正文中文亂碼問題,需要使用CharSet=UTF-8指明字元編碼
            MimeBodyPart text = new MimeBodyPart();
            text.setContent(info.getContent(), "text/html;charset=UTF-8");

            // 建立容器描述資料關係
            MimeMultipart mp = new MimeMultipart();
            mp.addBodyPart(text);
                // 建立郵件附件
                MimeBodyPart attach = new MimeBodyPart();

            FileDataSource ds = new FileDataSource(file);
            DataHandler dh = new DataHandler(ds);
                attach.setDataHandler(dh);
                attach.setFileName(MimeUtility.encodeText(dh.getName()));
                mp.addBodyPart(attach);
            mp.setSubType("mixed");
            message.setContent(mp);
            message.saveChanges();

        } catch (Exception e) {
            Log.e("TAG", "建立帶附件的郵件失敗");
            e.printStackTrace();
        }
        // 返回生成的郵件
        return message;
    }
}

第三步、傳送郵件

這裡舉例傳送文字郵件和帶附件的郵件

package teprinciple.yang.sendmaildemo;

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

import com.shidian.mail.SendMailUtil;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class MainActivity extends AppCompatActivity {

    private EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText) findViewById(R.id.toAddEt);
    }


    public void senTextMail(View view) {
        SendMailUtil.send(editText.getText().toString());
    }

    public void sendFileMail(View view) {

        File file = new File(Environment.getExternalStorageDirectory()+File.separator+"test.txt");
        OutputStream os = null;
        try {
            os = new FileOutputStream(file);
            String str = "hello world";
            byte[] data = str.getBytes();
            os.write(data);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                if (os != null)os.close();
            } catch (IOException e) {
            }
        }
        SendMailUtil.send(file,editText.getText().toString());
    }
}

下面是傳送郵件的SendMailUtil

package com.shidian.mail;

import android.support.annotation.NonNull;

import java.io.File;

/**
 * Created by Administrator on 2017/4/10.
 */

public class SendMailUtil {
    //qq
    private static final String HOST = "smtp.qq.com";
    private static final String PORT = "587";
    private static final String FROM_ADD = "[email protected]"; //傳送方郵箱
    private static final String FROM_PSW = "lfrlpganzjrwbeci";//傳送方郵箱授權碼

//    //163
//    private static final String HOST = "smtp.163.com";
//    private static final String PORT = "465"; //或者465  994
//    private static final String FROM_ADD = "[email protected]";
//    private static final String FROM_PSW = "teprinciple163";
////    private static final String TO_ADD = "[email protected]";

    public static void send(final File file,String toAdd){
        final MailInfo mailInfo = creatMail(toAdd);
        final MailSender sms = new MailSender();
        new Thread(new Runnable() {
            @Override
            public void run() {
                sms.sendFileMail(mailInfo,file);
            }
        }).start();
    }

    public static void send(String toAdd){
        final MailInfo mailInfo = creatMail(toAdd);
        final MailSender sms = new MailSender();
        new Thread(new Runnable() {
            @Override
            public void run() {
                sms.sendTextMail(mailInfo);
            }
        }).start();
    }

    @NonNull
    private static MailInfo creatMail(String toAdd) {
        final MailInfo mailInfo = new MailInfo();
        mailInfo.setMailServerHost(HOST);
        mailInfo.setMailServerPort(PORT);
        mailInfo.setValidate(true);
        mailInfo.setUserName(FROM_ADD); // 你的郵箱地址
        mailInfo.setPassword(FROM_PSW);// 您的郵箱密碼
        mailInfo.setFromAddress(FROM_ADD); // 傳送的郵箱
        mailInfo.setToAddress(toAdd); // 發到哪個郵件去
        mailInfo.setSubject("Hello"); // 郵件主題
        mailInfo.setContent("Android 測試"); // 郵件文字
        return mailInfo;
    }
}

特別注意:一定要開啟郵箱POP3/IMAP/SMTP服務,不然認證會失敗

需要把SendMailUtil 下的FROM_ADD,FROM_PSW配置成你自己的賬號和授權碼

  private static final String FROM_ADD = "[email protected]";
    private static final String FROM_PSW = "lfrlpganzjrwbeci";

                                                                    
                                                                           全棧開發者微信公眾號 

相關推薦

Android快速實現傳送郵件

前言 現在一般很少有用Android原生app傳送郵件的需求,但是前段時間公司專案需要在Android app 內部發送郵件,於是就在網上收集資料並整理了一個Demo。雖然最後這個需求被減掉了,但是我這裡還是把Demo的內容給大家分享一下。 第一步、匯入第三方jar包

Magento Transactional Emails常規設定 magento email:快速實現傳送自定義郵件

郵件是幾乎所有電商系統都要用到的功能,在magento中實現簡單的郵件傳送並不複雜,不過要想用特定郵件模板,就需要對magento郵件系統做一些深入瞭解,本文就分析一下如何傳送自定義郵件。之前已經發了一篇介紹magento基本郵件設定的文章 Magento Transactional Emails

magento email:快速實現傳送自定義郵件

當我們對magento email機制有一定的瞭解之後,便可以在模組中使用自定義郵件模板快速實現傳送郵件功能!登入後臺system->Transactional Emails,單擊右上角Add New Templ

Android快速實現上傳項目到Github

alt+ 紅色 選擇 index.php 就會 打開 ads 倉庫 http 本文為skylinelin原創,轉載請註明出處! 一、簡介 現在在網上瀏覽關於Git的文章,基本上都是使用命令行(Git Bash),命令行效率是很高的,但是有一定的復雜性,現在我們看如何用A

android 快速實現夜間模式

最近專案中遇到了一個問題,夜間模式在8.0以上的手機中不起作用,查看了一下原因,是夜間模式實現方法的問題。分兩種情況介紹一下 先看一下執行效果: 第一種 是目前專案中用到的,是以前的開發人員寫的,存在一些問題(不相容8.0以上的版本),已解決 第二種是Support Libra

Android 快速實現掃描識別二維碼(即掃碼登入功能)

IG牛逼l 零封G2!給RNG報仇了! 掃碼登入現在很流行,淘寶,京東,熊貓直播各大網站都有掃碼登入功能,其實呢對於客戶端來說掃碼登入很簡單,因為難點都集中在了前端身上,我簡單講下掃碼登入的流程: 1 客戶端掃碼然後開啟掃碼確認頁面(H5頁面,這個時候要把使用者的

單純java程式碼實現傳送郵件

 這個是工具類直接執行main方法就可以傳送郵箱,細節方面看我另一篇文章 https://mp.csdn.net/postedit/84307897 package com.bgs.controller; import javax.mail.Authenticator

node.js實現傳送郵件功能

準備事項 QQ郵箱設定:進入QQ郵箱->設定->賬戶->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務->開啟POP3/SMTP服務,並複製pass祕鑰 安裝nodemailer :npm install nodem

python實現傳送郵件

本文目錄 一 使用SMTP模組傳送郵件 二 傳送html格式郵件 三 傳送帶附件的郵件  四 Django傳送郵件 各大郵箱smtp伺服器及埠  qq郵箱配置smtp   一 使用SMTP模組傳送郵件

log4j實現傳送郵件功能

引言 最近預上線的一個機器人專案,因為這個專案中有很多的AI的東西,整個專案分為三部分組成,web工程——FS——NLU,整個web工程都是由我來負責,後面兩部分有大資料部門的東西負責,因為後面這兩部分對於我們貸後行業來說都是比較超前的,所以在整個連調的過程中會有很多的異常

JAVAmail簡單實現傳送郵件

Android在郵件客戶端的設計中,有兩種實現方法: 一、呼叫Android系統自帶的郵件服務 ,這種方法簡單易用,但是傳送郵件的賬號必須是gmail賬號 二、採用javamail功能包進行設計,不必侷限於特定郵箱,但是比前一種較麻煩 1、使用Android 自帶的

Android 使用javamail傳送郵件

專案需要activation.jar,additionnal.jar,mail.jar 下載三個包 編寫郵件傳送步驟: 設定伺服器 新增郵箱認證 設定認證的Session(重要) 根據Session獲取郵件物件(MimeMessage) 郵件物件的填充(發件人,收

wordpress使用阿里雲郵件推送服務實現傳送郵件

之前用騰迅雲時,配置了wordpress是可以使用郵件服務的,然而到了阿里雲,卻無法使用了,有人說是因為阿里雲關了25埠,但騰迅好像也關了。 百度看看有沒有其他方法,最終讓我找到個方法,可惜不是很完美,就是使用阿里雲郵件推送服務,不過只能免費傳送200封郵件。。。當然,總比沒有好 開啟網址是這樣的,如果沒有話

TempletMail 實現傳送郵件

話不多說,實現功能為主  1、引入phpmailer,   2、初始化(TP框架中) if ((new TempletMail())->OrdertenantSuccessful($info['email'], '', [])) { } else { } p

實現傳送郵件功能

原文出自:www.hangge.com 轉載請保留原文連結:http://www.hangge.com/blog/cache/detail_792.html 使用MessageUI.framework框架除了可以傳送簡訊,還能傳送Email,步驟如下: (

JavaWeb中使用JavaMail實現傳送郵件功能例項詳解

現在很多的網站都提供有使用者註冊功能, 通常我們註冊成功之後就會收到一封來自注冊網站的郵件。郵件裡面的內容可能包含了我們的註冊的使用者名稱和密碼以及一個啟用賬戶的超連結等資訊。今天我們也來實現一個這樣的功能,使用者註冊成功之後,就將使用者的註冊資訊以Email的形式傳送到使

JAVA實現傳送郵件功能

/** * 傳送郵件功用方法 * @param mailTo * @param html * @param userName */ public void sendEmployeeCommon(String mailTo , String html , Stri

iOS 實現傳送郵件和簡訊

- (void)businessContactWithMail { Class mailClass = (NSClassFromString(@"MFMailComposeViewController")); if (mailClass != nil) { // We

thinkphp5中使用phpmailer實現傳送郵件功能

一、開啟SMTP服務(使用php傳送郵件需要用到SMTP服務,這裡以163郵箱的SMTP服務為例)。 1.登入163郵箱,在首頁上找到“設定”。 2.選擇開啟的服務,一般都全選,POP3/SMTP/IMAP,開啟SMTP服務就得先開通客戶授權碼。 3.點選開通客戶授權

Android開發實現傳送簡訊驗證碼(使用第三方伺服器Bmob)

呼叫Bmob第三方伺服器實現簡訊驗證的功能,大致思路如下: 隨機產生6位數字,然後呼叫Bmob的請求短髮函式傳送者六位數到伺服器,然後伺服器給指定手機發送這6位驗證碼,然後感覺使用者輸入的數字進行判斷