java--邮件发送

1、什么是授权码?

授权码是QQ邮箱推出的,用于登录第三方客户端的专用密码。
适用于登录以下服务:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。
温馨提醒:为了你的帐户安全,更改QQ密码以及独立密码会触发授权码过期,需要重新获取新的授权码登录。
 
2、怎么获取授权码?
先进入设置-》帐户页面找到入口,按照以下流程操作。
(1)点击“开启”
(2)验证密保
(3)获取授权码
3、引入依赖的jia包
在第三方客户端的密码框里面输入16位授权码进行验证。
<dependency>
      <groupId>javax.mail</groupId>
      <artifactId>mail</artifactId>
      <version>1.4.7</version>
</dependency>

4、定义邮件发送模板

import lombok.Data;

import java.io.Serializable;

@Data
public class EmailTemplate implements Serializable {
    //发件人
    private String fromAddress;
    // 收件人(多个地址用逗号分隔)
    private String toAddress;
    // 抄送人(多个地址用逗号分隔)
    private String ccAddress;
    // 密送人(多个地址用逗号分隔)
    private String bccAddress;
    // 附件信息(暂不支持)
    //    private List<EmailAttachment> attachments;
    // 邮件主题
    private String subject;
    // 邮件的文本内容
    private String content;
}

5、发送邮件工具类(单独线程)

import com.demo.model.EmailTemplate;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

public class SendMail extends Thread {

    //用于给用户发送邮件的邮箱
    private String emailFrom = "xxxxxx@qq.com";
    //邮箱授权码(修改密码会导致授权码过期)
    private String authKey = "上面获取的16位授权码";
    //发送邮件的服务器地址
    private String smtpHost = "smtp.qq.com";

    private EmailTemplate emailTemplate;

    public SendMail(EmailTemplate emailTemplate) {
        this.emailTemplate = emailTemplate;
    }

    //重写run方法的实现,在run方法中发送邮件给指定的用户
    @Override
    public void run() {
        try {
            Properties prop = new Properties();
            prop.setProperty("mail.smtp.host", smtpHost);
            prop.setProperty("mail.transport.protocol", "smtp");
            prop.setProperty("mail.smtp.auth", "true");

            // 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            prop.put("mail.smtp.ssl.enable", "true");
            prop.put("mail.smtp.ssl.socketFactory", sf);

            //1、创建定义整个应用程序所需的环境信息的 Session 对象
            Session session = Session.getDefaultInstance(prop, new Authenticator() {
                public PasswordAuthentication getPasswordAuthentication() {
                    //发件人邮件用户名、授权码
                    return new PasswordAuthentication(emailFrom, authKey);
                }
            });

            //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
//            session.setDebug(true);

            //2、通过session得到transport对象
            Transport ts = session.getTransport();

            //3、使用邮箱的用户名和授权码连上邮件服务器
            ts.connect(smtpHost, emailFrom, authKey);

            //4、创建邮件
            MimeMessage message = new MimeMessage(session);
            //发件人
            message.setFrom(new InternetAddress(emailFrom));
            //收件人
            if (emailTemplate.getToAddress() != null) {
                message.setRecipients(Message.RecipientType.TO,
                        InternetAddress.parse(emailTemplate.getToAddress()));
            }
            //抄送人
            if (emailTemplate.getCcAddress() != null) {
                message.setRecipients(Message.RecipientType.CC,
                        InternetAddress.parse(emailTemplate.getCcAddress()));
            }
            //密送人
            if (emailTemplate.getBccAddress() != null) {
                message.setRecipients(Message.RecipientType.BCC,
                        InternetAddress.parse(emailTemplate.getBccAddress()));
            }
            //邮件的标题
            message.setSubject(emailTemplate.getSubject(),"UTF-8");

            message.setContent(emailTemplate.getContent(), "text/html;charset=UTF-8");
            message.saveChanges();

            //发送邮件
            ts.sendMessage(message, message.getAllRecipients());
            ts.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}

6、编写测试类

    public static void main(String[] args) throws InterruptedException {
        EmailTemplate template=new EmailTemplate();
        template.setToAddress("yyyy@163.com");
        template.setSubject("邮件测试2");
        template.setContent("详细信息:<a href='http://www.baidu.com'>http://www.baidu.com</a>");
        SendMail sendMail=new SendMail(template);
        sendMail.start();
        Thread.sleep(2000);
    }

 

 

posted @ 2020-03-16 09:23  11014p  阅读(285)  评论(0编辑  收藏  举报