JAVA mail发送邮件

总结一个简单的java发送邮件的demo,转载自 https://www.cnblogs.com/roak/p/16261702.html,部分代码作了修正。

1.pom.xml

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

2.代码

2.1 email实体类

@Data
public class EmailDto {
    /**
     * SMTP主机名
     */
    private String serverName;

    /**
     * 主机端口号
     */
    private String port;

    /**
     * 用户名
     */
    private String userName;

    /**
     * 密码
     */
    private String password;

    private String senderName;

    /**
     * 发件人
     */
    private String emailAddress;

    /**
     * 邮件主题
     */
    private String subject;

    /**
     * 收件人(多个收件人之间以;隔开)
     */
    private String to;

    /**
     * 抄送人(多个抄送人之间以;隔开)
     */
    private String cC;

    /**
     * 邮件正文
     */
    private String content;

    @Override
    public String toString() {
        return JSONObject.toJSONString(this);
    }
}

2.2邮件发送

public class MailUtils {

    /**
     * 发送邮件(不带附件)
     * @param emailDto  email配置信息
     */
	public static void sendMailWithoutFile(EmailDto emailDto) {
        sendMail(emailDto, new JSONArray());
    }
    
	/**
     * 发送邮件(带附件)
     * @param emailDto email配置信息
     * @param filePath  本地附件地址
     */
    public static void sendMail(EmailDto emailDto, JSONArray filePath) {
        Transport transport = null;
        try {
            Properties prop = new Properties();
            prop.setProperty("mail.host", emailDto.getServerName());  //邮箱发送
            prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
            prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码
            //1、创建定义整个应用程序所需的环境信息的 Session 对象
            Session session = Session.getDefaultInstance(prop, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    //传入发件人的姓名和授权码
                    return new PasswordAuthentication(emailDto.getUserName(), emailDto.getPassword());
                }
            });
            //2、通过session获取transport对象
            transport = session.getTransport();
            //3、通过transport对象邮箱用户名和授权码连接邮箱服务器
            transport.connect(emailDto.getServerName(), emailDto.getUserName(), emailDto.getPassword());
            //4、创建邮件,传入session对象
            MimeMessage mimeMessage = getMimeMessage(session, emailDto, filePath);
            //5、发送邮件
            transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (transport != null) {
                try {
                    transport.close();
                } catch (MessagingException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 组装发送信息
     * @param session session
     * @param emailDto 邮件配置信息
     * @param filesPath 本地地址
     * @return MimeMessage
     * @throws Exception  Exception
     */
    private static MimeMessage getMimeMessage(Session session, EmailDto emailDto, JSONArray filesPath) throws Exception {
        //消息的固定信息
        MimeMessage mimeMessage = new MimeMessage(session);
        //发件人
        mimeMessage.setFrom(new InternetAddress(emailDto.getEmailAddress()));
        //收件人
        if (StringUtils.isNotBlank(emailDto.getTo())) {
            String[] tos = emailDto.getTo().split(";");
            InternetAddress[] toAddrs = new InternetAddress[tos.length];
            for (int i = 0; i < tos.length; i++) {
                toAddrs[i] = new InternetAddress(tos[i]);
            }
            mimeMessage.setRecipients(Message.RecipientType.TO, toAddrs);
        }else{
            throw new ServiceException("收件人不能为空!");
        }
        //抄送人
        if (StringUtils.isNotBlank(emailDto.getCC())) {
            String[] ccs = emailDto.getCC().split(";");
            InternetAddress[] ccAddrs = new InternetAddress[ccs.length];
            for (int i = 0; i < ccs.length; i++) {
                ccAddrs[i] = new InternetAddress(ccs[i]);
            }
            mimeMessage.setRecipients(Message.RecipientType.CC, ccAddrs);
        }
        //邮件标题
        mimeMessage.setSubject(StringUtils.isNotBlank(emailDto.getSubject().trim()) ? emailDto.getSubject() : "无主题");
        MimeMultipart multipart = new MimeMultipart();
        //附件
        for (Object pathObj : filesPath) {
            MimeBodyPart attachPart = new MimeBodyPart();
            File file = new File((String) pathObj);
            attachPart.setDataHandler(new DataHandler(new FileDataSource(file)));
            //避免中文乱码的处理
            attachPart.setFileName(MimeUtility.encodeWord(file.getName()));
            multipart.addBodyPart(attachPart);//附件
        }
        //正文
        MimeBodyPart contentPart = new MimeBodyPart();
        contentPart.setContent(emailDto.getContent(), "text/html;charset=utf-8");
        multipart.addBodyPart(contentPart);
        multipart.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed
        //放到Message消息中
        mimeMessage.setContent(multipart);
        mimeMessage.saveChanges();//保存修改
        return mimeMessage;
    }
}

2.3 测试代码(以163邮箱为例)

public static void main(String[] args) {
	EmailDto emailDto = new EmailDto();
	//邮件服务器,不同邮箱对应修改
	emailDto.setSenderName("smtp.163.com");
    emailDto.setPassword("25");
    //发件人邮箱
    emailDto.setUserName("xxx@163.com");
    //激活POP3/SMTP服务的授权码,具体获取方式参考 https://zhuanlan.zhihu.com/p/551399559?utm_id=0
    emailDto.setPassword("xxx");
    emailDto.setEmailAddress("xxx@163.com");
    emailDto.setTo("xxx;");
    emailDto.setCC("xxx;xxx;");
    emailDto.setSubject("testSubject.....");
    emailDto.setContent("testContent....." );
    //普通邮件发送(不带附件)
    MailUtils.sendMailWithoutFile(emailDto);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值