在实际应用中经常会使用发送邮件的功能,由于项目的需要,需要使用固定的邮箱收集意见反馈信息,通过查阅资、
源,整合称了如下的发送邮件的demo ,此demo这是单独的从特定的邮箱发送到特定的邮箱的例子,如果需要根据发送
不同的邮箱地址,则可以在封装工具类中修改对应的代码即可,在测试之前你需要下载好javamail相关的2个jar包activation.jar和
mail.jar 。
1、邮件发送的核心类,注意如果是使用gmail发送邮件则必须添加这句代码,否则发送不能成功
props.put("mail.smtp.starttls.enable", "true");
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
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;
public class Mail {
private MimeMessage mimeMsg; // MIME邮件对象
private Session session; // 邮件会话对象
private Properties props; // 系统属性
private boolean needAuth = false; // smtp是否需要认证
// smtp认证用户名和密码
private String username;
private String password;
private Multipart mp; // Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象
/**
* Constructor
*
* @param smtp
* 邮件发送服务器
*/
public Mail(String smtp) {
setSmtpHost(smtp);
createMimeMessage();
}
/**
* 设置邮件发送服务器
*
* @param hostName
* String
*/
public void setSmtpHost(String hostName) {
System.out.println("设置系统属性:mail.smtp.host = " + hostName);
if (props == null)
props = System.getProperties(); // 获得系统属性对象
props.put("mail.smtp.host", hostName); // 设置SMTP主机
props.put("mail.smtp.starttls.enable", "true"); // 在本行添加 ,gmail邮箱必须要设置
}
/**
* 创建MIME邮件对象
*
* @return
*/
public boolean createMimeMessage() {
try {
System.out.println("准备获取邮件会话对象!");
session = Session.getDefaultInstance(props, null); // 获得邮件会话对象
} catch (Exception e) {
System.err.println("获取邮件会话对象时发生错误!" + e);
return false;
}
System.out.println("准备创建MIME邮件对象!");
try {
mimeMsg = new MimeMessage(session); // 创建MIME邮件对象
mp = new MimeMultipart();
return true;
} catch (Exception e) {
System.err.println("创建MIME邮件对象失败!" + e);
return false;
}
}
/**
* 设置SMTP是否需要验证
*
* @param need
*/
public void setNeedAuth(boolean need) {
System.out.println("设置smtp身份认证:mail.smtp.auth = " + need);
if (props == null)
props = System.getProperties();
if (need) {
props.put("mail.smtp.auth", "true");
} else {
props.put("mail.smtp.auth", "false");
}
}
/**
* 设置用户名和密码
*
* @param name
* @param pass
*/
public void setNamePass(String name, String pass) {
username = name;
password = pass;
}
/**
* 设置邮件主题
*
* @param mailSubject
* @return
*/
public boolean setSubject(String mailSubject) {
System.out.println("设置邮件主题!");
try {
mimeMsg.setSubject(mailSubject);
return true;
} catch (Exception e) {
System.err.println("设置邮件主题发生错误!");
return false;
}
}
/**
* 设置邮件正文
*
* @param mailBody
* String
*/
public boolean setBody(String mailBody) {
try {
BodyPart bp = new MimeBodyPart();
bp.setContent("" + mailBody, "text/html;charset=GBK");
mp.addBodyPart(bp);
return true;
} catch (Exception e) {
System.err.println("设置邮件正文时发生错误!" + e);
return false;
}
}
/**
* 添加附件
*
* @param filename
* String
*/
public boolean addFileAffix(String filename) {
System.out.println("增加邮件附件:" + filename);
try {
BodyPart bp = new MimeBodyPart();
FileDataSource fileds = new FileDataSource(filename);
bp.setDataHandler(new DataHandler(fileds));
bp.setFileName(fileds.getName());
mp.addBodyPart(bp);
return true;
} catch (Exception e) {
System.err.println("增加邮件附件:" + filename + "发生错误!" + e);
return false;
}
}
/**
* 设置发信人
*
* @param from
* String
*/
public boolean setFrom(String from) {
System.out.println("设置发信人!");
try {
mimeMsg.setFrom(new InternetAddress(from)); // 设置发信人
return true;
} catch (Exception e) {
return false;
}
}
/**
* 设置收信人
*
* @param to
* String
*/
public boolean setTo(String to) {
if (to == null)
return false;
try {
mimeMsg.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
return true;
} catch (Exception e) {
return false;
}
}
/**
* 设置抄送人
*
* @param copyto
* String
*/
public boolean setCopyTo(String copyto) {
if (copyto == null)
return false;
try {
mimeMsg.setRecipients(Message.RecipientType.CC,
(Address[]) InternetAddress.parse(copyto));
return true;
} catch (Exception e) {
return false;
}
}
/**
* 发送邮件
*/
public boolean sendOut() {
try {
mimeMsg.setContent(mp);
mimeMsg.saveChanges();
System.out.println("正在发送邮件....");
Session mailSession = Session.getInstance(props, null);
Transport transport = mailSession.getTransport("smtp");
transport.connect((String) props.get("mail.smtp.host"), username,
password);
transport.sendMessage(mimeMsg,
mimeMsg.getRecipients(Message.RecipientType.TO));
transport.sendMessage(mimeMsg,
mimeMsg.getRecipients(Message.RecipientType.CC));
// transport.send(mimeMsg);
System.out.println("发送邮件成功!");
transport.close();
return true;
} catch (Exception e) {
System.err.println("邮件发送失败!" + e);
return false;
}
}
/**
* 调用sendOut方法完成邮件发送
*
* @param smtp
* @param from
* @param to
* @param subject
* @param content
* @param username
* @param password
* @return boolean
*/
public static boolean send(String smtp, String from, String to,
String subject, String content, String username, String password) {
Mail theMail = new Mail(smtp);
theMail.setNeedAuth(true); // 需要验证
if (!theMail.setSubject(subject))
return false;
if (!theMail.setBody(content))
return false;
if (!theMail.setTo(to))
return false;
if (!theMail.setFrom(from))
return false;
theMail.setNamePass(username, password);
if (!theMail.sendOut())
return false;
return true;
}
/**
* 调用sendOut方法完成邮件发送,带抄送
*
* @param smtp
* @param from
* @param to
* @param copyto
* @param subject
* @param content
* @param username
* @param password
* @return boolean
*/
public static boolean sendAndCc(String smtp, String from, String to,
String copyto, String subject, String content, String username,
String password) {
Mail theMail = new Mail(smtp);
theMail.setNeedAuth(true); // 需要验证
if (!theMail.setSubject(subject))
return false;
if (!theMail.setBody(content))
return false;
if (!theMail.setTo(to))
return false;
if (!theMail.setCopyTo(copyto))
return false;
if (!theMail.setFrom(from))
return false;
theMail.setNamePass(username, password);
if (!theMail.sendOut())
return false;
return true;
}
/**
* 调用sendOut方法完成邮件发送,带附件
*
* @param smtp
* @param from
* @param to
* @param subject
* @param content
* @param username
* @param password
* @param filename
* 附件路径
* @return
*/
public static boolean send(String smtp, String from, String to,
String subject, String content, String username, String password,
String filename) {
Mail theMail = new Mail(smtp);
theMail.setNeedAuth(true); // 需要验证
if (!theMail.setSubject(subject))
return false;
if (!theMail.setBody(content))
return false;
if (!theMail.addFileAffix(filename))
return false;
if (!theMail.setTo(to))
return false;
if (!theMail.setFrom(from))
return false;
theMail.setNamePass(username, password);
if (!theMail.sendOut())
return false;
return true;
}
/**
* 调用sendOut方法完成邮件发送,带附件和抄送
*
* @param smtp
* @param from
* @param to
* @param copyto
* @param subject
* @param content
* @param username
* @param password
* @param filename
* @return
*/
public static boolean sendAndCc(String smtp, String from, String to,
String copyto, String subject, String content, String username,
String password, String filename) {
Mail theMail = new Mail(smtp);
theMail.setNeedAuth(true); // 需要验证
if (!theMail.setSubject(subject))
return false;
if (!theMail.setBody(content))
return false;
if (!theMail.addFileAffix(filename))
return false;
if (!theMail.setTo(to))
return false;
if (!theMail.setCopyTo(copyto))
return false;
if (!theMail.setFrom(from))
return false;
theMail.setNamePass(username, password);
if (!theMail.sendOut())
return false;
return true;
}
}
2、封装邮件发送工具类,其中MailInfoCfg.SMTP_SERVER_HOST是smtp服务器地址,常用的有如下
gmail:smtp.gmail.com
qq邮箱:smtp.qq.com
163邮箱:smpt.163.com
import com.uwen.halo.cfg.MailInfoCfg;
import com.uwen.halo.data.email.Mail;
import com.uwen.halo.data.email.MailSenderInfo;
import com.uwen.halo.data.email.SimpleMailSender;
/**
* send email util
* @author user
*
*/
public class EmailSendUtil {
/**
* send email
* @param subject subject value is from MailInfoCfg.getSubject();
* @param mailContent
*/
public static void sendEmail(String subject ,String mailContent){
String smtp = MailInfoCfg.SMTP_SERVER_HOST;
String from = MailInfoCfg.FROM_EMAIL_ADDRESS;
String to = MailInfoCfg.TO_EMAIL_ADDRESS;
String copyto = MailInfoCfg.COPT_TO_EMAIL_ADDRESS;
String username = MailInfoCfg.FROM_EMAIL_ADDRESS;
String password = MailInfoCfg.FROM_EMAIL_PASSWORD;
Mail.sendAndCc(smtp, from, to, copyto, subject, mailContent, username,password);
}
}
3、调用
在需要调用的逻辑中使用最好是单独开启一个线程来调用,如下
public void send(){
String subject = ""这是一封测试的邮件;;
String content = "这是测试的内容"
new Thread(new Runnable() {
@Override
public void run() {
EmailSendUtil.sendEmail(subject ,content) ;
}
}).start();
}