---
title: 收发邮件
date: 2017-04-08 13:28:00
update: 2017-04-27 13:28:00
categories: JAVA
tags: [javamail]
---
### 更新
#### 设置邮件标记
这个标记跟随email,用于区分是否为系统发送邮件,进行同步各用户邮件服务的邮件
有两种方式:
1.邮件对象设置内容ID(不推荐,容易丢失数据)
```
msg.setContentID();
```
2.邮件对象设置handler(推荐)
```
msg.setHeader("key","value");
```
3.IMAP解析
使用IMAP进行解析就可以获取该邮件的标识,来进行判断是否为外部系统发送的邮件,再同步该邮件到本地
```
msg.getContentID();
String[] header = msg.getHeader("key");
for (String s : header) {
System.out.println("设定唯一标记" + s);
}
```
***
### 1 javamail收发邮件
操作邮件收发需要服务开启POP3/SMTP服务。
引入javamailjar包
```
javax.mail
mail
1.4
```
验证邮件账号
```java
package test;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
/**
* @author Administrator
* 发送邮件验证发送人账号
*/
public class EmailAutherticator extends Authenticator {
private String m_username = null;
private String m_userpass = null;
public void setUsername(String username) {
m_username = username;
}
public void setUserpass(String userpass) {
m_userpass = userpass;
}
public EmailAutherticator(String username, String userpass) {
super();
setUsername(username);
setUserpass(userpass);
}
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(m_username, m_userpass);
}
}
```
发邮件
```java
package test;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Multipart;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
/**
* 利用java.mail的邮件发送程序
*/
public class SendMail {
public static void main(String[] args) {
String title = "公司信息"; // 发送邮件主题
// String from = ""; // 发送人邮箱账号
String from = "";
String sendTo[] = {"", ""}; // 收件人邮箱账号
// 邮件的文本内容,可以包含html标记则显示为html页面
// String content = "内容含有html变迁支持mail test!!!!!!
aaa"; String content = "gongsixinxi111"; // 上传多个附件及修改附件名称 String fileNames[] = {"F:\\javamail\\mailtmp\\attachment\\test\\test.txt,test.txt", "F:\\javamail\\mailtmp\\attachment\\test.txt,哈哈.txt"}; try { // MailSender mailsender = new MailSender(); // 封装为邮件对象存储本次邮件信息 sendmail(title, from, sendTo, content, fileNames, "text/html;charset=gb2312"); } catch (Exception ex) { ex.printStackTrace(); } } @SuppressWarnings("static-access") public static void sendmail(String subject, String from, String[] to, String text, String[] filenames, String mimeType) throws Exception { // ResourceBundle mailProps = ResourceBundle.getBundle("mail"); // 可以从配置文件读取相应的参数 Properties props = new Properties(); String smtp = "smtp.qq.com"; // 使用smtp协议传输,对应发送端的邮件服务器 String servername = ""; // 发件人账号 String serverpaswd = ""; // 发件人邮箱密码 javax.mail.Session mailSession; // 邮件会话对象 javax.mail.internet.MimeMessage mimeMsg; // MIME邮件对象 props = System.getProperties(); // 获得系统属性对象 props.put("mail.smtp.host", smtp); // 设置SMTP主机 props.put("mail.smtp.auth", "true"); // 设置为默认验证用户名和密码 // 统一使用ssl协议端口, qq邮箱服务需要ssl协议认证,否侧返回530错误 final String smtpPort = "465"; props.setProperty("mail.smtp.port", smtpPort); props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.socketFactory.port", smtpPort); // 到服务器验证发送的用户名和密码是否正确 EmailAutherticator myEmailAuther = new EmailAutherticator(servername, serverpaswd); // 设置邮件会话 mailSession = javax.mail.Session.getInstance(props, (Authenticator) myEmailAuther); // 设置debug打印信息 mailSession.setDebug(true); // 设置传输协议 javax.mail.Transport transport = mailSession.getTransport("smtp"); // 设置from、to等信息 mimeMsg = new javax.mail.internet.MimeMessage(mailSession); if (!from.isEmpty()) { InternetAddress sentFrom = new InternetAddress(from); mimeMsg.setFrom(sentFrom); // 设置发送人地址 } InternetAddress[] sendTo = new InternetAddress[to.length]; for (int i = 0; i < to.length; i++) { System.out.println("发送到:" + to[i]); sendTo[i] = new InternetAddress(to[i]); } mimeMsg.setRecipients(javax.mail.internet.MimeMessage.RecipientType.TO, sendTo); mimeMsg.setSubject(subject, "gb2312"); MimeBodyPart messageBodyPart1 = new MimeBodyPart(); // messageBodyPart.setText(UnicodeToChinese(text)); messageBodyPart1.setContent(text, mimeType); Multipart multipart = new MimeMultipart();// 附件传输格式 multipart.addBodyPart(messageBodyPart1); for (int i = 0; i < filenames.length; i++) { MimeBodyPart messageBodyPart2 = new MimeBodyPart(); // 选择出每一个附件名 String filename = filenames[i].split(",")[0]; System.out.println("附件名:" + filename); String displayname = filenames[i].split(",")[1]; // 得到数据源 FileDataSource fds = new FileDataSource(filename); // 得到附件本身并至入BodyPart messageBodyPart2.setDataHandler(new DataHandler(fds)); // 得到文件名同样至入BodyPart // messageBodyPart2.setFileName(displayname); // messageBodyPart2.setFileName(fds.getName()); messageBodyPart2.setFileName(MimeUtility.encodeText(displayname)); multipart.addBodyPart(messageBodyPart2); } mimeMsg.setContent(multipart); // 设置信件头的发送日期 mimeMsg.setSentDate(new Date()); mimeMsg.saveChanges(); // 发送邮件 transport.send(mimeMsg); System.out.println(" 邮件发送成功.. "); transport.close(); } } ``` 使用pop3解析邮件 ```java package test; import java.io.BufferedInputStream;
aaa"; String content = "gongsixinxi111"; // 上传多个附件及修改附件名称 String fileNames[] = {"F:\\javamail\\mailtmp\\attachment\\test\\test.txt,test.txt", "F:\\javamail\\mailtmp\\attachment\\test.txt,哈哈.txt"}; try { // MailSender mailsender = new MailSender(); // 封装为邮件对象存储本次邮件信息 sendmail(title, from, sendTo, content, fileNames, "text/html;charset=gb2312"); } catch (Exception ex) { ex.printStackTrace(); } } @SuppressWarnings("static-access") public static void sendmail(String subject, String from, String[] to, String text, String[] filenames, String mimeType) throws Exception { // ResourceBundle mailProps = ResourceBundle.getBundle("mail"); // 可以从配置文件读取相应的参数 Properties props = new Properties(); String smtp = "smtp.qq.com"; // 使用smtp协议传输,对应发送端的邮件服务器 String servername = ""; // 发件人账号 String serverpaswd = ""; // 发件人邮箱密码 javax.mail.Session mailSession; // 邮件会话对象 javax.mail.internet.MimeMessage mimeMsg; // MIME邮件对象 props = System.getProperties(); // 获得系统属性对象 props.put("mail.smtp.host", smtp); // 设置SMTP主机 props.put("mail.smtp.auth", "true"); // 设置为默认验证用户名和密码 // 统一使用ssl协议端口, qq邮箱服务需要ssl协议认证,否侧返回530错误 final String smtpPort = "465"; props.setProperty("mail.smtp.port", smtpPort); props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.socketFactory.port", smtpPort); // 到服务器验证发送的用户名和密码是否正确 EmailAutherticator myEmailAuther = new EmailAutherticator(servername, serverpaswd); // 设置邮件会话 mailSession = javax.mail.Session.getInstance(props, (Authenticator) myEmailAuther); // 设置debug打印信息 mailSession.setDebug(true); // 设置传输协议 javax.mail.Transport transport = mailSession.getTransport("smtp"); // 设置from、to等信息 mimeMsg = new javax.mail.internet.MimeMessage(mailSession); if (!from.isEmpty()) { InternetAddress sentFrom = new InternetAddress(from); mimeMsg.setFrom(sentFrom); // 设置发送人地址 } InternetAddress[] sendTo = new InternetAddress[to.length]; for (int i = 0; i < to.length; i++) { System.out.println("发送到:" + to[i]); sendTo[i] = new InternetAddress(to[i]); } mimeMsg.setRecipients(javax.mail.internet.MimeMessage.RecipientType.TO, sendTo); mimeMsg.setSubject(subject, "gb2312"); MimeBodyPart messageBodyPart1 = new MimeBodyPart(); // messageBodyPart.setText(UnicodeToChinese(text)); messageBodyPart1.setContent(text, mimeType); Multipart multipart = new MimeMultipart();// 附件传输格式 multipart.addBodyPart(messageBodyPart1); for (int i = 0; i < filenames.length; i++) { MimeBodyPart messageBodyPart2 = new MimeBodyPart(); // 选择出每一个附件名 String filename = filenames[i].split(",")[0]; System.out.println("附件名:" + filename); String displayname = filenames[i].split(",")[1]; // 得到数据源 FileDataSource fds = new FileDataSource(filename); // 得到附件本身并至入BodyPart messageBodyPart2.setDataHandler(new DataHandler(fds)); // 得到文件名同样至入BodyPart // messageBodyPart2.setFileName(displayname); // messageBodyPart2.setFileName(fds.getName()); messageBodyPart2.setFileName(MimeUtility.encodeText(displayname)); multipart.addBodyPart(messageBodyPart2); } mimeMsg.setContent(multipart); // 设置信件头的发送日期 mimeMsg.setSentDate(new Date()); mimeMsg.saveChanges(); // 发送邮件 transport.send(mimeMsg); System.out.println(" 邮件发送成功.. "); transport.close(); } } ``` 使用pop3解析邮件 ```java package test; import java.io.BufferedInputStream;