09-09
22
javamail发送邮件
作者:Java伴侣 日期:2009-09-22
在浪潮的时候公司有人写工作日报的时候用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组件就可以实现
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组件就可以实现
评论: 0 | 引用: 0 | 查看次数: 359
发表评论