使用java语言实现邮件的简单的发送和接受。

说明使用Java应用程序发送E-mail比较简单,在使用下列程序之前,你需要将mail.jar和activation.jar 添加到你的CLASSPATH中。

1、这是一个简单的发送邮件的java程序,它可以向任何邮箱发送邮件,在使用过程中一定要注意,自己使用的发送邮件的邮箱需要开通SMTP服务,一般邮箱默认是不开通的。

(注意这个程序暂时还不能使用qq邮箱发送邮件,网上查阅说是因为qq邮箱使用了ssl加密)

  1. /**
  2. * java 发送邮件
  3. * 2016/5/19
  4. */
  5. package cn.mail;
  6. import java.util.Properties;
  7. import javax.mail.Message;
  8. import javax.mail.Session;
  9. import javax.mail.Transport;
  10. import javax.mail.internet.InternetAddress;
  11. import javax.mail.internet.MimeMessage;
  12. public class mail_163 {
  13.  
  14. public static void main(String[] args) throws Exception {
  15.  
  16. Properties prop = new Properties();
  17. prop.setProperty("mail.host", "smtp.sina.com");
  18. prop.setProperty("mail.transport.protocol", "smtp");
  19. prop.setProperty("mail.smtp.auth", "true");
  20. //使用JavaMail发送邮件的5个步骤
  21. //1、创建session
  22. Session session = Session.getInstance(prop);
  23. //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
  24. session.setDebug(true);
  25. //2、通过session得到transport对象
  26. Transport ts = session.getTransport();
  27. //3、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。
  28. ts.connect("smtp.sina.com",25, "lvbiao_1995@sina.com", "1234567");
  29. //4、创建邮件
  30. Message message = createSimpleMail(session);
  31. //5、发送邮件
  32. ts.sendMessage(message, message.getAllRecipients());
  33. System.out.println("发送成功");
  34. ts.close();
  35. }
  36. //设置邮件内容
  37. public static MimeMessage createSimpleMail(Session session)
  38. throws Exception {
  39. //创建邮件对象
  40. MimeMessage message = new MimeMessage(session);
  41. //指明邮件的发件人
  42. message.setFrom(new InternetAddress("lvbiao_1995@sina.com"));
  43. //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
  44. message.setRecipient(Message.RecipientType.TO, new InternetAddress("lvbiao_1995@163.com"));
  45. //邮件的标题
  46. message.setSubject("snail发送 这是标题");
  47. //邮件的文本内容
  48. message.setContent("你好啊!这是我用java给qq邮箱发送的邮件,请您不用回复,这是文本内容", "text/html;charset=UTF-8");
  49. //返回创建好的邮件对象
  50. return message;
  51. }
  52. }

2、邮件发送改进版,可以使用qq邮箱发送,qq邮箱开启了ssl加密,必须在程序中使用qq邮箱自己生成的密码,而且要开启ssl加密。

下面这段代码开启了ssl加密

  1. //如果使用qq邮箱,需要加上下列代码,因为qq邮箱使用了ssl加密,下面代码是用来开启ssl加密的,而且密码也必须是qq邮箱生成的安全密码
  2. MailSSLSocketFactory sf = new MailSSLSocketFactory();
  3. sf.setTrustAllHosts(true);
  4. prop.put("mail.smtp.ssl.enable", "true");
  5. prop.put("mail.smtp.ssl.socketFactory", sf);

其他的代码和1是一样的,只需要改动密码部分。

3、使用qq邮箱同时给多人发送邮件

  1. /**
  2. * java 发送邮件 同时给多人发送邮件
  3. * 2016/5/19
  4. */
  5. package cn.mail;
  6. import java.util.Properties;
  7.  
  8. import javax.mail.Address;
  9. import javax.mail.Message;
  10. import javax.mail.MessagingException;
  11. import javax.mail.Session;
  12. import javax.mail.Transport;
  13. import javax.mail.internet.InternetAddress;
  14. import javax.mail.internet.MimeMessage;
  15.  
  16. import com.sun.mail.util.MailSSLSocketFactory;
  17. public class mail_qq_m {
  18.  
  19. public static void main(String[] args) throws Exception {
  20.  
  21. Properties prop = new Properties();
  22. prop.setProperty("mail.host", "smtp.sina.com");
  23. prop.setProperty("mail.transport.protocol", "smtp");
  24. prop.setProperty("mail.smtp.auth", "true");
  25. //如果使用qq邮箱,需要加上下列代码,因为qq邮箱使用了ssl加密,下面代码是用来开启ssl加密的,而且密码也必须是qq邮箱生成的安全密码
  26. MailSSLSocketFactory sf = new MailSSLSocketFactory();
  27. sf.setTrustAllHosts(true);
  28. prop.put("mail.smtp.ssl.enable", "true");
  29. prop.put("mail.smtp.ssl.socketFactory", sf);
  30.  
  31. //使用JavaMail发送邮件的5个步骤
  32. //1、创建session
  33. Session session = Session.getInstance(prop);
  34. //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
  35. session.setDebug(true);
  36. //2、通过session得到transport对象
  37. Transport ts = session.getTransport();
  38. //3、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。
  39. ts.connect("smtp.qq.com",465, "1396799517@qq.com", "12345");
  40. //4、创建邮件
  41. Message message = createSimpleMail(session);
  42. //5、发送邮件
  43. ts.sendMessage(message, message.getAllRecipients());
  44. System.out.println("发送成功");
  45. ts.close();
  46. }
  47. //设置邮件内容
  48. public static MimeMessage createSimpleMail(Session session)
  49. throws Exception {
  50. //创建邮件对象
  51. MimeMessage message = new MimeMessage(session);
  52. //指明邮件的发件人
  53. message.setFrom(new InternetAddress("1396799517@qq.com"));
  54. //指明邮件的收件人,同时给多人发送
  55. String to[] = {"lvbiao_1995@sina.com","lvbiao_1995@163.com","lvbiao_1995@qq.com"};
  56. String toList = getMailList(to);
  57. InternetAddress[] iaToList = new InternetAddress().parse(toList);
  58. message.setRecipients(Message.RecipientType.TO,iaToList);
  59.  
  60. //邮件的标题
  61. message.setSubject("snail发送 这是标题");
  62. //邮件的文本内容
  63. message.setContent("你好啊!这是我用java给qq邮箱发送的邮件,请您不用回复,这是文本内容,同时给多人发送的邮件~~~", "text/html;charset=UTF-8");
  64. //返回创建好的邮件对象
  65. return message;
  66. }
  67. //给多人发送邮件
  68. private static String getMailList(String[] mailArray){
  69.  
  70. StringBuffer toList = new StringBuffer();
  71. int length = mailArray.length;
  72. if(mailArray!=null && length <2){
  73. toList.append(mailArray[0]);
  74. }else{
  75. for(int i=0;i<length;i++){
  76. toList.append(mailArray[i]);
  77. if(i!=(length-1)){
  78. toList.append(",");
  79. }
  80.  
  81. }
  82. }
  83. return toList.toString();
  84.  
  85. }
  86. }

4、使用POP3协议收取邮件

  1. package cn.mail;
  2.  
  3. import java.io.BufferedInputStream;
  4. import java.io.BufferedOutputStream;
  5. import java.io.File;
  6. import java.io.FileNotFoundException;
  7. import java.io.FileOutputStream;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.io.UnsupportedEncodingException;
  11. import java.text.SimpleDateFormat;
  12. import java.util.Date;
  13. import java.util.Properties;
  14.  
  15. import javax.mail.Address;
  16. import javax.mail.BodyPart;
  17. import javax.mail.Flags;
  18. import javax.mail.Folder;
  19. import javax.mail.Message;
  20. import javax.mail.MessagingException;
  21. import javax.mail.Multipart;
  22. import javax.mail.Part;
  23. import javax.mail.Session;
  24. import javax.mail.Store;
  25. import javax.mail.internet.InternetAddress;
  26. import javax.mail.internet.MimeMessage;
  27. import javax.mail.internet.MimeMultipart;
  28. import javax.mail.internet.MimeUtility;
  29.  
  30. import com.sun.mail.util.MailSSLSocketFactory;
  31.  
  32. /**
  33. * 使用POP3协议接收邮件
  34. */
  35. public class POP3mail {
  36.  
  37. public static void main(String[] args) throws Exception {
  38. receive();
  39. }
  40.  
  41. /**
  42. * 接收邮件
  43. */
  44. public static void receive() throws Exception {
  45. // 准备连接服务器的会话信息
  46. Properties props = new Properties();
  47. props.setProperty("mail.store.protocol", "pop3"); // 协议
  48. props.setProperty("mail.pop3.port", "995"); // 端口
  49. props.setProperty("mail.pop3.host", "pop.qq.com"); // pop3服务器
  50. //如果使用qq邮箱,需要加上下列代码,因为qq邮箱使用了ssl加密,下面代码是用来开启ssl加密的,而且密码也必须是qq邮箱生成的安全密码
  51. MailSSLSocketFactory sf = new MailSSLSocketFactory();
  52. sf.setTrustAllHosts(true);
  53. props.put("mail.pop3.ssl.enable", "true");
  54. props.put("mail.pop3.ssl.socketFactory", sf);
  55.  
  56. // 创建Session实例对象
  57. Session session = Session.getInstance(props);
  58. session.setDebug(true);
  59. Store store = session.getStore("pop3");
  60. store.connect("1396799517@qq.com", "12345");
  61.  
  62. // 获得收件箱
  63. Folder folder = store.getFolder("INBOX");
  64. /* Folder.READ_ONLY:只读权限
  65. * Folder.READ_WRITE:可读可写(可以修改邮件的状态)
  66. */
  67. folder.open(Folder.READ_WRITE); //打开收件箱
  68.  
  69. // 由于POP3协议无法获知邮件的状态,所以getUnreadMessageCount得到的是收件箱的邮件总数
  70. System.out.println("未读邮件数: " + folder.getUnreadMessageCount());
  71.  
  72. // 由于POP3协议无法获知邮件的状态,所以下面得到的结果始终都是为0
  73. System.out.println("删除邮件数: " + folder.getDeletedMessageCount());
  74. System.out.println("新邮件: " + folder.getNewMessageCount());
  75.  
  76. // 获得收件箱中的邮件总数
  77. System.out.println("邮件总数: " + folder.getMessageCount());
  78.  
  79. // 得到收件箱中的所有邮件,并解析
  80. Message[] messages = folder.getMessages();
  81. parseMessage(messages);
  82.  
  83. //释放资源
  84. folder.close(true);
  85. store.close();
  86. }
  87.  
  88. /**
  89. * 解析邮件
  90. * @param messages 要解析的邮件列表
  91. */
  92. public static void parseMessage(Message... messages) throws MessagingException, IOException {
  93. if (messages == null || messages.length < 1)
  94. throw new MessagingException("未找到要解析的邮件!");
  95.  
  96. // 解析所有邮件
  97. for (int i = 0, count = messages.length; i < count; i++) {
  98. MimeMessage msg = (MimeMessage) messages[i];
  99. System.out.println("------------------解析第" + msg.getMessageNumber() + "封邮件-------------------- ");
  100. System.out.println("主题: " + getSubject(msg));
  101. System.out.println("发件人: " + getFrom(msg));
  102. System.out.println("收件人:" + getReceiveAddress(msg, null));
  103. System.out.println("发送时间:" + getSentDate(msg, null));
  104. System.out.println("是否已读:" + isSeen(msg));
  105. System.out.println("邮件优先级:" + getPriority(msg));
  106. System.out.println("是否需要回执:" + isReplySign(msg));
  107. System.out.println("邮件大小:" + msg.getSize() * 1024 + "kb");
  108. boolean isContainerAttachment = isContainAttachment(msg);
  109. System.out.println("是否包含附件:" + isContainerAttachment);
  110. if (isContainerAttachment) {
  111. saveAttachment(msg, "/home/lvbiao/java/mail"+msg.getSubject() + "_"); //保存附件
  112. }
  113. StringBuffer content = new StringBuffer(30);
  114. getMailTextContent(msg, content);
  115. System.out.println("邮件正文:" + (content.length() > 100 ? content.substring(0,100) + "..." : content));
  116. System.out.println("------------------第" + msg.getMessageNumber() + "封邮件解析结束-------------------- ");
  117. System.out.println();
  118. }
  119. }
  120.  
  121. /**
  122. * 获得邮件主题
  123. * @param msg 邮件内容
  124. * @return 解码后的邮件主题
  125. */
  126. public static String getSubject(MimeMessage msg) throws UnsupportedEncodingException, MessagingException {
  127. return MimeUtility.decodeText(msg.getSubject());
  128. }
  129.  
  130. /**
  131. * 获得邮件发件人
  132. * @param msg 邮件内容
  133. * @return 姓名 <Email地址>
  134. * @throws MessagingException
  135. * @throws UnsupportedEncodingException
  136. */
  137. public static String getFrom(MimeMessage msg) throws MessagingException, UnsupportedEncodingException {
  138. String from = "";
  139. Address[] froms = msg.getFrom();
  140. if (froms.length < 1)
  141. throw new MessagingException("没有发件人!");
  142.  
  143. InternetAddress address = (InternetAddress) froms[0];
  144. String person = address.getPersonal();
  145. if (person != null) {
  146. person = MimeUtility.decodeText(person) + " ";
  147. } else {
  148. person = "";
  149. }
  150. from = person + "<" + address.getAddress() + ">";
  151.  
  152. return from;
  153. }
  154.  
  155. /**
  156. * 根据收件人类型,获取邮件收件人、抄送和密送地址。如果收件人类型为空,则获得所有的收件人
  157. * <p>Message.RecipientType.TO 收件人</p>
  158. * <p>Message.RecipientType.CC 抄送</p>
  159. * <p>Message.RecipientType.BCC 密送</p>
  160. * @param msg 邮件内容
  161. * @param type 收件人类型
  162. * @return 收件人1 <邮件地址1>, 收件人2 <邮件地址2>, ...
  163. * @throws MessagingException
  164. */
  165. public static String getReceiveAddress(MimeMessage msg, Message.RecipientType type) throws MessagingException {
  166. StringBuffer receiveAddress = new StringBuffer();
  167. Address[] addresss = null;
  168. if (type == null) {
  169. addresss = msg.getAllRecipients();
  170. } else {
  171. addresss = msg.getRecipients(type);
  172. }
  173.  
  174. if (addresss == null || addresss.length < 1)
  175. throw new MessagingException("没有收件人!");
  176. for (Address address : addresss) {
  177. InternetAddress internetAddress = (InternetAddress)address;
  178. receiveAddress.append(internetAddress.toUnicodeString()).append(",");
  179. }
  180.  
  181. receiveAddress.deleteCharAt(receiveAddress.length()-1); //删除最后一个逗号
  182.  
  183. return receiveAddress.toString();
  184. }
  185.  
  186. /**
  187. * 获得邮件发送时间
  188. * @param msg 邮件内容
  189. * @return yyyy年mm月dd日 星期X HH:mm
  190. * @throws MessagingException
  191. */
  192. public static String getSentDate(MimeMessage msg, String pattern) throws MessagingException {
  193. Date receivedDate = msg.getSentDate();
  194. if (receivedDate == null)
  195. return "";
  196.  
  197. if (pattern == null || "".equals(pattern))
  198. pattern = "yyyy年MM月dd日 E HH:mm ";
  199.  
  200. return new SimpleDateFormat(pattern).format(receivedDate);
  201. }
  202.  
  203. /**
  204. * 判断邮件中是否包含附件
  205. * @param msg 邮件内容
  206. * @return 邮件中存在附件返回true,不存在返回false
  207. * @throws MessagingException
  208. * @throws IOException
  209. */
  210. public static boolean isContainAttachment(Part part) throws MessagingException, IOException {
  211. boolean flag = false;
  212. if (part.isMimeType("multipart/*")) {
  213. MimeMultipart multipart = (MimeMultipart) part.getContent();
  214. int partCount = multipart.getCount();
  215. for (int i = 0; i < partCount; i++) {
  216. BodyPart bodyPart = multipart.getBodyPart(i);
  217. String disp = bodyPart.getDisposition();
  218. if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {
  219. flag = true;
  220. } else if (bodyPart.isMimeType("multipart/*")) {
  221. flag = isContainAttachment(bodyPart);
  222. } else {
  223. String contentType = bodyPart.getContentType();
  224. if (contentType.indexOf("application") != -1) {
  225. flag = true;
  226. }
  227.  
  228. if (contentType.indexOf("name") != -1) {
  229. flag = true;
  230. }
  231. }
  232.  
  233. if (flag) break;
  234. }
  235. } else if (part.isMimeType("message/rfc822")) {
  236. flag = isContainAttachment((Part)part.getContent());
  237. }
  238. return flag;
  239. }
  240.  
  241. /**
  242. * 判断邮件是否已读
  243. * @param msg 邮件内容
  244. * @return 如果邮件已读返回true,否则返回false
  245. * @throws MessagingException
  246. */
  247. public static boolean isSeen(MimeMessage msg) throws MessagingException {
  248. return msg.getFlags().contains(Flags.Flag.SEEN);
  249. }
  250.  
  251. /**
  252. * 判断邮件是否需要阅读回执
  253. * @param msg 邮件内容
  254. * @return 需要回执返回true,否则返回false
  255. * @throws MessagingException
  256. */
  257. public static boolean isReplySign(MimeMessage msg) throws MessagingException {
  258. boolean replySign = false;
  259. String[] headers = msg.getHeader("Disposition-Notification-To");
  260. if (headers != null)
  261. replySign = true;
  262. return replySign;
  263. }
  264.  
  265. /**
  266. * 获得邮件的优先级
  267. * @param msg 邮件内容
  268. * @return 1(High):紧急 3:普通(Normal) 5:低(Low)
  269. * @throws MessagingException
  270. */
  271. public static String getPriority(MimeMessage msg) throws MessagingException {
  272. String priority = "普通";
  273. String[] headers = msg.getHeader("X-Priority");
  274. if (headers != null) {
  275. String headerPriority = headers[0];
  276. if (headerPriority.indexOf("1") != -1 || headerPriority.indexOf("High") != -1)
  277. priority = "紧急";
  278. else if (headerPriority.indexOf("5") != -1 || headerPriority.indexOf("Low") != -1)
  279. priority = "低";
  280. else
  281. priority = "普通";
  282. }
  283. return priority;
  284. }
  285.  
  286. /**
  287. * 获得邮件文本内容
  288. * @param part 邮件体
  289. * @param content 存储邮件文本内容的字符串
  290. * @throws MessagingException
  291. * @throws IOException
  292. */
  293. public static void getMailTextContent(Part part, StringBuffer content) throws MessagingException, IOException {
  294. //如果是文本类型的附件,通过getContent方法可以取到文本内容,但这不是我们需要的结果,所以在这里要做判断
  295. boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;
  296. if (part.isMimeType("text/*") && !isContainTextAttach) {
  297. content.append(part.getContent().toString());
  298. } else if (part.isMimeType("message/rfc822")) {
  299. getMailTextContent((Part)part.getContent(),content);
  300. } else if (part.isMimeType("multipart/*")) {
  301. Multipart multipart = (Multipart) part.getContent();
  302. int partCount = multipart.getCount();
  303. for (int i = 0; i < partCount; i++) {
  304. BodyPart bodyPart = multipart.getBodyPart(i);
  305. getMailTextContent(bodyPart,content);
  306. }
  307. }
  308. }
  309.  
  310. /**
  311. * 保存附件
  312. * @param part 邮件中多个组合体中的其中一个组合体
  313. * @param destDir 附件保存目录
  314. * @throws UnsupportedEncodingException
  315. * @throws MessagingException
  316. * @throws FileNotFoundException
  317. * @throws IOException
  318. */
  319. public static void saveAttachment(Part part, String destDir) throws UnsupportedEncodingException, MessagingException,
  320. FileNotFoundException, IOException {
  321. if (part.isMimeType("multipart/*")) {
  322. Multipart multipart = (Multipart) part.getContent(); //复杂体邮件
  323. //复杂体邮件包含多个邮件体
  324. int partCount = multipart.getCount();
  325. for (int i = 0; i < partCount; i++) {
  326. //获得复杂体邮件中其中一个邮件体
  327. BodyPart bodyPart = multipart.getBodyPart(i);
  328. //某一个邮件体也有可能是由多个邮件体组成的复杂体
  329. String disp = bodyPart.getDisposition();
  330. if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {
  331. InputStream is = bodyPart.getInputStream();
  332. saveFile(is, destDir, decodeText(bodyPart.getFileName()));
  333. } else if (bodyPart.isMimeType("multipart/*")) {
  334. saveAttachment(bodyPart,destDir);
  335. } else {
  336. String contentType = bodyPart.getContentType();
  337. if (contentType.indexOf("name") != -1 || contentType.indexOf("application") != -1) {
  338. saveFile(bodyPart.getInputStream(), destDir, decodeText(bodyPart.getFileName()));
  339. }
  340. }
  341. }
  342. } else if (part.isMimeType("message/rfc822")) {
  343. saveAttachment((Part) part.getContent(),destDir);
  344. }
  345. }
  346.  
  347. /**
  348. * 读取输入流中的数据保存至指定目录
  349. * @param is 输入流
  350. * @param fileName 文件名
  351. * @param destDir 文件存储目录
  352. * @throws FileNotFoundException
  353. * @throws IOException
  354. */
  355. private static void saveFile(InputStream is, String destDir, String fileName)
  356. throws FileNotFoundException, IOException {
  357. BufferedInputStream bis = new BufferedInputStream(is);
  358. BufferedOutputStream bos = new BufferedOutputStream(
  359. new FileOutputStream(new File(destDir + fileName)));
  360. int len = -1;
  361. while ((len = bis.read()) != -1) {
  362. bos.write(len);
  363. bos.flush();
  364. }
  365. bos.close();
  366. bis.close();
  367. }
  368.  
  369. /**
  370. * 文本解码
  371. * @param encodeText 解码MimeUtility.encodeText(String text)方法编码后的文本
  372. * @return 解码后的文本
  373. * @throws UnsupportedEncodingException
  374. */
  375. public static String decodeText(String encodeText) throws UnsupportedEncodingException {
  376. if (encodeText == null || "".equals(encodeText)) {
  377. return "";
  378. } else {
  379. return MimeUtility.decodeText(encodeText);
  380. }
  381. }
  382. }

5、使用IMAP协议收取邮件

  1. package cn.mail;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.InputStreamReader;
  5. import java.util.Properties;
  6.  
  7. import javax.mail.Flags.Flag;
  8. import javax.mail.Folder;
  9. import javax.mail.Message;
  10. import javax.mail.Session;
  11. import javax.mail.Store;
  12. import javax.mail.internet.MimeUtility;
  13.  
  14. import com.sun.mail.imap.IMAPMessage;
  15. import com.sun.mail.util.MailSSLSocketFactory;
  16.  
  17. /**
  18. * <b>使用IMAP协议接收邮件</b><br/>
  19. * <p>POP3和IMAP协议的区别:</p>
  20. * <b>POP3</b>协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,<br/>
  21. * 比如通过客户端收取了邮箱中的3封邮件并移动到其它文件夹,邮箱服务器上的这些邮件是没有同时被移动的。<br/>
  22. * <p><b>IMAP</b>协议提供webmail与电子邮件客户端之间的双向通信,客户端的操作都会同步反应到服务器上,对邮件进行的操作,服务
  23. * 上的邮件也会做相应的动作。比如在客户端收取了邮箱中的3封邮件,并将其中一封标记为已读,将另外两封标记为删除,这些操作会
  24. * 即时反馈到服务器上。</p>
  25. * <p>两种协议相比,IMAP 整体上为用户带来更为便捷和可靠的体验。POP3更易丢失邮件或多次下载相同的邮件,但IMAP通过邮件客户端
  26. * 与webmail之间的双向同步功能很好地避免了这些问题。</p>
  27. */
  28. public class IMAPmail {
  29.  
  30. public static void main(String[] args) throws Exception {
  31. // 准备连接服务器的会话信息
  32. Properties props = new Properties();
  33. props.setProperty("mail.store.protocol", "imap");
  34. props.setProperty("mail.imap.host", "imap.qq.com");
  35. props.setProperty("mail.imap.port", "993");
  36. //如果使用qq邮箱,需要加上下列代码,因为qq邮箱使用了ssl加密,下面代码是用来开启ssl加密的,而且密码也必须是qq邮箱生成的安全密码
  37. MailSSLSocketFactory sf = new MailSSLSocketFactory();
  38. sf.setTrustAllHosts(true);
  39. props.put("mail.imap.ssl.enable", "true");
  40. props.put("mail.imap.ssl.socketFactory", sf);
  41.  
  42. // 创建Session实例对象
  43. Session session = Session.getInstance(props);
  44.  
  45. //开启session的debug模式,这样就可以查看到程序发送Email的运行状态
  46. session.setDebug(true);
  47.  
  48. // 创建IMAP协议的Store对象
  49. Store store = session.getStore("imap");
  50.  
  51. // 连接邮件服务器
  52. store.connect(null,"1396799517@qq.com", "123456");
  53.  
  54. // 获得收件箱
  55. Folder folder = store.getFolder("INBOX");
  56. // 以读写模式打开收件箱
  57. folder.open(Folder.READ_WRITE);
  58.  
  59. // 获得收件箱的邮件列表
  60. Message[] messages = folder.getMessages();
  61.  
  62. // 打印不同状态的邮件数量
  63. System.out.println("收件箱中共" + messages.length + "封邮件!");
  64. System.out.println("收件箱中共" + folder.getUnreadMessageCount() + "封未读邮件!");
  65. System.out.println("收件箱中共" + folder.getNewMessageCount() + "封新邮件!");
  66. System.out.println("收件箱中共" + folder.getDeletedMessageCount() + "封已删除邮件!");
  67.  
  68. System.out.println("------------------------开始解析邮件----------------------------------");
  69.  
  70. // 解析邮件
  71. for (Message message : messages) {
  72. IMAPMessage msg = (IMAPMessage) message;
  73. String subject = MimeUtility.decodeText(msg.getSubject());
  74. System.out.println("[" + subject + "]未读,是否需要阅读此邮件(yes/no)?");
  75. BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  76. String answer = reader.readLine();
  77. if ("yes".equalsIgnoreCase(answer)) {
  78. POP3mail.parseMessage(msg); // 解析邮件,使用的是POP3中的解析函数。
  79. // 第二个参数如果设置为true,则将修改反馈给服务器。false则不反馈给服务器
  80. msg.setFlag(Flag.SEEN, true); //设置已读标志
  81. }
  82. }
  83. System.out.println("------------------------邮件解析结束----------------------------------");
  84. // 关闭资源
  85. folder.close(false);
  86. store.close();
  87. }
  88. }

6、发送带有附件的邮件

  要发送带有附件的邮件,只需要在发送邮件的内容中加上下面的语句。

  1. // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
  2. Multipart multipart = new MimeMultipart();
  3. // 添加邮件正文
  4. MimeBodyPart contentPart = new MimeBodyPart();
  5. contentPart.setContent("hi,This is my Email .i am LvBiao.", "text/html;charset=UTF-8");
  6. multipart.addBodyPart(contentPart);
  7. File attachment = new File("/home/lvbiao/java/j.txt");
  8. // 添加附件的内容
  9. if (attachment != null) {
  10. MimeBodyPart attachmentBodyPart = new MimeBodyPart();
  11. FileDataSource source = new FileDataSource(attachment);
  12. attachmentBodyPart.setDataHandler(new DataHandler(source));
  13. //MimeUtility.encodeWord可以避免文件名乱码
  14. attachmentBodyPart.setFileName(MimeUtility.encodeWord(attachment.getName()));
  15. multipart.addBodyPart(attachmentBodyPart);
  16. }
  17. // 将multipart对象放到message中
  18. message.setContent(multipart);
  19. // 保存邮件
  20. message.saveChanges();

java 邮件的更多相关文章

  1. JAVA邮件发送的简单实现

    JAVA MAIL是利用现有的邮件账户发送邮件的工具,比如说,我在网易注册一个邮箱账户,通过JAVA Mail的操控,我可以不亲自登录网易邮箱,让程序自动的使用网易邮箱发送邮件.这一机制被广泛的用在注 ...

  2. java邮件发送(以163邮箱为例)

    1.首先应该开通163邮箱的smtp和pop3,得到授权码 2.其次建立一个web项目,否则需要倒jar包mail.jar 3.创建一个类 4.注意:邮件内容必须为正式话语,否则系统会认为是垃圾邮件而 ...

  3. 传智播客张孝祥java邮件开发随笔01

    01_传智播客张孝祥java邮件开发_课程价值与目标介绍 02_传智播客张孝祥java邮件开发_邮件方面的基本常识 03_传智播客张孝祥java邮件开发_手工体验smtp和pop3协议 第3课时 关于 ...

  4. java-基于JavaMail的Java邮件发送

    1.基于JavaMail的Java邮件发送:简单邮件发送 2.基于JavaMail的Java邮件发送:复杂邮件发送

  5. web基础---->java邮件的发送

    这里记录一下关于java邮件发送代码的编写.你在我身边也好,在天边也罢,想到世界的角落有一个你,觉得整个世界也变得温柔安定了. java邮件的发送 一.直接贴出代码,如下: package com.c ...

  6. java 邮件发送工具类【来源网络自己已经实际应用】

    最近在做一个Java发送邮件的工具类,现在分享一下完整的代码 首先需要java邮件的包javax.mail-1.5.4.jar 之前因为链接给错了,很不好意思,现在重新发一次. 包在这里可以下载htt ...

  7. java邮件开发

    一.邮件协议: (重点)SMTP:发送邮件的协议.Simple Message Transfer Protocal.默认端口:25 POP:邮局协议(收件协议).Post Office Protoca ...

  8. 基于JavaMail的Java邮件发送:复杂邮件发送

    参考:http://blog.csdn.net/xietansheng/article/details/51722660package com.bfd.ftp.utils;import java.ut ...

  9. java邮件发送(含附件)

    1. [代码]java邮件发送(含附件)疯狂的IT人站长整理的:利用Java发送邮件(含附件)的例子:1.邮件发送的配置propertity文件内容如下:(utils.properties文件放在sr ...

  10. java邮件发送工具

    最近在web项目中,客户端注册时需要通过邮箱验证,服务器就需要向客户端发送邮件,我把发送邮件的细节进行了简易的封装: 在maven中需要导入: <!--Email--> <depen ...

随机推荐

  1. 【类不类二】Python的类变量与实例变量

    在研究类的时候,难免会有很多疑问,C论坛和博客园高手如云(不知道是不是也美女如云), 搜到了这篇博文,是介绍Python的类变量和实例变量的 ! 刚好在下对self.***这种形式的实例变 量不是很理 ...

  2. String 类上的常用操作

    java 中String 类上的常用操作: 首先创建对象  String line = new String("String demo"); String line2 = new ...

  3. 使用android的mediaplayer做成 一个demo,欢迎测试使用

    附件是为一个定制视频产品而简单的写了一个demo,用来说明android的mediaplayer是如何使用的. http://files.cnblogs.com/guobaPlayer/palyerD ...

  4. Java版求1000以内的完全数

    /* * 若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数,简称完数. * 例如:6=1+2+3. * 题目:求1000以内的完全数. */ public cl ...

  5. CADisplayLink使用中的循环引用问题的解决

    解决循环引用的问题,参考学习了ibireme大神的YYFPSLabel的实现,整理以备用 // 如果直接用 self 或者 weakSelf,都不能解决循环引用问题 _link = [CADispla ...

  6. pro asp.net mvc5

    mvc 架构的每一个部分都是定义良好和自包含的,称为关注分离.域模型和控制器逻辑与UI是松耦合的.模型中操作数据的逻辑仅包含在模型中,显示数据的逻辑仅包含在视图中,而处理用户请求和用户输入的代码仅包含 ...

  7. MVC视图路径修改方法

    http://wenku.baidu.com/link?url=MwAaKgGevU7hfRuTyCL95ZbJuDsNc4b__jEWisY9GuzAJzEUgEdoj7uQ-wurbYtz1IQj ...

  8. ubuntu tips

    1.ibus-setup 2.tips:

  9. Base64编码 图片与base64编码互转

    package com.education.util; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import jav ...

  10. 微信小程序入门——Mustache语法学习

    微信小程序中用到了大量Mustache语法,特发此文学习一下 1.简单的变量调换:{{name}} 1 var data = { "name": "Willy" ...