09-09
22

javamail发送邮件

   在浪潮的时候公司有人写工作日报的时候用java实现了自动发邮件功能,公司的人都称他为才子。当时也觉得他很了不起得,现在才知道,原来用java实现发邮件功能是如此简单。

     java实现发邮件的功能是用j2ee技术javamail实现的。其实程序很简单,只有几十行的程序。最困难的反而是实现smtp服务器的设置,这和程序无关,而要在本机上设置。结果我在这一项上让我大费了一番周折。

     我的是yahoo邮箱,刚开始老是提示出错。在网上查的时候有的人说是因为yahoo邮箱不支持pop3功能。至于什么是pop3功能,大家可以到网上自己看下,大概就是说要实现outlook、foxmail这样的桌面程序来接发邮件就得用到pop3功能。没办法,只能申请了个126邮箱,结果一用还是不行,又到网上查,却有人说老的126的邮箱支持pop功能,去年之后的126邮箱不支持。还有些人说要一个月以后或者说积分达到一定值才可以实现,总之就是不行,真气死我了。又申请了个163邮箱,一用还是不行,仍然不支持pop功能。昨天搞了一下午仍然不行。今天仍然不死心,继续在网上查解决方法,总算有好心人给出了yahoo邮箱的解决方法。把网上别人介绍的方法贴在这:

1. 在IE地址栏中直接输人
http://edit.my.yahoo.com/config/set_popfwd?.src=ym,进人到YAHOO!“网上直投”的页面。


2. 在注册一项中选择“是”,然后选择你感兴趣的内容,其它的选项可以根据需要来选择,然后按"完成"按钮。

3. 选择“网上阅读邮件和POP功能”,其它选项可根据自己的需要选择,完成后按“提交”按钮。

4. 此时“网上直投”注册成功,系统会告诉你的“服务器设置”:
接收邮件(POP3)服务器:POP.MAIL.YAHOO.COM.CN
发送邮件(SMTP)服务器:SMTP.MAIL.YAHOO.COM.CN

注意:虽然每个雅虎信箱用户的POP和SMTP的地址都是相同的,但是用户如果不按上面的方法进行“网上直投”注册,仍然无法用POP和SMTP方式收发邮件的!

注:他说的第四点有可能不对,因为我最后在foxmail上设置pop3和mtp服务器时发现这个不对,应该是POP.MAIL.YAHOO.COM和SMTP.MAIL.YAHOO.COM才对。当然可能到别的地方又需要加上.cn的后缀了,因为我照着他的方法弄过两次,第一次提示的是:接收邮件(POP3)服务器:POP.MAIL.YAHOO.COM
发送邮件(SMTP)服务器:SMTP.MAIL.YAHOO.COM 结果也不行,我今天重试的时候又提示:接收邮件(POP3)服务器:POP.MAIL.YAHOO.COM.CN
发送邮件(SMTP)服务器:SMTP.MAIL.YAHOO.COM.CN

所以到底是怎么回事我也搞不清楚,反正能用就行了。



然后就是在foxmail上设置pop和smtp服务器器了。进入foxmail,点帐户—属性-邮件服务器:分别将发送邮件服务器(smtp)和POP3邮件服务器设置为SMTP.MAIL.YAHOO.COM和POP.MAIL.YAHOO.COM,勾选SMTP邮件服务器需要身份验证,点击设置:选择‘使用与POP3服务器相同的信息’,然后就可以了。接下来是原程序:

import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Multipart;
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 org.springframework.mail.MailSender;

public class JavaMail {
private MimeMessage mimeMsg;
private Session session;
private Properties props;
private boolean needAuth;
private String username;
private String password;
private Multipart mp;

public JavaMail(String smtp) {
  needAuth = false;
  username = "";
  password = "";
  setSmtpHost(smtp);
  createMimeMessage();
}

public void setSmtpHost(String hostName) {
  if (props == null)
   props = System.getProperties();
  props.put("mail.smtp.host", hostName);
}

public boolean createMimeMessage() {
  try {
   session = Session.getDefaultInstance(props, null);
  } catch (Exception e) {
   return false;
  }
  try {
   mimeMsg = new MimeMessage(session);
   mp = new MimeMultipart();
  } catch (Exception e) {
   return false;
  }
  return true;
}

public void setNeedAuth(boolean need) {
  if (props == null)
   props = System.getProperties();
  if (need)
   props.put("mail.smtp.auth", "true");
  else
   props.put("mail.smtp.auth", "false");
}

public void setNamePass(String name, String pass) {
  username = name;
  password = pass;
}

public boolean setSubject(String mailSubject) {
  try {
   mimeMsg.setSubject(mailSubject);
  } catch (Exception e) {
   return false;
  }
  return true;
}

public boolean setBody(String mailBody) {
  try {
   BodyPart bp = new MimeBodyPart();
   bp.setContent(
     "<meta http-equiv=Content-Type content=text/html; charset=gb2312>"
       + mailBody, "text/html;charset=GB2312");
   mp.addBodyPart(bp);
  } catch (Exception e) {
   return false;
  }
  return true;
}

public boolean addFileAffix(String filename) {
  try {
   BodyPart bp = new MimeBodyPart();
   FileDataSource fileds = new FileDataSource(filename);
   bp.setDataHandler(new DataHandler(fileds));
   bp.setFileName(fileds.getName());
   mp.addBodyPart(bp);
  } catch (Exception e) {
   return false;
  }
  return true;
}

public boolean setFrom(String from) {
  try {
   mimeMsg.setFrom(new InternetAddress(from));
  } catch (Exception e) {
   return false;
  }
  return true;
}

public boolean setTo(String to) {
  if (to == null)
   return false;
  try {
   mimeMsg.setRecipients(javax.mail.Message.RecipientType.TO,
     InternetAddress.parse(to));
  } catch (Exception e) {
   return false;
  }
  return true;
}

public boolean setCopyTo(String copyto) {
  if (copyto == null)
   return false;
  try {
   mimeMsg.setRecipients(javax.mail.Message.RecipientType.CC,
     InternetAddress.parse(copyto));
  } catch (Exception e) {
   return false;
  }
  return true;
}

public boolean sendout() {
  try {
   mimeMsg.setContent(mp);
   mimeMsg.saveChanges();
   Session mailSession = Session.getInstance(props, null);
   Transport transport = mailSession.getTransport("smtp");
   transport.connect((String) props.get("mail.smtp.host"), username,
     password);
   transport.sendMessage(mimeMsg, mimeMsg
     .getRecipients(javax.mail.Message.RecipientType.TO));
   transport.close();
  } catch (Exception e) {
   e.printStackTrace();
   return false;
  }
  return true;
}

public static void main(String[] args) throws Exception {
  JavaMail mailSender = new JavaMail("smtp.mail.yahoo.com");
  mailSender.setNeedAuth(true);
  mailSender.setSubject("javamail_test");
  mailSender.setBody("这是第三封封垃圾邮件");
  mailSender.setTo("yaoliang11@tom.com");
  mailSender.setFrom("kunpeng55@yahoo.com.cn");
  mailSender.setNamePass("kunpeng55", "password");
  mailSender.sendout();
  System.out.print("发送成功");
}

}
记得要添加两个jar包,分别是mail.jar和activation.jar。

这样就可以了

至于要实现自动发邮件功能,应该只要使用apache公司的quartz组件就可以实现



文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: javamail
相关日志:
评论: 0 | 引用: 0 | 查看次数: 308
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭