文档章节

使用 JavaMail 实现邮件发送与收取

黄勇
 黄勇
发布于 2013/11/24 20:15
字数 502
阅读 14844
收藏 38

已使用 163 邮箱测试通过,且支持 SSL 连接。

发送邮件

示例:Jack 发送一封邮件给 Rose。

public class SendMail {

    public static void main(String[] args) {
        boolean isSSL = true;
        String host = "smtp.163.com";
        int port = 465;
        String from = "jack@163.com";
        String to = "rose@163.com";
        boolean isAuth = true;
        final String username = "jack@163.com";
        final String password = "jack";

        Properties props = new Properties();
        props.put("mail.smtp.ssl.enable", isSSL);
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.port", port);
        props.put("mail.smtp.auth", isAuth);

        Session session = Session.getDefaultInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

        try {
            Message message = new MimeMessage(session);

            message.setFrom(new InternetAddress(from));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            message.setSubject("主题");
            message.setText("内容");

            Transport.send(message);
        } catch (AddressException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }

        System.out.println("发送完毕!");
    }
}

收取邮件

示例:Rose 收取最近一封邮件。

import java.util.Date;
import java.util.Properties;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;

public class FetchMail {

    public static void main(String[] args) {
        String protocol = "pop3";
        boolean isSSL = true;
        String host = "pop.163.com";
        int port = 995;
        String username = "rose@163.com";
        String password = "rose";

        Properties props = new Properties();
        props.put("mail.pop3.ssl.enable", isSSL);
        props.put("mail.pop3.host", host);
        props.put("mail.pop3.port", port);

        Session session = Session.getDefaultInstance(props);

        Store store = null;
        Folder folder = null;
        try {
            store = session.getStore(protocol);
            store.connect(username, password);

            folder = store.getFolder("INBOX");
            folder.open(Folder.READ_ONLY);

            int size = folder.getMessageCount();
            Message message = folder.getMessage(size);

            String from = message.getFrom()[0].toString();
            String subject = message.getSubject();
            Date date = message.getSentDate();

            System.out.println("From: " + from);
            System.out.println("Subject: " + subject);
            System.out.println("Date: " + date);
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        } finally {
            try {
                if (folder != null) {
                    folder.close(false);
                }
                if (store != null) {
                    store.close();
                }
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }

        System.out.println("接收完毕!");
    }
}

常用邮件协议

发送邮件:SMTP

收取邮件:POP3、IMAP

常用邮件配置项

配置项 说明
mail.xxx.ssl.enable
是否支持 SSL 连接
mail.xxx.host
邮件服务器主机名
mail.xxx.port
邮件服务器端口号
mail.xxx.auth
是否进行身份认证


说明:xxx 表示协议名称,例如:smtp、pop3 等。

默认端口号


SMTP
POP3
IMAP
普通方式 25 110 143
SSL 方式 465 995 993

使用 Apache Commons Email 发送邮件

import org.apache.commons.mail.Email;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;

public class SendMail {

    public static void main(String[] args) {
        boolean isSSL = true;
        String host = "smtp.163.com";
        int port = 465;
        String from = "jack@163.com";
        String to = "rose@163.com";
        String username = "jack@163.com";
        String password = "jack";

        try {
            Email email = new SimpleEmail();
            email.setSSLOnConnect(isSSL);
            email.setHostName(host);
            email.setSmtpPort(port);
            email.setAuthentication(username, password);
            email.setFrom(from);
            email.addTo(to);
            email.setSubject("主题");
            email.setMsg("内容");
            email.send();
        } catch (EmailException e) {
            e.printStackTrace();
        }

        System.out.println("发送完毕!");
    }
}

参考:http://commons.apache.org/proper/commons-email/userguide.html

© 著作权归作者所有

黄勇

黄勇

粉丝 6546
博文 121
码字总数 216155
作品 1
浦东
CTO(技术副总裁)
私信 提问
加载中

评论(6)

树下阳光
0
小人物_Amor
小人物_Amor
黄勇大哥考虑过当服务器上的邮件很多比如10000封的时候收取的效率问题吗?另外int size = folder.getMessageCount();
Message message = folder.getMessage(size);这句话你确定收取的是最近一份邮件吗?
水牛叔叔
水牛叔叔
好耶
七律断舍离
七律断舍离

怎么接收邮件会提示store.connect(username, password); 这个方法有问题呢?里面的参数不对,还差一个
黄勇
黄勇

引用来自“Sunw730”的评论

常用邮件协议是不是写反了?发送邮件smtp,收取邮件pop3、imap
确实是写反了,阅读了 1429 次,终于被兄弟发现了这个 bug,看来该 bug 藏得足够深啊。
Sunw730
Sunw730
常用邮件协议是不是写反了?发送邮件smtp,收取邮件pop3、imap
通过JavaMail访问Hotmail邮箱

相信许多人都有MSN聊天工具的帐号,例如abc@hotmail.com ,这个账号其实也是一个邮件地址,可以进行正常的邮件收发功能,你可以通过网址 http://www.hotmail.com 来访问和操作这个邮箱进行邮...

红薯
2008/10/05
2.5K
7
刚刚学习到的Android使用Javamail通过XOauth调用Gmail API发送邮件的方法

前景知识:OAuth,Javamail-android,Javamail api in android using XOauth 我的一个App项目需要在Service中自动发送邮件的功能,因为是后台自动发送邮件,不能出现邮件UI所以需要使用Javam...

since1986
2014/04/12
0
0
邮件发送失败:Mail server connection failed; 501 Syntax: HELO hostname

出现这个问题,是系统利用javamail组件发送邮件,Javamail在提取本地hostname的时候会dig 改hostname,然后以改ip发送邮件。 由于hostname对应的ip地址,linux无法解析(如果是windows则无这...

红薯
2011/10/13
1K
0
初步实现 Mail 插件 —— 收取邮件

本文是《轻量级 Java Web 框架架构设计》的系列博文。 在上篇中描述了发送邮件的主要过程,今天我想和大家分享一下 Smart Mail 插件的另外一个功能 —— 收取邮件,可能没有发送邮件那么常用...

黄勇
2013/11/25
0
3
Android 使用 JavaMail

今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题不用第三方邮件程序。为了以后使用方便,自己写了段代码. Javamail-Android配置步骤: 下载Android版本JavaMail包,addit...

Taki
2012/08/14
0
2

没有更多内容

加载失败,请刷新页面

加载更多

运维规范

命名规范 发布流程 监控告警 故障定位 状态 日志 监控

以谁为师
51分钟前
2
0
约瑟夫环(报数游戏)java实现

开端 公司组织考试,一拿到考题,就是算法里说的约瑟夫环,仔细想想 以前老师将的都忘了,还是自己琢磨把~ package basic.gzy;import java.util.Iterator;import java.util.LinkedList;...

无极之岚
今天
2
0
Kernel字符设备驱动框架

Linux设备分为三大类:字符设备,块设备和网络设备,这三种设备基于不同的设备框架。相较于块设备和网络设备,字符设备在kernel中是最简单的,也是唯一没有基于设备基础框架(device结构)的...

yepanl
今天
3
0
Jenkins 中文本地化的重大进展

本文首发于:Jenkins 中文社区 我从2017年开始,参与 Jenkins 社区贡献。作为一名新成员,翻译可能是帮助社区项目最简单的方法。 本地化的优化通常是较小的改动,你无需了解项目完整的上下文...

Jenkins中文社区
昨天
4
0
Spring中如何使用设计模式

关于设计模式,如果使用得当,将会使我们的代码更加简洁,并且更具扩展性。本文主要讲解Spring中如何使用策略模式,工厂方法模式以及Builder模式。 1. 策略模式 关于策略模式的使用方式,在S...

爱宝贝丶
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部