使用 JavaMail 实现邮件发送与收取
博客专区 > 黄勇 的博客 > 博客详情
使用 JavaMail 实现邮件发送与收取
黄勇 发表于4年前
使用 JavaMail 实现邮件发送与收取
  • 发表于 4年前
  • 阅读 12981
  • 收藏 36
  • 点赞 3
  • 评论 6

已使用 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

共有 人打赏支持
黄勇
粉丝 5364
博文 114
码字总数 196279
作品 1
评论 (6)
Sunw730
常用邮件协议是不是写反了?发送邮件smtp,收取邮件pop3、imap
黄勇

引用来自“Sunw730”的评论

常用邮件协议是不是写反了?发送邮件smtp,收取邮件pop3、imap
确实是写反了,阅读了 1429 次,终于被兄弟发现了这个 bug,看来该 bug 藏得足够深啊。
七律断舍离

怎么接收邮件会提示store.connect(username, password); 这个方法有问题呢?里面的参数不对,还差一个
水牛叔叔
好耶
小人物_Amor
黄勇大哥考虑过当服务器上的邮件很多比如10000封的时候收取的效率问题吗?另外int size = folder.getMessageCount();
Message message = folder.getMessage(size);这句话你确定收取的是最近一份邮件吗?
树下阳光
0
×
黄勇
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: