Java mail 邮件
来源:互联网 发布:淘宝跟踪物流查询系统 编辑:程序博客网 时间:2024/05/22 13:24
项目中有一个功能涉及到需要给筛选出来的人员发邮件,并且需要采用固定的格式和内容,在我们一般采用的java项目中如何采用Java技术同时向多个人发送邮件以及包含的附件,使用过程中采用过不同的代码,遇到过不同的问题,简单记录如下。
(一)采用的第一个方法,现在找不到之前采用的代码了,常见报错如下:
java mail使用过程中报错
报错
1 java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
解决方法
http://blog.163.com/yangzhanghui_job/blog/static/1795750622013214104659111/
2 553 You are not authorized to send mail, authentication is required e988b0d7-a399-4d54-9e7c-fd31cd3c
原因 ,服务器地址写的mail.163.com,修改成smtp.163.com
3 javax.mail.MessagingException: Could not connect to SMTP host: smtp.163.com, port: 25;
将收发邮件都改为了qq邮箱
4 503 Error: need EHLO and AUTH first !
(二)由于采用的第一个方法解决不了,又看第二个博客,实验方法成功。
转自:http://blog.csdn.net/linyiteng1220/article/details/2440586
1、SendMail类( 包含测试方法main)
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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;
public class SendMail {
public String toChinese(String text) {
try {
text = MimeUtility.encodeText(new String(text.getBytes(), "GB2312"), "GB2312", "B");
} catch (Exception e) {
e.printStackTrace();
}
return text;
}
public boolean sendMail(Mail mb) {
String host = mb.getHost();
final String username = mb.getUsername();
final String password = mb.getPassword();
String from = mb.getFrom();
String to = mb.getTo();
String subject = mb.getSubject();
String content = mb.getContent();
String fileName = mb.getFilename();
Vector<String> file = mb.getFile();
Properties props = System.getProperties();
props.put("mail.smtp.host", host); // 设置SMTP的主机
props.put("mail.smtp.auth", "true"); // 需要经过验证
Session session = Session.getInstance(props, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
InternetAddress[] address = {new InternetAddress(to)};
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject(toChinese(subject));
Multipart mp = new MimeMultipart();
MimeBodyPart mbpContent = new MimeBodyPart();
mbpContent.setText(content);
mp.addBodyPart(mbpContent);
/* 往邮件中添加附件 */
Enumeration<String> efile = file.elements();
while (efile.hasMoreElements()) {
MimeBodyPart mbpFile = new MimeBodyPart();
fileName = efile.nextElement().toString();
FileDataSource fds = new FileDataSource(fileName);
mbpFile.setDataHandler(new DataHandler(fds));
mbpFile.setFileName(toChinese(fds.getName()));
mp.addBodyPart(mbpFile);
}
msg.setContent(mp);
msg.setSentDate(new Date());
Transport.send(msg);
} catch (MessagingException me) {
me.printStackTrace();
return false;
}
return true;
}
public static void main(String[] args) {
Mail mb = new Mail();
mb.setHost("smtp.163.com"); // 设置SMTP主机(163),若用126,则设为:smtp.126.com
mb.setUsername("XXXXX"); // 设置发件人邮箱的用户名
mb.setPassword("XXXXX"); // 设置发件人邮箱的密码,需将*号改成正确的密码
mb.setFrom("XXXXX@163.com"); // 设置发件人的邮箱
mb.setTo("XXXXX@qq.com"); // 设置收件人的邮箱
mb.setSubject("测试_JavaMail"); // 设置邮件的主题
mb.setContent("本邮件中包含三个附件,请检查!"); // 设置邮件的正文
mb.attachFile("C:/Users/shuytu/Desktop/Z1303C.xls"); // 往邮件中添加附件
// mb.attachFile("E:/test.txt");
// mb.attachFile("E:/test.xls");
SendMail sm = new SendMail();
System.out.println("正在发送邮件...");
if(sm.sendMail(mb)) // 发送邮件
System.out.println("发送成功!");
else
System.out.println("发送失败!");
}
}
2、Mail类
package action;
import java.util.Vector;
public class Mail {
private String to; // 收件人
private String from; // 发件人
private String host; // SMTP主机
private String username; // 发件人的用户名
private String password; // 发件人的密码
private String subject; // 邮件主题
private String content; // 邮件正文
Vector<String> file; // 多个附件
private String filename; // 附件的文件名
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
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 String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public Vector<String> getFile(){
return file;
}
public void attachFile(String fileName) {
if(file == null)
file = new Vector<String>();
file.addElement(fileName);
}
}
3、添加jar包(最好是把这一步放在第一步进行)
示例中需要用到两个包:mail.jar和activation.jar,其下载地址为:
http://java.sun.com/products/javamail/downloads/index.html
http://java.sun.com/javase/technologies/desktop/javabeans/jaf/downloads/index.html
下载后解压,将mail.jar和activation.jar放到project里的lib文件夹中,为其配置环境变量,或在myEclipse里的"Java Build Path"中将其添加到"Libraries"。
4、可能会报错,如(一)中第一个问题解决
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
解决方法:
进到
E:\yangzh\myeclipse\Common\plugins\com.genuitec.eclipse.j2eedt.core_8.5.0.me201003231033\data\libraryset\EE_5
这个路径里,可以看到javaee.jar,用rar把这个文件打开,然后进到javax文件夹里,删除mail.jar和activation.jar(我的javaee.jar里,这两个东西是文件夹,总之删掉就OK,不过要注意备份一下)
删掉之后运行下面的代码,经行简单的修改以后就可以实现接收邮件的功能了!我已经测试过完全可行。
5、测试运行
附件也发送成功了,但是我们看到上面出现了中文乱码。
6、同时发送多个收件人,发送多个附件,实验成功。
将SendMail类修改为如下:
package action;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
import java.util.Vector;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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;
public class SendMail {
public String toChinese(String text) {
try {
text = MimeUtility.encodeText(new String(text.getBytes(), "GB2312"), "GB2312", "B");
} catch (Exception e) {
e.printStackTrace();
}
return text;
}
public boolean sendMail(Mail mb) {
String host = mb.getHost();
final String username = mb.getUsername();
final String password = mb.getPassword();
String from = mb.getFrom();
List<String> to = mb.getTo();
String subject = mb.getSubject();
String content = mb.getContent();
String fileName = mb.getFilename();
Vector<String> file = mb.getFile();
Properties props = System.getProperties();
props.put("mail.smtp.host", host); // 设置SMTP的主机
props.put("mail.smtp.auth", "true"); // 需要经过验证
Session session = Session.getInstance(props, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
for(int i=0;i<to.size();i++){
InternetAddress[] address = {new InternetAddress(to.get(i))};
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject(toChinese(subject));
Multipart mp = new MimeMultipart();
MimeBodyPart mbpContent = new MimeBodyPart();
mbpContent.setText(content);
mbpContent.setContent(content, "text/html;charset=GB2312");
mp.addBodyPart(mbpContent);
MimeMultipart mmp=new MimeMultipart();
mmp.setSubType( "GB2312");
/* 往邮件中添加附件 */
Enumeration<String> efile = file.elements();
while (efile.hasMoreElements()) {
MimeBodyPart mbpFile = new MimeBodyPart();
fileName = efile.nextElement().toString();
FileDataSource fds = new FileDataSource(fileName);
mbpFile.setDataHandler(new DataHandler(fds));
mbpFile.setFileName(toChinese(fds.getName()));
mp.addBodyPart(mbpFile);
}
msg.setContent(mp);
msg.setSentDate(new Date());
Transport.send(msg);
}
} catch (MessagingException me) {
me.printStackTrace();
return false;
}
return true;
}
public static void main(String[] args) {
Mail mb = new Mail();
mb.setHost("smtp.163.com"); // 设置SMTP主机(163),若用126,则设为:smtp.126.com
mb.setUsername("XXXXX"); // 设置发件人邮箱的用户名
mb.setPassword("XXXXX"); // 设置发件人邮箱的密码,需将*号改成正确的密码
mb.setFrom("XXXXX@163.com"); // 设置发件人的邮箱
List<String> to=new ArrayList<String>();
to.add("XXXXX@qq.com");
to.add("XXXXX@qq.com");
mb.setTo(to); // 设置收件人的邮箱
mb.setSubject("测试_JavaMail"); // 设置邮件的主题
mb.setContent("本邮件中包含三个附件,请检查!"); // 设置邮件的正文
mb.attachFile("C:/Users/shuytu/Desktop/是我的.xls"); // 往邮件中添加附件
mb.attachFile("C:/Users/shuytu/Desktop/一绪论文件.docx");
// mb.attachFile("E:/test.xls");
SendMail sm = new SendMail();
System.out.println("正在发送邮件...");
if(sm.sendMail(mb)) // 发送邮件
System.out.println("发送成功!");
else
System.out.println("发送失败!");
}
}
Mail类改为:
package action;
import java.util.List;
import java.util.Vector;
public class Mail {
private List<String> to; // 收件人
private String from; // 发件人
private String host; // SMTP主机
private String username; // 发件人的用户名
private String password; // 发件人的密码
private String subject; // 邮件主题
private String content; // 邮件正文
Vector<String> file; // 多个附件
private String filename; // 附件的文件名
public List<String> getTo() {
return to;
}
public void setTo(List<String> to) {
this.to = to;
}
public void setFile(Vector<String> file) {
this.file = file;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
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 String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public Vector<String> getFile(){
return file;
}
public void attachFile(String fileName) {
if(file == null)
file = new Vector<String>();
file.addElement(fileName);
}
}
但是出现收件邮件标题和附件标题中文乱码
7、解决中文乱码问题
。。。。。。找了好久还是没找到解决方案,待到以后解决再行发布。
- Java Mail 邮件类
- Java Mail 发送邮件
- JAVA MAIL发送邮件
- java mail 收发邮件
- java mail 收发邮件
- Java Mail 邮件 demo
- Java Mail 发送邮件
- java mail 发邮件
- Java mail发送邮件
- java mail 发送邮件
- Java Mail发送邮件
- java mail邮件发送
- java mail 发送邮件
- java mail邮件邮箱
- Java mail发送邮件
- java mail发送邮件
- Java mail 发送邮件
- java mail发送邮件
- unity技术之NGUI的功能实现(2)
- MyEclipse、eclipse代码自动补全
- iOS URL缓存策略------------NSURLCache、 NSURLRequest
- DirectUI容器布局之DialogLayout
- Query1常用
- Java mail 邮件
- Delphi DBGrid使用大全
- WebSokcet原理和使用
- LA4452 dfs及其应用(2-SAT)
- The Bookcase - POJ 3124 dp
- 创业公司期权怎么分配
- 谈谈final,finally,finalize的区别
- 建造者模式
- Ubuntu /etc/network/interface