您的位置:首页 > 编程语言 > Java开发

javamail 邮件发送、带格式、已保存

2018-01-29 16:52 288 查看
最近工作中用需要发送邮件,一脸懵的我开始各种百度。闲言少叙,开始我的第一个邮件发送吧。

本实例目标:发送一封/多封邮件,并将邮件保存到已发送内。

1.简单邮件发送:

1.1准备jar包:javamail

百度网盘:https://pan.baidu.com/s/1kVTdVWN

官网下载地址:https://github.com/javaee/javamail/releases

1.2 编写代码

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;

import javax.mail.AuthenticationFailedException;
import javax.mail.Flags.Flag;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.sun.mail.smtp.SMTPAddressFailedException;

import oa.common.Result;

public class SendMail {
private static String get = "imap";//类型
private static String imapmailServer = "mail.xxx.com.cn";//服务器类型
private static String username = null;//发件人邮箱
private static String password = null;//发件人密码
private static String requestMail = null;//收件人邮箱
private static Transport transport = null;// 邮件链接
private static Session session = null;// 邮件会话
private static String title = null;// 标题
private static String content = null;// 内容

public static void main(String[] args) throws MessagingException, UnsupportedEncodingException {
SendMail mail = new SendMail();

}

/**
* 发送邮件
* @param username
* @param password
* @param title
* @param content
* @param requestMail
* @return
*/
public  Result sendMail(String username, String password, String requestMail, String title, String content) {
Result result = null;
if (Tools.isNull(username) || Tools.isNull(password) || Tools.isNull(title) || Tools.isNull(content) || Tools.isNull(requestMail)) {
result = new Result(false, "username/password/title/content/requestMail 不能为空!");
return result;
}
setUsername(username);
setPassword(password);
setRequestMail(requestMail);
setTitle(title);
setContent(content);

// 3. 创建一封邮件
MimeMessage message;
try {
// 获得会话
getTransport();
message = createMimeMessage(username, requestMail);

// 6. 发送邮件, 发到所有的收件地址,
// message.getAllRecipients()获取到的是在创建邮件对象时添加的所有收件人,抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
System.out.println("发送成功...");
result = new Result(true, requestMail + "发送成功!");

result = saveEmailToSentMailFolder(message);
System.out.println("发送保存成功...");
result.setMessage(result.getMessage() + ";" + "保存成功!");
} catch (AuthenticationFailedException e) {
System.err.println(e.getMessage());
result = new Result(false, "发件人有户名密码错误:" + username + " pwd:" + password);
} catch (SMTPAddressFailedException e) {
System.err.println(e.getMessage());
result = new Result(false, "收件人邮箱错误请检查:" + e.getMessage());
} catch (UnsupportedEncodingException e) {
result = new Result(false, requestMail + "邮件发送失败!" + e.getMessage());
e.printStackTrace();
} catch (MessagingException e) {
result = new Result(false, requestMail + "邮件发送失败!" + e.getMessage());
e.printStackTrace();
}
return result;
}

/**
* 邮件内容
* @param sendMail  发件人邮箱
* @param receiveMail   收件人邮箱
* @return
* @throws UnsupportedEncodingException
* @throws MessagingException
*/
private static MimeMessage createMimeMessage(String sendMail, String receiveMail) throws Unsupport
4000
edEncodingException, MessagingException {
// 1. 创建一封邮件
MimeMessage message = new MimeMessage(session);

// 2. From: 发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称)
message.setFrom(new InternetAddress(sendMail, "我是发件人昵称", "UTF-8"));

// 3. To: 收件人(可以增加多个收件人、抄送、密送)
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "我是收件人昵称", "UTF-8"));

// 3.1 To: 多个收件人(可以增加多个收件人、抄送、密送)
// InternetAddress[] addresses = new InternetAddress[2];
// addresses[0] = new InternetAddress("xxx02@163.com", "00用户", "UTF-8");
// addresses[1] = new InternetAddress("xxx01@163.com", "01用户",
// "UTF-8");
// message.setRecipients(MimeMessage.RecipientType.TO, addresses);

// 4. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
message.setSubject(title, "UTF-8");

// 5. Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
message.setContent(content, "text/html;charset=UTF-8");

// 6. 设置发件时间
message.setSentDate(new Date());

// 7. 保存设置
message.saveChanges();

return message;

}

/**
* 获取发邮件邮箱
* @return
* @throws MessagingException
*/
private static Folder getSentMailFolder() throws MessagingException {
Properties props = new Properties(); // 参数配置
// 准备连接服务器的会话信息
props.setProperty("mail.store.protocol", "imap");
props.setProperty("mail.imap.host", imapmailServer);
props.setProperty("mail.imap.port", "143");

// 创建Session实例对象
Session session = Session.getInstance(props);
// 创建IMAP协议的Store对象
Store store = session.getStore("imap");
// 连接邮件服务器
store.connect(username, password);
// 获得收件箱--如果不是“已发送”可以先输出看一下;此方法也可用于查看邮件。
// Folder folder = store.getFolder("INBOX");
// Folder defaultFolder = store.getDefaultFolder();
// Folder[] allFolder = defaultFolder.list();
// for (Folder folder : allFolder) {
// System.out.println(folder);
// }
// 以读写模式打开发件箱
Folder folder = store.getFolder("已发送");
folder.open(Folder.READ_WRITE);

// 获得收件箱的邮件列表
// Message[] messages = folder.getMessages();
//
// // 打印不同状态的邮件数量
// System.out.println("收件箱中共" + messages.length + "封邮件!");
// System.out.println("收件箱中共" + folder.getUnreadMessageCount() +
// "封未读邮件!");
// System.out.println("收件箱中共" + folder.getNewMessageCount() + "封新邮件!");
// System.out.println("收件箱中共" + folder.getDeletedMessageCount() +
// "封已删除邮件!");

return folder;
}

/**
* 保存邮件到发件箱
*
* @param message
*            邮件信息
*/
private static Result saveEmailToSentMailFolder(Message message) {
Result result = new Result(true,"保存到发件箱成功!");
Store store = null;
Folder sentFolder = null;
try {
sentFolder = getSentMailFolder();
message.setFlag(Flag.SEEN, true); // 设置已读标志
sentFolder.appendMessages(new Message[] { message });

System.out.println("已保存到发件箱...");
} catch (Exception e) {
result = new Result(false, "保存到已发送邮箱错误:" + e.getMessage());
e.printStackTrace();
} finally {

// 判断发件文件夹是否打开如果打开则将其关闭
if (sentFolder != null && sentFolder.isOpen()) {
try {
sentFolder.close(true);
} catch (MessagingException e) {
e.printStackTrace();
}
}
// 判断邮箱存储是否打开如果打开则将其关闭
if (store != null && store.isConnected()) {
try {
store.close();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
return result;
}

public static String getUsername() {
return username;
}

public static void setUsername(String username) {
SendMail.username = username;
}

public static String getPassword() {
return password;
}

public static void setPassword(String password) {
SendMail.password = password;
}

public static String getRequestMail() {
return requestMail;
}

public static void setRequestMail(String requestMail) {
SendMail.requestMail = requestMail;
}

public static Transport getTransport() throws MessagingException {
// 1. 创建参数配置, 用于连接邮件服务器的参数配置
Properties props = new Properties(); // 参数配置
props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host", imapmailServer); // 发件人的邮箱的SMTP服务器地址
props.setProperty("mail.smtp.auth", "true"); // 需要请求认证
// 2. 根据配置创建会话对象, 用于和邮件服务器交互
session = Session.getInstance(props);
session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log
// 4. 根据 Session 获取邮件传输对象
setTransport(session.getTransport());
// 535 Error: authentication failed
transport.connect(username, password);
return transport;
}

public static Session getSession() {
return session;
}

public static void setSession(Session session) {
SendMail.session = session;
}

public static String getTitle() {
return title;
}

public static void setTitle(String title) {
SendMail.title = title;
}

public static String getContent() {
return content;
}

public static void setContent(String content) {
SendMail.content = content;
}

public static void setTransport(Transport transport) {
SendMail.transport = transport;
}
}


参考文档:

简单邮件发送

JavaMail 发送 html 格式、带附件的邮件

发送模板邮件以及保存到发件箱

保存到发件箱

使用IMAP协议接收并解析电子邮件

返回错误信息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  邮件 javamail