java-邮件发送接收和删改

来源:互联网 发布:织梦cms怎么更换模板 编辑:程序博客网 时间:2024/05/19 09:02

java对邮件的操作需要用到  javax.mail的jar包,我用的1.4.7的版本

对邮箱的要求呢,就是要设置邮箱的

POP3/SMTP/IMAP 把这些服务打上√就ok了。

这三个协议什么区别呢?

可以参考这里http://edm.ishang.net/faq/detail/the-imap-protocol.html

然后看下java中的写法

import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.Properties;import javax.activation.DataHandler;import javax.activation.DataSource;import javax.activation.FileDataSource;import javax.mail.Authenticator;import javax.mail.BodyPart;import javax.mail.Flags;import javax.mail.Folder;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.Multipart;import javax.mail.Part;import javax.mail.PasswordAuthentication;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;import javax.mail.internet.MimeUtility;import org.apache.log4j.LogManager;import org.apache.log4j.Logger;import com.sun.mail.imap.IMAPFolder;import com.sun.mail.imap.IMAPStore;public class EmailUtility {/** * 发送邮件 *  * @return 成功返回true,失败返回false */static Logger logger = LogManager.getLogger(EmailUtility.class.getName());public static boolean sendMail(String destAddress, String subject,String content) {return sendMail(destAddress, subject, content, new ArrayList<String>());}public static boolean sendMail(String destAddress, String subject,String content, String attachment) {List<String> attachments = new ArrayList<String>();attachments.add(attachment);return sendMail(destAddress, subject, content, attachments);}public static boolean sendMail(String destAddress, String subject,String content, List<String> attachments) {EmailUtility.MailInfo mail = new EmailUtility.MailInfo();mail.setTo(destAddress);mail.setSubject(subject);mail.setContent(content);mail.setAttachments(attachments);return sendMail(mail);}/** * 发送邮件 *  * @return 成功返回true,失败返回false */public static boolean sendMailDirectly(String destAddress, String subject,String content) {return sendMailDirectly(destAddress, subject, content, null);}public static boolean sendMailDirectly(String destAddress, String subject,String content, List<String> attachments) {EmailUtility.MailInfo mail = new EmailUtility.MailInfo();mail.setTo(destAddress);mail.setSubject(subject);mail.setContent(content);mail.setAttachments(attachments);return sendMailDirectly(mail);}public static boolean sendMail(MailInfo mail) {MutiThreadSender sender = new EmailUtility.MutiThreadSender(mail);Thread thread = new Thread(sender);thread.start();return true;}public static boolean sendMailDirectly(final MailInfo mail) {// 构造mail sessionProperties props = System.getProperties();props.put("mail.smtp.host", mail.getHost());props.put("mail.smtp.auth", "true");Session session = Session.getDefaultInstance(props,new Authenticator() {public PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(mail.getUsername(),mail.getPassword());}});try {// 构造MimeMessage并设定基本的值,创建消息对象MimeMessage msg = new MimeMessage(session);// 设置消息内容msg.setFrom(new InternetAddress(mail.getFrom(), MimeUtility.encodeText(mail.getFromName(), "UTF-8", "B")));// 把邮件地址映射到Internet地址上InternetAddress[] address = { new InternetAddress(mail.getTo()) };/** * setRecipient(Message.RecipientType type, Address * address),用于设置邮件的接收者。<br> * 有两个参数,第一个参数是接收者的类型,第二个参数是接收者。<br> * 接收者类型可以是Message.RecipientType .TO,Message * .RecipientType.CC和Message.RecipientType.BCC,TO表示主要接收人,CC表示抄送人 * ,BCC表示秘密抄送人。接收者与发送者一样,通常使用InternetAddress的对象。 */msg.setRecipients(Message.RecipientType.TO, address);// 设置邮件的标题String subject = mail.getSubject();try {subject = MimeUtility.encodeText(subject, "UTF-8", "B");} catch (UnsupportedEncodingException e) {logger.error(String.format("mail.smtp.host:%s", mail.getHost()), e);e.printStackTrace();}msg.setSubject(subject);// 构造MultipartMultipart mp = new MimeMultipart();// 向Multipart添加正文MimeBodyPart mbpContent = new MimeBodyPart();// 设置邮件内容(纯文本格式)// mbpContent.setText(content);// 设置邮件内容(HTML格式)mbpContent.setContent(mail.getContent(), "text/html;charset=utf-8");// 向MimeMessage添加(Multipart代表正文)mp.addBodyPart(mbpContent);// 向Multipart添加MimeMessage// 添加附件的内容if (mail.getAttachments() != null) {for (String file : mail.getAttachments()) {File attachment = new File(file);if (attachment.exists()) {BodyPart attachmentBodyPart = new MimeBodyPart();DataSource source = new FileDataSource(attachment);attachmentBodyPart.setDataHandler(new DataHandler(source));// MimeUtility.encodeWord可以避免文件名乱码attachmentBodyPart.setFileName(MimeUtility.encodeText(attachment.getName(), "UTF-8", "B"));// attachmentBodyPart.setFileName(MimeUtility.encodeWord(attachment.getName()));mp.addBodyPart(attachmentBodyPart);}}}msg.setContent(mp);// 设置邮件发送的时间。msg.setSentDate(new Date());// 发送邮件Transport.send(msg);} catch (Exception e) {logger.error(String.format("mail.smtp.host:%s, to:%s",mail.getHost(), mail.getTo()), e);e.printStackTrace();return false;}return true;}public static class MutiThreadSender implements Runnable {private MailInfo mail;public MutiThreadSender(MailInfo mail) {this.mail = mail;}@Overridepublic void run() {try {EmailUtility.sendMailDirectly(this.mail);} catch (Exception e) {logger.error("", e);e.printStackTrace();}}}public static class MailInfo {String from = "邮箱地址"; // 发件人String fromName = "发件人姓名";String host = "根据邮箱类型选择对应主机<span style="font-family: Arial, Helvetica, sans-serif;">smtp.163.com"; // smtp主机</span>String username = "邮箱地址"; // 用户名String password = "密码"; // 密码String to = ""; // 收件人String subject = ""; // 邮件主题String content = ""; // 邮件正文List<String> attachments;public MailInfo() {}public MailInfo(String from, String host, String username,String password) {this.from = from;this.host = host;this.username = username;this.password = password;}public String getFrom() {return from;}public String getFromName() {return fromName;}public String getHost() {return host;}public String getUsername() {return username;}public String getPassword() {return password;}public String getTo() {return to;}public void setTo(String to) {this.to = to;}public String getSubject() {return subject;}public void setSubject(String subject) {this.subject = subject;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public List<String> getAttachments() {return attachments;}public void setAttachments(List<String> attachments) {this.attachments = attachments;}}<pre name="code" class="java">public static void getfileFromEmail() {try {// 设置连接信息,生成一个sessionProperties props = new Properties();props.setProperty("mail.imap.host", "imap.163.com");//可以选择不同的协议pop3(imap支持读写)props.setProperty("mail.imap.auth.plain.disable","true");Session session = Session.getInstance(props,null);session.setDebug(false);// 获取store并连接服务器IMAPStore store = (IMAPStore) session.getStore("imap");store.connect("imap.163.com","邮箱地址","密码");IMAPFolder popFolder = (IMAPFolder) store.getFolder("INBOX");popFolder.open(Folder.READ_WRITE);// 可读写邮件int n = 0;Message[] messages = popFolder.getMessages();//获取所有邮件,至于下面要做什么就随便了Message对象有邮件的所有信息
<span style="white-space:pre"></span>//我这里是获取附件的System.out.println(popFolder.getMessageCount());for (int i = 0; i < messages.length; i++) {Object o = messages[i].getContent();if (o instanceof Multipart) {Multipart multipart = (Multipart) o;file = reMultipart(multipart);//解析邮件} else if (o instanceof Part) {Part part = (Part) o;file = rePart(part);//解析邮件} else {logger.error("附件类型" + messages[i].getContentType());}n = i;}//EmailUtility.sendMail("490639212@qq.com", messages[n].getSubject(),//"备份", file);messages[n].setFlag(Flags.Flag.DELETED, true);//messages[n].saveChanges();//这一步网上说是保存删除操作的,但是没有这一步反而不会报错,还没懂popFolder.close(true);store.close();} catch (MessagingException e) {logger.error("获取store或连接服务器出错");e.printStackTrace();} catch (IOException e) {logger.error("获取附件时出错");e.printStackTrace();}}private static String reMultipart(Multipart multipart)throws MessagingException, IOException {// System.out.println("邮件共有" + multipart.getCount() + "部分组成");for (int j = 0, n = multipart.getCount(); j < n; j++) {Part part = multipart.getBodyPart(j);if (part.getContent() instanceof Multipart) {Multipart p = (Multipart) part.getContent();reMultipart(p);} else {return rePart(part);}}return null;}private static String rePart(Part part) throws MessagingException,IOException {if (part.getDisposition() != null) {String strFileName = MimeUtility.decodeText(part.getFileName());// 解决附件名乱码问题logger.error("附件名:" + strFileName);logger.error("内容类型:" + part.getContentType());InputStream in = part.getInputStream();// 打开附件输入流// 读取文件字节并存储在文件中FileOutputStream out = new FileOutputStream(strFileName);//保存到你需要的地址int data;while ((data = in.read()) != -1) {out.write(data);}in.close();out.close();return strFileName;} else {return part.getFileName();}}
}


上面的logger只是打日志用的。跟发收邮件没关系。

还可以做邮件监听,筛选之类的

0 0
原创粉丝点击