一、需要做一些准备工作
- 需要有一个邮箱账号咯(废话文学~)
- 进入邮箱找到如图的POP3/SMTP/IMAP选项>>>新增授权密码>>>使用手机扫码完成操作后获得授权码(授权码只显示一次)
- 准备好了SMTP需要使用的信息后,将JavaMail相关依赖Jar包加入至当前项目
- 以上准备工作准备完成就可以敲代码了
邮箱账号信息
//写入邮箱账号信息
String userName = "1566*******@163.com";//自己的邮箱账号
String password = "FHT********IYLTH";//获得的授权码
SMTP服务器连接信息
//SMTP服务器连接信息
Properties properties = new Properties();
properties.put("mail.smtp.host", "smtp.163.com");//SMTP主机名
properties.put("mail.smtp.port", "25");//主机端口号
properties.put("mail.smtp.auth", "true");//是否需要用户认证
properties.put("mail.smtp.starttls.enable", "true");//是否启用TLS加密
常用的邮件服务商的SMTP信息:
- QQ邮箱:SMTP服务器是smtp.qq.com,端口是465/587
- 163邮箱:SMTP服务器是smtp.163.com,端口是465
- Gmail邮箱:SMTP服务器是smtp.gmail.com,端口是465/587
//创建Session会话 //参数1:STMP服务器连接参数 //参数2:账号和和授权码的认证对象 Session session = Session.getInstance(properties,new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { //也可以将账号授权码参数写在这里 return new PasswordAuthentication(userName, password); } });
二、在正式发送邮件时还得构造一个Message对象,然后调用方法完成发送
//message对象 MimeMessage message = new MimeMessage(session); //发送信息 //设置发送方地址 message.setFrom(new InternetAddress("156*******1@163.com")); //设置接受方地址 message.setRecipient(RecipientType.TO, new InternetAddress("6*****678@qq.com")); //此处为抄送类似于发送多人 message.setRecipients(RecipientType.CC, new InternetAddress[]{new InternetAddress("2*****7670@qq.com")}); //发送内容 message.setSubject("测试邮件");//邮件标题 //<b></b>标签为加粗中间内容 //类似的HTML字符串标签都可以显示效果 message.setText("<b>麻袋蛋</b>吃人","utf-8","html");//邮件正文 Transport.send(message);//发送邮件
三、除此之外,使用Java语言发送邮件也可以携带附件
- 不能再是由message.getText方法,而是要构造一个Multipart对象
//创建Multipart对象 Multipart multipart = new MimeMultipart(); //添加正文部分 BodyPart textPart = new MimeBodyPart(); textPart.setContent("啦啦<b>啦</b>啦啦啦","text/html;charset=utf-8"); multipart.addBodyPart(textPart); //添加附件部分 BodyPart filePart = new MimeBodyPart(); filePart.setFileName("略略略略");//附件文件显示名字 //上传附件 filePart.setDataHandler(new DataHandler( new ByteArrayDataSource( Files.readAllBytes(Paths.get("D:\\3yue\\qq.png")),//本地文件地址 "application/octet-stream")));//二进制文件MIME类型 multipart.addBodyPart(filePart); //将Multipart对象放入邮件 message.setContent(multipart); //发送邮件 Transport.send(message);
- 二进制文件MIME类型 application/octet-stream
- Word文档则是application/msword
四、发送一个内嵌图片的HTML邮件
- 内嵌的图片可以直接在邮件中显示不必下载也不会有格式不对的问题
- 内嵌图片也是以一个附件的形式嵌入邮件只需要在上面代码的基础上添加内嵌图片部分
- 对文字部分做一些改动
//创建Multipart对象 Multipart multipart = new MimeMultipart(); //添加正文部分 BodyPart textPart = new MimeBodyPart(); //使用StringBuilder拼接以下内容 StringBuilder contentText = new StringBuilder(); contentText.append("<h3>验证码</h3>");//标题 contentText.append("<p>123</p>");//正文 //与下文ID对应才可以正常显示内嵌图片 contentText.append("<img src=\"cid:YZM\"/>"); textPart.setContent(contentText.toString(),"text/html;charset=utf-8");//格式 multipart.addBodyPart(textPart); //添加内嵌图片部分 BodyPart imagePart = new MimeBodyPart(); imagePart.setDataHandler(new DataHandler( new ByteArrayDataSource( Files.readAllBytes(Paths.get("D:\\3yue\\jdbc.jpg")),//添加本地图片的地址 "application/octet-stream"))); imagePart.setHeader("content-ID","YZM");//此处ID与上文对应 multipart.addBodyPart(imagePart); //将Multipart对象放入邮件 message.setContent(multipart); //发送邮件 Transport.send(message);
五、知识补充
- 邮箱的服务地址有主要有三种:POP3、SMTP、IMAP 本文以SMTP作为例子。
- MUA:Mail User Agent---给用户服务的邮件代理
- MTA:Mail Transfer Agent---邮件中转的代理
- MDA:Mail Delivery Agent---邮件到达的代理
- MUA到MTA发送邮件的协议就是SMTP协议,它建立在TCP之上的协议