Android邮件发送实现

这里邮件的实现方式使用的是 JavaMail for Andorid,用到的包主要有android-mail和android-activation,具体详情可以参考:https://javaee.github.io/javamail/#JavaMail_for_Android,这里使用的Android studio进行开发,首先是进行配置:

repositories { 
    jcenter()
    maven {
        url "https://maven.java.net/content/groups/public/"
    }
}


android {
    packagingOptions {
        pickFirst 'META-INF/LICENSE.txt' // picks the JavaMail license file
    }
}


dependencies {
    // use whatever the current version is...
    compile 'com.sun.mail:android-mail:1.6.0'
    compile 'com.sun.mail:android-activation:1.6.0'
}

 这里是根据官网进行配置的,但配置完这个后,我的编译结果是会报错的,所以对上面的配置进行了一些修改:

第一点修改:

packagingOptions {
    pickFirst 'META-INF/*' // picks the JavaMail license file
}

第二点修改,在dependencies中添加:

configurations {    all*.exclude group: 'javax.activation', module: 'activation'}

第三点修改,我在3.1.3编译不过,这里我改为3.0.0可以编过:

    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
    }

在这样配置后,编译就没问题了,接下类就是怎么去实现邮件的发送了,这里先来一段官网的小样列,感兴趣的可以自己去看看,地址:https://javaee.github.io/javamail/docs/api/

    Properties props = new Properties();
    props.put("mail.smtp.host", "my-mail-server");
    Session session = Session.getInstance(props, null);

    try {
        MimeMessage msg = new MimeMessage(session);
        msg.setFrom("me@example.com");
        msg.setRecipients(Message.RecipientType.TO,
                          "you@example.com");
        msg.setSubject("JavaMail hello world example");
        msg.setSentDate(new Date());
        msg.setText("Hello, world!\n");
        Transport.send(msg, "me@example.com", "my-password");
    } catch (MessagingException mex) {
        System.out.println("send failed, exception: " + mex);
    }

这就是官网的一个小demo,对于刚开始接触的人,里面的这些配置可能会让你不明所以,会有各种坑在等你,下面将对这些参数进行说明:

1、首先就是: props.put("mail.smtp.host", "my-mail-server");一开始我看到这的时候,这什么东西,完全看不懂,其实这里就是要你配置你是从哪个邮箱发出去的,put方法中的键是你不需要变的,这里举两例,如果你是已QQ发出去,那么这里"my-mail-server"就得改为:smtp.163.com,如果是是163邮箱,那么就是:smtp.163.com,最终代码就改为:props.put("mail.smtp.host", "my-mail-server");如果你是其他邮箱,那你就百度:xx邮箱的smtp设置;

2、msg.setFrom("me@example.com");这里就是你是从哪个邮箱发出去的;

3、msg.setRecipients(Message.RecipientType.TO, "you@example.com");这里是设置收件人的邮箱;

4、msg.setSubject("JavaMail hello world example");    设置邮件的主题;
                msg.setSentDate(new Date());                                  设置有邮件的日期;
                msg.setText("Hello, world!\n");                                   设置邮件的内容;

5、Transport.send(msg, "me@example.com", "my-password");这里需要注意这个my-password,这里传的并不是你邮箱的密码,而是你邮箱的授权码,这里以163邮箱为例:

 这里可以先点掉 :POP3/SMTP服务  后在点上,之后跟着提示走就可以自己设置授权码了。qq邮箱也是需要这样设置得到授权码的,这里就不在说了。

最后这里在贴上我自己修改后的代码:

    private void sendMailMy(){
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.163.com");
        Session session = Session.getInstance(props, null);
        try {
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom("xxx@163.com");
            msg.setRecipients(Message.RecipientType.TO, "xxx@qq.com");
            msg.setSubject("标题");
            msg.setSentDate(new Date());
            msg.setText("你好!\n这里是来自ubt的信息");
            Transport.send(msg, "xxx@163.com", "授权码");
        } catch (MessagingException mex) {
            System.out.println("send failed, exception: " + mex);
        }
    }

这里是从我的163邮箱发给了我的qq邮箱,有没有觉得so easy。

但是,这种方式只是发了文本内容,并没有发送附件,而且看起来不舒服,下面就来封装一下,主要分为四个类: 

第一个类是对消息体(Message)的封装,如果你还想设置消息中的其他内容,都可以在这里添加属性,这只是样例:

public class MailSenderInfo {

    private String mailServerHost;
    private String mailServerPort = "25";
    private String fromAddress;
    private String toAddress;
    private String userName;
    private String password;
    private boolean validate = false;
    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;
    }
}

第二个是对权限的封装,也就是我们发送邮箱的账号和密码(授权码):

public class MailAuthenticator extends Authenticator {

    String userName=null;
    String password=null;

    public MailAuthenticator(){
    }
    public MailAuthenticator(String username, String password) {
        this.userName = username;
        this.password = password;
    }
    // 这个方法在Authenticator内部会调用
    protected PasswordAuthentication getPasswordAuthentication(){
        return new PasswordAuthentication(userName, password);
    }

}

 第三个就是封装一个简易的发送器了,通过这个将邮件发送出去,这里封装了三个方法,第一个是发送纯文本;第二个是发送文本和附件;第三个是以HTML格式发送,可根据需求自行添加:

public class SimpleMailSender {

    /**
     * 以文本格式发送邮件
     *
     * @param mailInfo 待发送的邮件的信息
     */
    public boolean sendTextMail(MailSenderInfo mailInfo) {
        // 判断是否需要身份认证
        MailAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
        if (mailInfo.isValidate()) {
            // 如果需要身份认证,则创建一个密码验证器
            authenticator = new MailAuthenticator(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());
            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;
    }

    /**
     * 以文本格式发送邮件并添加附加
     *
     * @param mailInfo 待发送的邮件的信息
     */
    public boolean sendTextAndFileMail(MailSenderInfo mailInfo,String[] filePath) {
        // 判断是否需要身份认证
        MailAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
        if (mailInfo.isValidate()) {
            // 如果需要身份认证,则创建一个密码验证器
            authenticator = new MailAuthenticator(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());
            mailMessage.setRecipient(Message.RecipientType.TO, to);
            // 设置邮件消息的主题
            mailMessage.setSubject(mailInfo.getSubject());
            // 设置邮件消息发送的时间
            mailMessage.setSentDate(new Date());

            // 添加附件体
            BodyPart messageBodyPart = new MimeBodyPart();
            // 设置邮件消息的主要内容
            messageBodyPart.setContent(mailInfo.getContent(),  "text/html;charset=utf-8");
            MimeMultipart multipart = new MimeMultipart();
            multipart.addBodyPart(messageBodyPart);
            for (int i = 0; i < filePath.length; i++) {
                MimeBodyPart bodyPart = new MimeBodyPart();
                try {
                    //绑定附件路径
                    bodyPart.attachFile(filePath[i]);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                multipart.addBodyPart(bodyPart);
            }
            mailMessage.setContent(multipart);

            // 发送邮件
            Transport.send(mailMessage);
            return true;
        } catch (MessagingException ex) {
            ex.printStackTrace();
        }
        return false;
    }

    /**
     * 以HTML格式发送邮件
     *
     * @param mailInfo 待发送的邮件信息
     */
    public static boolean sendHtmlMail(MailSenderInfo mailInfo) {
        // 判断是否需要身份认证
        MailAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
        //如果需要身份认证,则创建一个密码验证器
        if (mailInfo.isValidate()) {
            authenticator = new MailAuthenticator(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;
    }

}

    最后就是将上面三个类需要的信息配置一下就可以发送,这里在抽出一个类:

public class EmailUtil {
    private static final String TAG = "EmailUtil";

    /**
     * @param title  邮件的标题
     * @param msuggestions 邮件的文本内容
     * @param toAddress  收件人的地址  如:xxx@qq.com
     */
    public static void autoSendMail(String title,String msuggestions,String toAddress) {
        MailSenderInfo mailInfo = new MailSenderInfo();
        mailInfo.setMailServerHost("smtp.163.com");//smtp地址
        mailInfo.setMailServerPort("25");
        mailInfo.setValidate(true);
        mailInfo.setUserName("xxx@163.com");// 发送方邮件地址
        mailInfo.setPassword("发送邮箱授权码");// 邮箱POP3/SMTP服务授权码
        mailInfo.setFromAddress("xxx@163.com");// 发送方邮件地址
        mailInfo.setToAddress(toAddress);//接受方邮件地址
        mailInfo.setSubject(title);//设置邮箱标题
        mailInfo.setContent(msuggestions);
        // 这个类主要来发送邮件
        SimpleMailSender sms = new SimpleMailSender();
        sms.sendTextMail(mailInfo);// 发送文体格式
        Log.d(TAG, "autoSendMail: msuggestions: "+msuggestions);
    }

    /**
     * @param title  邮件的标题
     * @param msuggestions 邮件的文本内容
     * @param toAddress  收件人的地址  如:xxx@qq.com
     * @param filePath  附件的路径 
     */
    public static void autoSendFileMail(String title,String msuggestions,String toAddress,String[] filePath) {
        MailSenderInfo mailInfo = new MailSenderInfo();
        mailInfo.setMailServerHost("smtp.163.com");//smtp地址
        mailInfo.setMailServerPort("25");
        mailInfo.setValidate(true);
        mailInfo.setUserName("xxx@163.com");// 发送方邮件地址
        mailInfo.setPassword("发送邮箱授权码");// 邮箱POP3/SMTP服务授权码
        mailInfo.setFromAddress("xxx@163.com");// 发送方邮件地址
        mailInfo.setToAddress(toAddress);//接受方邮件地址
        mailInfo.setSubject(title);//设置邮箱标题
        mailInfo.setContent(msuggestions);
        // 这个类主要来发送邮件
        SimpleMailSender sms = new SimpleMailSender();
        sms.sendTextAndFileMail(mailInfo,filePath);// 发送文体格式
        Log.d(TAG, "autoSendMail: msuggestions: "+msuggestions);
    }
}

这里我是把发送的邮箱定死了,该配的参数也都在这里配好了,其他需要定制的参数传进来就好了,这样就大体完成了,如果有其他需求的可以自行修改,这里提供的只是一个模板。

参考文章:https://www.jianshu.com/p/305baada101b

  • 15
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
要在Android Studio中实现发送邮件应用程序,需要遵循以下步骤: 1. 在Android Studio中创建新的Android项目。 2. 在布局文件中添加EditText,Button和TextView组件。 3. 在AndroidManifest.xml文件中添加Internet权限。 4. 编写Java代码以实现发送电子邮件功能。 以下是一个简单的示例代码,可用于发送邮件: ``` import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import android.net.Uri; public class MainActivity extends AppCompatActivity { EditText editTextTo, editTextSubject, editTextMessage; Button sendButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextTo = (EditText) findViewById(R.id.editTextTo); editTextSubject = (EditText) findViewById(R.id.editTextSubject); editTextMessage = (EditText) findViewById(R.id.editTextMessage); sendButton = (Button) findViewById(R.id.sendButton); sendButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String to = editTextTo.getText().toString(); String subject = editTextSubject.getText().toString(); String message = editTextMessage.getText().toString(); Intent emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.setData(Uri.parse("mailto:")); emailIntent.setType("text/plain"); emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {to}); emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); emailIntent.putExtra(Intent.EXTRA_TEXT, message); try{ startActivity(Intent.createChooser(emailIntent, "Send email using...")); } catch (Exception e){ Toast.makeText(MainActivity.this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } } }); } } ``` 在此代码中,我们使用了Android的Intent类来发送电子邮件。此Intent包含电子邮件地址,主题和消息正文。我们还使用了startActivity方法来启动电子邮件应用程序。 请注意,要使此代码正常工作,您需要在AndroidManifest.xml文件中添加以下权限: ``` <uses-permission android:name="android.permission.INTERNET" /> ``` 这将允许您的应用程序连接到互联网并发送电子邮件。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值