前言
最近在弄郵件相關(guān)的功能,被搞的頭大,很多找的方法根本不知道該怎么往下走,就目前為止,
經(jīng)過(guò)各種的碰壁和失敗,就整理出來(lái)如何使用javamail實(shí)現(xiàn)郵件的接收、轉(zhuǎn)發(fā)、發(fā)送、清除
不單單是分享,也為我后續(xù)查找更方便做一個(gè)記錄
郵件相關(guān)概念
在正式發(fā)送郵件之前,我們應(yīng)該對(duì)郵件有一個(gè)概念
第一點(diǎn):
我覺(jué)得也是最重要的,接收和發(fā)送的主機(jī)host
和端口port
是不一樣
的;我一開(kāi)始的時(shí)候,并不懂;直接就不管是發(fā)送還是接收都用的一個(gè)主機(jī)host
和端口port
第二點(diǎn):
接收郵件和發(fā)送郵件的協(xié)議不一樣
,
發(fā)送郵件用的是SMTP
,SMTP 即簡(jiǎn)單郵件傳輸協(xié)議,用于郵件發(fā)送。SMTP 認(rèn)證,簡(jiǎn)單地說(shuō)就是要求必須提供賬戶(hù)名和密碼
之后才可以登錄 SMTP 服務(wù)器。
接收郵件用的是POP3
,
POP3協(xié)議允許電子郵件客戶(hù)端下載服務(wù)器上的郵件,但是這個(gè)下載不會(huì)影響服務(wù)器本身的郵件
至于另外還有一個(gè)是IMAP
的協(xié)議,因?yàn)槲疫@邊并沒(méi)有用到就不多說(shuō),感興趣百度即可
導(dǎo)入依賴(lài)
用的是javamail,因此是需要導(dǎo)入javamail的maven依賴(lài)包
<!-- 郵件-->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.5.5</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.5</version>
</dependency>
郵件發(fā)送
public void sendMail(String toEmail, String ccEmail, String bccEmail, String subject, String text, List<File> files) {
try {
System.setProperty("mail.mime.splitlongparameters", "false");
final JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setUsername(username);
javaMailSender.setPassword(password);
javaMailSender.setHost(host);
javaMailSender.setPort(port);
javaMailSender.setProtocol(protocol);
javaMailSender.setDefaultEncoding(defaultEncoding);
final Properties mailProperties = new Properties();
mailProperties.put("mail.smtp.auth", true);
mailProperties.put("mail.smtp.starttls.enable", true);
javaMailSender.setJavaMailProperties(mailProperties);
final MimeMessage mimeMessage = getMimeMessage(toEmail, ccEmail, bccEmail, subject, text, javaMailSender, files,senderName);
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
System.out.println("發(fā)送郵件失敗:"+e.getMessage());
}
}
private MimeMessage getMimeMessage(String toEmail, String ccEmail, String bccEmail, String subject, String text,
JavaMailSenderImpl javaMailSender, List<File> files,String senderName) throws javax.mail.MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
mimeMessageHelper.setFrom(senderName);
mimeMessageHelper.setTo(toEmail.split(","));
if (!Strings.isNullOrEmpty(ccEmail)) {
mimeMessageHelper.setCc(ccEmail.split(","));
}
if (!Strings.isNullOrEmpty(bccEmail)) {
mimeMessageHelper.setBcc(bccEmail.split(","));
}
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(text, true);
try {
if (!CollectionUtils.isEmpty(files)) {
for (File file : files) {
mimeMessageHelper.addAttachment(MimeUtility.encodeText(file.getName(), "GBK", "B"), file);
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
return mimeMessage;
}
sendMail方法
我們?cè)谑褂玫臅r(shí)候直接調(diào)用sendMail方法即可
其中,各個(gè)參數(shù)含義如下:toEmail:
發(fā)送到對(duì)應(yīng)的郵箱ccEmail:
抄送到對(duì)應(yīng)的郵箱bccEmail:
秘密抄送到對(duì)應(yīng)郵箱subject:
郵件主題text:
字符文本,可以是html元素文本files:
附件
在這個(gè)基礎(chǔ)上,其實(shí)我們還是有額外的參數(shù)需要設(shè)置的,可以定義成全局 username:
用于發(fā)送郵件的郵箱賬號(hào)password:
用于發(fā)送郵件的郵箱密碼host:
發(fā)送郵件的主機(jī)port:
發(fā)送郵件的端口protocol:
發(fā)送郵件的協(xié)議,默認(rèn)值是:smtpdefaultEncoding:
發(fā)送郵件的字符集,默認(rèn)使用UTF-8
在這里,host和port是根據(jù)你需要連的郵箱進(jìn)行設(shè)置的,比如連qq郵箱,網(wǎng)易郵箱。
百度能知道他們具體的協(xié)議和主機(jī)、端口
getMimeMessage方法
該方法其實(shí)主要就是將接收到的參數(shù)進(jìn)行賦值發(fā)送郵箱,不需要多余講解
郵件接收
public static Message[] receiveMail(String receiveHost,String receivePort,String receiveProtocol,String username,String password) throws Exception {
Properties props = new Properties();
props.put("mail.pop3.host", receiveHost);
props.put("mail.pop3.port", receivePort);
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
store = session.getStore(receiveProtocol);
// storeLocal.set(store);
store.connect();
folder = store.getFolder("INBOX");
// folderLocal.set(folder);
folder.open(Folder.READ_WRITE);
Calendar calendar = Calendar.getInstance();
// 搜索1天前到今天收到的的所有郵件,根據(jù)時(shí)間篩選郵件
calendar.add(Calendar.DAY_OF_MONTH, -1);
// 創(chuàng)建ReceivedDateTerm對(duì)象,ComparisonTerm.GE(大于等于),Date類(lèi)型的時(shí)間 new Date(calendar.getTimeInMillis())----(表示1天前)
SentDateTerm term = new SentDateTerm(ComparisonTerm.GE, new Date(calendar.getTimeInMillis()));
Message[] messages = folder.search(term);
return messages;
}
receiveMail方法
以下為各個(gè)參數(shù)說(shuō)明receiveHost:
接收郵件的主機(jī)receivePort:
接收郵件的端口receiveProtocol:
接收郵件的協(xié)議,默認(rèn)值:pop3username:
需要接收郵件的賬號(hào)password:
需要接收郵件的密碼
這里也是需要賬號(hào)密碼的,區(qū)別在于你需要查找接收對(duì)應(yīng)郵箱有收到什么郵件,你就需要對(duì)應(yīng)賬號(hào)和密碼才能接收到
其中,注釋已經(jīng)標(biāo)注接收什么時(shí)間范圍內(nèi)的郵件
郵件轉(zhuǎn)發(fā)
轉(zhuǎn)發(fā)就有點(diǎn)意思,我找這個(gè)找遍了都沒(méi)有對(duì)應(yīng)的方法能夠?qū)崿F(xiàn),現(xiàn)在我來(lái)說(shuō)一下我是怎么樣的一個(gè)思路
要想轉(zhuǎn)發(fā),第一步,你就得先接收郵件
但是接收完郵件,你不能把Folder
和Store
關(guān)閉掉
否則你是沒(méi)有辦法轉(zhuǎn)發(fā)的
那什么是Folder和Store?
接收郵件和發(fā)送郵件很類(lèi)似的都有用到Session,但是獲取到Session后,我們需要從Session獲取到特定類(lèi)型的Store,然后連接到Store。
這里的Store代表了存儲(chǔ)郵件的郵件服務(wù)器,在連接Store的過(guò)程中,我們是既有可能需要用到用戶(hù)名和密碼或者Authenticator,也就是驗(yàn)證的。
在連接到Store后,一個(gè)Folder對(duì)象,也叫目錄對(duì)象,會(huì)通過(guò)Store的getFolder方法獲取到郵件,也就能夠從中讀取到郵件。
這也是我們?yōu)槭裁聪朕D(zhuǎn)發(fā)不能關(guān)閉他們的原因。
第二步,開(kāi)始接收到需要轉(zhuǎn)發(fā)的郵件,然后將對(duì)應(yīng)郵件轉(zhuǎn)發(fā)。
第三步,在轉(zhuǎn)發(fā)完成之后我們才能夠?qū)⑵渫瓿赊D(zhuǎn)發(fā)
也就是,我們必須接收郵件和轉(zhuǎn)發(fā)郵件是同一個(gè)方法內(nèi)進(jìn)行的,沒(méi)辦法通過(guò)保存一個(gè)郵件類(lèi)型的對(duì)象,額外做操作對(duì)其進(jìn)行轉(zhuǎn)發(fā)。
我也是卡死在了這一步上。
于是轉(zhuǎn)發(fā)的方法如下:
public void forwardMail(String receiveHost,String receivePort,String username,String password,String sendHost,String sendPort,String SendFrom,String SendTo) {
//設(shè)置接收郵件
final Properties receiveProps = new Properties();
receiveProps.put("mail.pop3.host", receiveHost);
receiveProps.put("mail.pop3.port", receivePort);
final Session receiveSession = Session.getInstance(receiveProps, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
final ThreadLocal<Store> storeLocal = new ThreadLocal<>();
final Store store = receiveSession.getStore("pop3");
storeLocal.set(store);
store.connect();
final ThreadLocal<Folder> folderLocal = new ThreadLocal<>();
final Folder folder = store.getFolder("INBOX");
folderLocal.set(folder);
folder.open(Folder.READ_WRITE);
final Calendar calendar = Calendar.getInstance();
// 搜索所有郵件,根據(jù)時(shí)間篩選
calendar.add(Calendar.DAY_OF_MONTH, -10);//n天之內(nèi)
// 創(chuàng)建ReceivedDateTerm對(duì)象,ComparisonTerm.GE(大于等于)
final SentDateTerm term = new SentDateTerm(ComparisonTerm.GE, new Date(calendar.getTimeInMillis()));
final Message[] messages = folder.search(term);
for (Message mail : messages) {
//String header = ((MimeMessage)mail).getHeader("SUBJECT")[0];
//log.info("Header:{}", header);
System.out.println("收到郵件的主題:", mail.getSubject());
if (mail.isMimeType("multipart/related")) {
final MimeMultipart mimeMultipart = (MimeMultipart) mail.getContent();
for (int i = 0; i < mimeMultipart.getCount(); i++) {
System.out.println("收到郵件的正文:", mimeMultipart.getBodyPart(i).getContent().toString().length());
}
}
System.out.println("--------------------------------分割線(xiàn)----------------------------------------");
//設(shè)置轉(zhuǎn)發(fā)郵件
final Properties forwardProps = new Properties();
forwardProps.put("mail.smtp.host", sendHost);
forwardProps.put("mail.smtp.port", sendPort);
final Session forwardSession = Session.getInstance(forwardProps, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
// 創(chuàng)建轉(zhuǎn)發(fā)郵件信息
final Message forwardMail = new MimeMessage(forwardSession);
// 設(shè)置主題
forwardMail.setSubject("轉(zhuǎn)發(fā): " + mail.getSubject());
forwardMail.setFrom(new InternetAddress(SendFrom));
forwardMail.addRecipient(Message.RecipientType.TO, new InternetAddress(SendTo));
//創(chuàng)建Multipart的容器
final Multipart multipart = new MimeMultipart();
//被轉(zhuǎn)發(fā)的郵件體部分
final BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setDataHandler(mail.getDataHandler());
//添加到Multipart容器
multipart.addBodyPart(messageBodyPart);
forwardMail.setContent(multipart);
//發(fā)送
Transport.send(forwardMail);
}
folder.close(false);//false標(biāo)識(shí)不刪除讀取的郵件
store.close();
}
receiveMail方法
以下為參數(shù)說(shuō)明receiveHost:
接收郵件的主機(jī)receivePort:
接收郵件的端口username:
接收郵件的賬號(hào)password:
接收郵件的密碼
這里可以看到,我接收和轉(zhuǎn)發(fā)用的都是一個(gè)username和password,表示我從接收的郵件的這個(gè)賬號(hào),用這個(gè)賬號(hào)轉(zhuǎn)發(fā)給別的郵箱sendHost:
發(fā)送郵件的主機(jī)sendPort:
發(fā)送郵件的端口SendFrom:
從哪個(gè)郵箱進(jìn)行轉(zhuǎn)發(fā)SendTo:
將郵件轉(zhuǎn)發(fā)給該郵箱
清除郵箱
以時(shí)間為限制,刪除一定時(shí)間內(nèi)的郵件
public static void clearMail(String receiveHost,String receivePort,String receiveProtocol,String username,String password) throws Exception {
Properties props = new Properties();
props.put("mail.pop3.host", receiveHost);
props.put("mail.pop3.port", receivePort);
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
Store store = session.getStore(receiveProtocol);
// removeStoreLocal.set(store);
store.connect();
Folder folder = store.getFolder("INBOX");
// removeFolderLocal.set(folder);
folder.open(Folder.READ_WRITE);
Calendar calendar = Calendar.getInstance();
// 搜索7天前收到的的所有郵件,根據(jù)時(shí)間篩選郵件
calendar.add(Calendar.DAY_OF_MONTH, -7);
SentDateTerm term = new SentDateTerm(ComparisonTerm.LE, new Date(calendar.getTimeInMillis()));
Message[] messages = folder.search(term);
for (int i = 0; i < messages.length; i++) {
// if(!messages[i].getFolder().isOpen()) //判斷是否open
// messages[i].getFolder().open(Folder.READ_WRITE);
messages[i].setFlag(Flags.Flag.DELETED, true);
}
folder.close(false);
store.close();
}
clearMail方法
以下為對(duì)應(yīng)參數(shù)說(shuō)明receiveHost:
接收郵件的主機(jī)receivePort:
接收郵件的端口receiveProtocol:
接收郵件的協(xié)議username:
接收該郵箱的郵件的賬號(hào)password:
接收該郵箱的郵件的密碼文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-443223.html
結(jié)語(yǔ)
以上,就是我通過(guò)springboot(java)使用javamail實(shí)現(xiàn)郵件的接收、轉(zhuǎn)發(fā)、發(fā)送的具體過(guò)程,如后續(xù)有新內(nèi)容將在本文章更新文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-443223.html
到了這里,關(guān)于springboot(java)使用javamail實(shí)現(xiàn)郵件的接收、轉(zhuǎn)發(fā)、發(fā)送、清除的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!