求助:好心大哥大姐帮帮小弟忙,在此谢谢了!!!

YaphetS_sY 2011-12-13 10:17:25
我写了一个用Common-fileup实现的带附件的邮件发送程序 但是每次运行都会报错。。。
首先运行tomcat 进入到attachMail.htm 代码如下:

<html>
<head>
<title>发送带附件HTML型邮件</title>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
</head>

<body>
<h2>发送带附件HTML型邮件</h2>
<hr>
<form name="form1" enctype="multipart/form-data" method="post" action="ApacheUpload">
SMTP服务器:<input type="text" id="SMTPHost" name="SMTPHost">*<br>
登录帐号:<input type="text" id="user" name="user">*<br>
登录密码:<input type="password" id="password" name="password">*<br>
<br>
发件人邮箱:<input type="text" id="from" name="from">*<br>
收件人邮箱:<input type="text" id="to" name="to">*<br>
邮件标题:<input type="text" id="subject" name="subject">*<br>
邮件内容HTML代码:<textarea id="content" name="content" rows="5" cols="40"></textarea>*<br>
附件:<input type="file" id="filename" name="filename"><br>
<br>
<input type="submit" name="submit" value="发送"> 
<input type="reset" name="reset" value="重填">
</form>
</body>
</html>
然后提交表单发送到ApacheUpload.java 代码如下:

package test1;

import java.util.*;
import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.io.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.servlet.*;
import org.apache.commons.fileupload.disk.*;
import javax.mail.Authenticator;

public class ApacheUpload extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
String filename = null;
String extName;
String fullName;
String oldFileName;
String uploadPath;
request.setCharacterEncoding("gb2312");
response.setContentType("text/html;chartset=gb2312");
PrintWriter out = response.getWriter();
ServletContext context = this.getServletContext();
DiskFileItemFactory fact = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(fact);
upload.setFileSizeMax(10 * 1024 * 10);

List<FileItem> list = null;

try {
list = upload.parseRequest(request);
FileItem item = list.get(7);
long size = item.getSize();
fullName = item.getName();
oldFileName = fullName.substring(fullName.lastIndexOf("\\") + 1);
extName = oldFileName.substring(oldFileName.lastIndexOf("."));
String newFileName = System.currentTimeMillis() + ""
+ (int) ((1000 - 1 + 1) * Math.random() + 1) + extName;
uploadPath = context.getRealPath("/upload");
filename = uploadPath + File.separator + newFileName;
File file = new File(filename);
try {
item.write(file);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

SendAttachMail sam = new SendAttachMail();
sam.setUser(request.getParameter(list.get(1).getString()));
sam.setPassword(request.getParameter(list.get(2).getString()));
sam.setContent(request.getParameter(list.get(6).getString()));
sam.setSubject(request.getParameter(list.get(5).getString()));
sam.setFrom(request.getParameter(list.get(3).getString()));
sam.setTo(request.getParameter(list.get(4).getString()));
sam.setSMTPHost(list.get(0).getString());
sam.setFilename(filename);
boolean status = sam.send();
if (status) {
out.println("<html>");
out.println("<body>");
out.println("true");
out.println("</body>");
out.println("</html>");
} else {
out.println("<html>");
out.println("<body>");
out.println("false");
out.println("</body>");
out.println("</html>");
}
}

}

然后在ApacheUplo.java中调用发送邮件的方法,方法封装在SendAttachMail.java文件中 代码如下:

package test1;

import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.util.*;
import javax.mail.Authenticator;

public class SendAttachMail {

String SMTPHost=""; //SMTP服务器
String user=""; //登录SMTP服务器的帐号
String password=""; //登录SMTP服务器的密码

String from =""; //发件人邮箱
String to =""; //收件人邮箱
String subject =""; //邮件标题
String content =""; //邮件内容
String filename =""; //附件文件名

//无参数构造方法
public SendAttachMail() {}

public String getContent() {
return content;
}
public void setContent(String content) {
// try{
// //解决内容的中文问题
// content = new String(content.getBytes("ISO8859-1"),"gb2312");
// }catch(Exception ex){
// ex.printStackTrace();
// }
this.content = content;
}

public String getFilename() {
return filename;
}
public void setFilename(String filename) {
try{
//解决文件名的中文问题
filename = new String(filename.getBytes("ISO8859-1"),"gb2312");
}catch(Exception ex){
ex.printStackTrace();
}
//将文件路径中的'\'替换成'/'
filename = filename.replaceAll("\\\\","/");
this.filename = filename;
}

public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}

public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

public String getSMTPHost() {
return SMTPHost;
}
public void setSMTPHost(String host) {
SMTPHost = host;
}

public String getSubject() {
return subject;
}
public void setSubject(String subject) {
// try{
// //解决标题的中文问题
// subject = new String(subject.getBytes("ISO8859-1"),"gb2312");
// }catch(Exception ex){
// ex.printStackTrace();
// }
this.subject = subject;
}

public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}

public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}

//发送邮件
public boolean send(){
//创建一个属性对象
Properties props = new Properties();
//指定SMTP服务器
props.put("mail.smtp.host", SMTPHost);
//指定是否需要SMTP验证
props.put("mail.smtp.auth", "true");
try{
//创建一个授权验证对象
SmtpAuth auth = new SmtpAuth();
auth.setAccount(user,password);

//创建一个Session对象
Session mailSession = Session.getInstance(props,auth);
mailSession.setDebug(true);

//创建一个MimeMessage 对象
MimeMessage message=new MimeMessage(mailSession);

//指定发件人邮箱
message.setFrom(new InternetAddress(from));
//指定收件人邮箱
message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
//指定邮件主题
message.setSubject(subject);
//指定邮件发送日期
message.setSentDate(new Date());
//指定邮件优先级 1:紧急 3:普通 5:缓慢
message.setHeader("X-Priority","1");
message.saveChanges();

//新建一个MimeMultipart对象用来存放多个BodyPart对象
Multipart container=new MimeMultipart();
//新建一个存放信件内容的BodyPart对象
BodyPart textBodyPart=new MimeBodyPart();
//给BodyPart对象设置内容和格式/编码方式
textBodyPart.setContent(content,"text/html;charset=gb2312");
//将含有信件内容的BodyPart加入到MimeMultipart对象中
container.addBodyPart(textBodyPart);

//新建一个存放信件附件的BodyPart对象
BodyPart fileBodyPart=new MimeBodyPart();
//将本地文件作为附件
FileDataSource fds=new FileDataSource(filename);
fileBodyPart.setDataHandler(new DataHandler(fds));
//处理邮件中附件文件名的中文问题
String attachName = fds.getName();
attachName = new String(attachName.getBytes("gb2312"),"ISO8859-1");
//设定附件文件名
fileBodyPart.setFileName(attachName);
//将附件的BodyPart对象加入到container中
container.addBodyPart(fileBodyPart);

//将container作为消息对象的内容
message.setContent(container);

//创建一个Transport对象
Transport transport = mailSession.getTransport("smtp");
//连接SMTP服务器
transport.connect(SMTPHost, user, password);
//发送邮件
transport.send(message, message.getAllRecipients());
transport.close();
return true;
}catch(Exception ex){
ex.printStackTrace();
return false;
}
}

//定义一个SMTP授权验证类
class SmtpAuth extends Authenticator{
String user,password;
//设置帐号信息
void setAccount(String user,String password){
this.user = user;
this.password = password;
}
//取得PasswordAuthentication对象
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(user,password);
}
}
}
运行结果如下,哥哥们 姐姐们 这是为什么啊 我是初学者,不明白哪里出错了:

DEBUG: setDebug: JavaMail version 1.3.1
java.lang.NullPointerException
at javax.mail.internet.InternetAddress.parse(InternetAddress.java:569)
at javax.mail.internet.InternetAddress.parse(InternetAddress.java:529)
at javax.mail.internet.InternetAddress.<init>(InternetAddress.java:65)
at test1.SendAttachMail.send(SendAttachMail.java:121)
at test1.ApacheUpload.doPost(ApacheUpload.java:71)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)

...全文
157 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
对java有感觉 2011-12-16
  • 打赏
  • 举报
回复
当然了为空啊
你看看你没有判断一下你从jsp页面传过来的数据有的是表单格式的有的是文件格式的你需要判断下
ist<FileItem> list = upload.parseRequest(request);
for (FileItem item : list)
{
if (!item.isFormField())
{
String name = item.getFieldName();
String value = item.getName();
int start = value.lastIndexOf("\\");
String fileName = value.substring(start + 1);
item.write(new File(path,fileName));
}
}
你尝试下看看
dracularking 2011-12-16
  • 打赏
  • 举报
回复
调试很容易找
at test1.SendAttachMail.send(SendAttachMail.java:121)

SendAttachMail类121行
YaphetS_sY 2011-12-16
  • 打赏
  • 举报
回复
sam.setUser(request.getParameter(list.get(1).getString()));
sam.setPassword(request.getParameter(list.get(2).getString()));
sam.setContent(request.getParameter(list.get(6).getString()));
sam.setSubject(request.getParameter(list.get(5).getString()));
sam.setFrom(request.getParameter(list.get(3).getString()));
sam.setTo(request.getParameter(list.get(4).getString()));
sam.setSMTPHost(list.get(0).getString());
中的list.get()方法是从表单中提取参数啊。。。。。。还是不好使啊
qq76734192 2011-12-15
  • 打赏
  • 举报
回复
好长啊
YaphetS_sY 2011-12-15
  • 打赏
  • 举报
回复
没有啊 我sam.setSMTPHost(list.get(0).getString());
过了啊
金先生1 2011-12-14
  • 打赏
  • 举报
回复
java.lang.NullPointerException
空指针异常,看看这里。
test1.SendAttachMail.send(SendAttachMail.java:121)
xiachedan 2011-12-14
  • 打赏
  • 举报
回复
java.lang.NullPointerException
空指针异常.

调试一下,看看运行过程中哪个对象为空了.
  • 打赏
  • 举报
回复
你smtp地址 为空吧?

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧