使用JavaMail工具类发送邮件

 准备好SMTP登录信息

以网易@163.com为例:

1.找到POP3/SMTP/IMAP选项,打开POP3/SMTP服务

 2.找到授权密码管理,点击新增授权密码(只会显示一次,切记第一时间复制下来)

 3.找到服务器地址信息和端口号(以163邮箱为例)

 

导入javax.mail扩展包,选择和自己jdk版本适合的扩展包,地址:

JavaMailhttps://javaee.github.io/javamail/

目录

 准备好SMTP登录信息

一、JavaMail工具类

二、发送邮件

1.发送普通文本内容(包含html标签,可抄送给其他人)

2.邮件既包含正文也包含附件

3.发送内嵌图片的html邮件

小结:


一、JavaMail工具类

        JavaMail是一种工具类:首先要把JavaMail相关依赖的jar包加入当前项目,然后通过JavaMail  API连接到SMTP服务器上:以@163.com为例,服务器地址为smtp.163.com,端口号为465,连接SMTP实例时,需要准备一个Properties对象,填入相关信息。最后获取Session实例时,如果服务器需要认证,还需要传入一个Authenticator对象,并返回指定的用户名和口令。(获取到Session实例后,打开调试模式可以看到SMTP通信的详细内容,便于调试)

代码如下:

public final class JavaMailUtils {
    private JavaMailUtils(){

    }
    public static Session createSession() {
        //邮箱账号信息
        String userName = "17*******79@163.com";   //邮箱发送账号
        String password = "WJ**********IUU";     //账号授权密码
        //smtp服务器连接信息
        Properties props = new Properties();
        props.put("mail.smtp.host","smtp.163.com");     //smtp服务器地址
        props.put("mail.smtp.port","465");        //主机端口号
        props.put("mail.smtp.auth","true");       //是否需要用户认证
        props.put("mail.smtp.starttls.enable","true");    //启用TLS加密

        //创建Session会话
        //参数1:smtp服务器连接参数
        //参数2:账号和密码的授权认证对象
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(userName,password);
            }
        });

二、发送邮件

1.发送普通文本内容(包含html标签,可抄送给其他人)

(1)创建Session会话(Session)

(2)创建邮件对象(MimeMessage)

(3)发送邮件(Transport)

        代码示例如下:

public class Demo1 {
    public static void main(String[] args) {
        //抄送多个邮箱地址
        //邮件内容包含html标签
        //1.创建session会话
        Session session = JavaMailUtils.createSession();
        //2.创建MimeMessage邮件对象
        MimeMessage message = new MimeMessage(session);
        //抄送文本
        try {
            message.setFrom(new InternetAddress("17*******79@163.com"));   //发件人邮箱
            message.setRecipient(Message.RecipientType.TO,new InternetAddress("20******32@qq.com"));   //收件人邮箱
            message.setRecipients(Message.RecipientType.CC,
                    new InternetAddress[]{new InternetAddress("15******83@qq.com"),new InternetAddress("20******32@qq.com")});   //抄送人邮箱
            message.setSubject("邮件仅包含正文");
            //邮件仅包含正文
            message.setText("今天<b>周六</b>了");
            //3.发送邮件
            Transport.send(message);

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}

2.邮件既包含正文也包含附件

        电子邮件中携带附件,不能直接调用message.setText()方法,而是要构造一个Multipart对象,一个Multipart对象可以添加若干个BodyPart,其中第一个BodyPart是正文(文本),后面的BodyPart是附件。

        BodyPart依靠setContent()决定添加的内容,如果添加文本,用setContent("...", "text/plain;charset=utf-8")添加纯文本,或者用setContent("...", "text/html;charset=utf-8")添加HTML文本。如果添加附件,需要设置文件名(不一定和真实文件名一致),并且添加一个DataHandler(),传入文件的MIME类型。二进制文件可以用application/octet-stream,Word文档则是application/msword。
        最后,通过setContent()把Multipart添加到Message中,即可发送。

代码示例如下:

public class Demo2 {
    public static void main(String[] args) {      
        //1.创建session会话
        Session session = JavaMailUtils.createSession();
        //2.创建MimeMessage邮件对象
        MimeMessage message = new MimeMessage(session);
        try {
            message.setFrom(new InternetAddress("17*******79@163.com"));   //发件人邮箱
            message.setRecipient(Message.RecipientType.TO,new InternetAddress("15******83@qq.com"));  //收件人邮箱
            message.setRecipients(Message.RecipientType.CC,new InternetAddress[]{new InternetAddress("13******11@qq.com")});  //抄送人邮箱
            message.setSubject("邮件包含正文和附件");
            //邮件既包含正文也包含附件
            // 正文
            BodyPart textPart = new MimeBodyPart();
            textPart.setContent("今天<b>四点半</b>回家<b>A</b>","text/html;charset=utf-8");
            //附件
            BodyPart filePart = new MimeBodyPart();
            filePart.setFileName("****.jpg");     //自己命名附件名称
            //上传附件文件
            filePart.setDataHandler(
                    new DataHandler(
                            new ByteArrayDataSource(
                                    Files.readAllBytes(Paths.get("C:\\Users\\Lenovo\\Pictures\\Saved Pictures\\****.jpg")),"application/octet-stream")));    //选择要上传的文件路径
            //将正文+附件组装成Multipart对象
            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(textPart);
            multipart.addBodyPart(filePart);
            //将Multipart对象放入邮件
            message.setContent(multipart);
            //3.发送邮件
            Transport.send(message);
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

3.发送内嵌图片的html邮件

        发送内嵌图片的邮件与带有附件的邮件类似,在上述基础上添加setDataHandler()方法设置图片ID,然后在正文中加入<img src=\"cid:****.jpg\">,展示图片。

public class Demo3 {
    public static void main(String[] args) {        
        Session session = JavaMailUtils.createSession();

        MimeMessage message = new MimeMessage(session);

        try {
            message.setFrom(new InternetAddress("17*******79@163.com"));
            message.setRecipient(Message.RecipientType.TO,new InternetAddress("20******32@qq.com"));
            message.setRecipients(Message.RecipientType.CC,new InternetAddress[]{new InternetAddress("20******32@qq.com"),new InternetAddress("13******11@qq.com")});
            message.setSubject("内嵌图片的邮件");

            BodyPart textPart = new MimeBodyPart();
            StringBuilder contentText = new StringBuilder();
            contentText.append("<h3>今天星期六了</h3>");
            contentText.append("<p>下午四点半回家</p>");
            contentText.append("<img src=\"cid:****\"/>");
            textPart.setContent(contentText.toString(),"text/html;charset=utf-8");

            BodyPart imagePart = new MimeBodyPart();
            imagePart.setDataHandler(new DataHandler(
                    new ByteArrayDataSource(
                            Files.readAllBytes(
                                    Paths.get("C:\\Users\\Lenovo\\Pictures\\Saved Pictures\\*****.jpg")),"application/octet-stream")));      //图片路径
            imagePart.setHeader("Content-ID","****");

            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(textPart);
            multipart.addBodyPart(imagePart);
            message.setContent(multipart);

            Transport.send(message);
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

小结:


● 使用JavaMail API发送邮件本质上是一个MUA软件通过SMTP协议发送邮件至MTA服务器
● 打开调试模式可以看到详细的SMTP交互信息
● 某些邮件服务商需要开启SMTP,并需要独立的SMTP登录密码

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sorenw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值