java_邮件
2021-05-13 12:28
标签:this add setfile line 描述 esc cti class 部分 导包:activation.jar、mail.jar 1、测试代码:(这里使用的是QQ邮箱主机) 2、邮件工具: 测试: java_邮件 标签:this add setfile line 描述 esc cti class 部分 原文地址:https://www.cnblogs.com/canzhen/p/13087805.htmlpackage com.canzhen.demo.simple;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
public class SimpleEmail {
public static void main(String[] args) {
// 收件人电子邮箱
String to = "XXX@qq.com";
// 发件人电子邮箱
String from = "XXX@qq.com";
// 指定发送邮件的服务器为 QQ邮箱主机
String host = "smtp.qq.com";
// 获取系统属性
Properties properties = System.getProperties();
// 设置邮件服务器
properties.setProperty("mail.smtp.host", host);
//设置是否认证
properties.put("mail.smtp.auth", "true");
//认证
Authenticator authenticator = new Authenticator(){
public PasswordAuthentication getPasswordAuthentication()
{
//发件人邮件用户名、授权码(使用第三方时需要提供授权码,而不是密码)
return new PasswordAuthentication("XXX@qq.com", "XXX");
}
};
// 获取默认session对象
Session session = Session.getDefaultInstance(properties,authenticator);
try{
// 创建默认的 MimeMessage 对象
MimeMessage message = new MimeMessage(session);
// Set From: 发件人,头部头字段
message.setFrom(new InternetAddress(from));
// Set To: 收件人,头部头字段,单发
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
//多发
// void addRecipients(Message.RecipientType type,
// Address[] addresses)
//throws MessagingException
// 下面是对于参数的描述:
//
//type:要被设置为 TO, CC 或者 BCC,这里 CC 代表抄送、BCC 代表秘密抄送。举例:Message.RecipientType.TO
//
//addresses: 这是 email ID 的数组。在指定电子邮件 ID 时,你将需要使用 InternetAddress() 方法。
// Set Subject: 主题,头部头字段
message.setSubject("This is the Subject Line!");
// 设置消息体,邮件内容
//setText进入源码,可以看到底层调用setContent,而setContent会new一个DataHandler,所以会覆盖掉之前的setContent
// message.setText("This is actual message");
// 发送 HTML 消息, 可以插入html标签
// message.setContent("
This is actual message
",
// "text/html" );
//发送带有附件的 E-mail
// 创建文本消息部分
BodyPart messageBodyPart = new MimeBodyPart();
// 消息
messageBodyPart.setText("This is message body");
// 创建多重消息
Multipart multipart = new MimeMultipart();
// 设置文本消息部分
multipart.addBodyPart(messageBodyPart);
// 创建附件部分
messageBodyPart = new MimeBodyPart();
String filename = "E:\\桌面壁纸\\哈哈.png";
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
//就只这行可以防止文件名乱码
String newFileName = MimeUtility.encodeText(source.getName(),"utf-8",null);
messageBodyPart.setFileName(newFileName);
multipart.addBodyPart(messageBodyPart);
// 发送完整消息
message.setContent(multipart );
// 发送消息
Transport.send(message);
System.out.println("Sent message successfully....");
}catch (MessagingException | UnsupportedEncodingException mex) {
mex.printStackTrace();
}
}
}package com.canzhen.demo.util;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
public class MultiEmailUtil {
private Properties props;//用来存储一些邮件的属性,设置几个等待时间什么的。
private String[] params = new String[2];//用来存储发件人和授权码
/**
* @param transportType 邮件发送方式
* @param serviceType 服务器类型
* @param servicePort 服务器端口号
* @param fromEMail 发件人
* @param authPassword 授权码
*/
public MultiEmailUtil(String transportType,String serviceType,String servicePort,String fromEMail ,String authPassword)
{
// // 获取默认的 Session 对象。
// 1.创建一个程序与邮件服务器会话对象 Session
Properties tProps = new Properties();
tProps.put("mail.transport.protocol", transportType);
tProps.put("mail.smtp.host",serviceType );//smtp.exmail.qq.com 这个例子是qq的企业邮箱的服务器
tProps.put("mail.smtp.port", servicePort);//一般默认都是 25
// 指定验证为true
tProps.setProperty("mail.smtp.auth", "true");
// props.setProperty("mail.smtp.timeout","1000");
tProps.put("mail.smtp.timeout", 100000);//这几个参数很有必要
tProps.put("mail.smtp.connectiontimeout", 100000);//这几个参数很有必要
tProps.put("mail.smtp.writetimeout",100000);//这几个参数很有必要
props = (Properties) tProps.clone();
params[0]=fromEMail;//如果可以最好弄一个加密的方式
params[1]=authPassword;//如果可以最好弄一个加密的方式
}
/***
*
* @param mailTO 收件人集合,这个不可以为空,哈哈哈
* @param mailCC 抄送人集合,可以传null,若果是null就当做没有抄送
* @param contentTop 邮件标题,可以传null,默认值是 "您有,一封邮件待查收"
* @param contentText 邮件正文,可以传null,默认值是 "各位好:"
* @param fileName 附件的绝对地址,可以传null,如果是null就默认当做不添加附件
*/
public boolean sendEmail(String[] mailTO,String[] mailCC,String contentTop,String contentText,String fileName)
{
//收件人不能是空
if (mailTO == null || mailTO.length == 0)
return false;
// 认证
Authenticator auth = new Authenticator() {
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(params[0], params[1]);
}
};
Session session = Session.getInstance(props, auth);//居然发现了一个final的类,和String一样,哈哈
try{
// 创建默认的 MimeMessage 对象。
MimeMessage message = new MimeMessage(session);
// Set From: 发件人,头部头字段
message.setFrom(new InternetAddress(params[0]));
Address addressesTO[] = new Address[mailTO.length];
//循环收件人
for (int i = 0; i )
{
addressesTO[i] = (Address) new InternetAddress(mailTO[i]).clone();
}
message.addRecipients(Message.RecipientType.TO,addressesTO);//设置收件人
//对抄送人进行处理
if( ! (mailCC == null|| mailCC.length == 0)) {
Address addressesCC[] = new Address[mailCC.length];
//循环抄送人
for (int i = 0; i )
{
addressesCC[i] = (Address) new InternetAddress(mailCC[i]).clone();
}
message.addRecipients(Message.RecipientType.CC, addressesCC);//设置抄送人
}
// Set Subject: 头字段
if(contentTop == null || contentTop.equals(""))
{
message.setSubject("您有,一封邮件待查收");
}else {
message.setSubject(contentTop);
}
// 创建消息部分
BodyPart messageBodyPart = new MimeBodyPart();
// 消息
if(contentText == null || contentText.equals("")){
messageBodyPart.setText("各位好:");
}else{
messageBodyPart.setText(contentText);
}
// 创建多重消息
Multipart multipart = new MimeMultipart();
// 设置文本消息部分
multipart.addBodyPart(messageBodyPart);
// String tFileName = fileName;
//目前没有对目录做校验,后续再添加吧
if (!( fileName == null || fileName.equals(""))){
// 附件部分
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(fileName);
messageBodyPart.setDataHandler(new DataHandler(source));
//就只这行可以防止乱码
String newFileName = MimeUtility.encodeText(source.getName(),"utf-8",null);
messageBodyPart.setFileName(newFileName);
multipart.addBodyPart(messageBodyPart);
}
// 发送完整消息
message.setContent(multipart,"text/html;charset=utf-8");
// 发送消息
Transport.send(message);
System.out.println("Sent message successfully....");
}catch (MessagingException | UnsupportedEncodingException mex) {
mex.printStackTrace();
}
return true;
}
}
package com.canzhen.demo.test;
import com.canzhen.demo.util.MultiEmailUtil;
public class UtilTest {
public static void main(String[] args) {
String[] mailTO = {"XXX@qq.com"};//收件人
String[] mailCC = {"XXX@qq.com"};//抄送人
String contentTop = "这是一个邮件的题目";
String contentText = "这是这个邮件的正文";
String fileName = "E:\\桌面壁纸\\哈哈.png";//如果有附件的话这填写地址
new MultiEmailUtil("SMTP","smtp.qq.com","25","XXX@qq.com",
"XXX").sendEmail(mailTO,mailCC,contentTop,contentText,fileName);
}
}