javamail不能發送郵件,出現No provider for stmp錯誤,為什麼

Frank_Xu 2003-09-16 05:17:18
Bean代碼如下:
package mail;

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

public class sendmail {
String vto=""; //收件人
String vfrom="";//寄件人
String vhost=""; //smtp主機
String vfilename=""; //當前附件文件名
String vsubject=""; //主題
String vcc=""; //抄送
String vbcc=""; //暗送
String vbodycont=""; //郵件正文
String vuser=""; //用戶
String vpwd=""; //口令
Vector vfile = new Vector();//用於保存發送附件的檔案名的集合

public sendmail(){
this.vhost="smtp.xxx.com";
}

public sendmail(String szHost){
this.vhost=szHost;
}

public void SetSMTP(String szHost){//SMTP服務器
this.vhost=szHost;
}

public void SetFrom (String szFrom){//發信者
this.vfrom =szFrom;
}

public void SetTo(String szTo){ //收件人
this.vto=szTo;
}

public void SetCC(String szCC){ //抄送
this.vcc=szCC;
}

public void SetBCC(String szBcc){ //暗送
this.vbcc=szBcc;
}

public void SetSubject(String szSubject){ //主題
this.vsubject =szSubject;
}

public void SetContent(String szContent){ //內容
this.vbodycont =szContent;
}

//該方法用於收集附件名
public void attachfile(String fname){ //附件名
vfile.addElement(fname);
}

public void SetUserPwd(String szUser,String szPwd){ //設置用戶及口令
this.vuser =szUser;
this.vpwd=szPwd;
}

//開始發送信件的方法
public boolean startSend(){
Properties props = System.getProperties();//創建Properties對象
props.put("mail.smtp.host", this.vhost);//設置SMTP主機
props.put("mail.smtp.auth","true"); //stmp認證

Session session=Session.getDefaultInstance(props, null);//得到默認的郵件會話對象
try {
//javax.mail.internet.MimeMessage
MimeMessage msg = new MimeMessage(session);//創建Mime郵件對象,並初始化該消息的各項元素

msg.setFrom(new InternetAddress(vfrom)); //javax.mail.internet.InternetAddress
InternetAddress[] to_addr={new InternetAddress(vto)};
msg.setRecipients(Message.RecipientType.TO,to_addr);

if (vcc!=null && vcc.equals("")==false){
InternetAddress[] cc_addr={new InternetAddress(vcc)};
msg.setRecipients(Message.RecipientType.CC,cc_addr);
}

if(vbcc!=null && vbcc.equals("")==false){
InternetAddress[] bcc_addr={new InternetAddress(vbcc)};
msg.setRecipients(Message.RecipientType.BCC,bcc_addr);
}

msg.setSubject(vsubject); //郵件主題

//後面的BodyPart將加入到此處創建的Multipart中
Multipart mp = new MimeMultipart();//javax.mail.Multipart

BodyPart textBodyPart = new MimeBodyPart(); //增加郵件的正文內容
textBodyPart.setText(vbodycont);
mp.addBodyPart(textBodyPart);

//處理附件//java.util.Enumeration
Enumeration efile=vfile.elements();//利用枚舉器方便的遍曆集合
while(efile.hasMoreElements()){//檢查序列中是否還有更多的對象
MimeBodyPart mbp=new MimeBodyPart(); //javax.mail.internet.MimeBodyPart
vfilename=efile.nextElement().toString();//選擇出每一個附件名
FileDataSource fds=new FileDataSource(vfilename);//得到資料源
mbp.setDataHandler(new DataHandler(fds));//得到附件本身並至入BodyPart
mbp.setFileName(fds.getName());//得到檔案名同樣至入BodyPart
mp.addBodyPart(mbp);
}
vfile.removeAllElements();//移走集合中的所有元素
msg.setContent(mp);//Multipart加入到信件

msg.setSentDate(new Date());//設置信件頭的發送日期

//開始發送信件
Transport trs=session.getTransport("stmp");
trs.connect(this.vhost,this.vuser,this.vpwd);
trs.send(msg);
trs.close();
}
catch (MessagingException mex) {
mex.printStackTrace();
Exception ex = null;
if ((ex=mex.getNextException())!=null){
ex.printStackTrace();
}
return false;
}
return true;
}
}


發送的JSP代碼:
<%@ page contentType="text/html;charset=big5" language="java"%>
<jsp:useBean id="wmail" scope="page" class="mail.sendmail"/>
<%!
public String getStr(String str)
{
try{
String temp_p=str;
byte[] temp_t=temp_p.getBytes("ISO8859-1");
String temp=new String(temp_t);
return temp;
}
catch(Exception e){ e.printStackTrace();}
return "";
}
%>

<%
String szTo=request.getParameter("to"); //收件人地址
String szCC=request.getParameter("cc"); //抄送
String szBcc=request.getParameter("bcc"); //暗送
String szSubject=getStr(request.getParameter("subject")); //主題
String szContent=getStr(request.getParameter("content")); //郵件正文

wmail.SetSMTP("smtp.21cn.com"); //SMTP主機

String szFrom="user@21cn.com";

wmail.SetFrom(szFrom); //發件人地址
wmail.SetUserPwd("user","pwd");

wmail.SetTo(szTo); //收件者
if(szCC!=null && szCC.equals("")==false) wmail.SetCC(szCC); //抄送
if(szBcc!=null && szBcc.equals("")==false) wmail.SetBCC(szBcc);//暗送
wmail.SetSubject(szSubject); //主題
wmail.SetContent(szContent); //內容


//增加附件名單
wmail.attachfile("D:\附件1.zip");
wmail.attachfile("D:\附件2.zip");
wmail.attachfile("D:\附件3.zip");
wmail.attachfile("D:\附件4.zip");
wmail.attachfile("D:\附件5.zip");
.....更多附件.....


boolean bsend=wmail.startSend(); //開始發送郵件
if(bsend)
out.println("郵件發送成功");
else
out.println("郵件發送失敗");
%>


為什麼不能發送郵件?

通過後臺,發現如下錯誤:
javax.mail.NoSuchProviderException: No provider for stmp
at javax.mail.Session.getProvider(Session.java:289)
at javax.mail.Session.getTransport(Session.java:483
at javax.mail.Session.getTransport(Session.java:464
at mail.sendmail.startSend(sendmail.java:120)
...全文
588 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
caodavid2003 2003-09-18
  • 打赏
  • 举报
回复
若创建的地址只包含电子邮件地址,只要传递电子邮件地址到构造器就行了。


Address address = new InternetAddress("president@whitehouse.gov");


若希望名字紧挨着电子邮件显示,也可以把它传递给构造器:


Address address = new InternetAddress("president@whitehouse.gov", "George Bush");



三种预定义的地址类型是:

Message.RecipientType.TO
Message.RecipientType.CC
Message.RecipientType.BCC
如果消息是发给副总统的,同时发送一个副本(carbon copy)给总统夫人,以下做法比较恰当:


Address toAddress = new InternetAddress("vice.president@whitehouse.gov");
Address ccAddress = new InternetAddress("first.lady@whitehouse.gov");
message.addRecipient(Message.RecipientType.TO, toAddress);
message.addRecipient(Message.RecipientType.CC, ccAddress);


Frank_Xu 2003-09-18
  • 打赏
  • 举报
回复
怎沒人回復?
自已頂一下.
Frank_Xu 2003-09-18
  • 打赏
  • 举报
回复
已經自已解決.

謝謝各位支持.

結貼.
Frank_Xu 2003-09-18
  • 打赏
  • 举报
回复
發送時只能寫成trs.sendMessage(msg,msg.getRecipients(Message.RecipientType.TO));
寫成trs.send(msg);就出錯.


to: caodavid2003(骆驼祥子)按照你的方法還是不能抄送和暗送
Frank_Xu 2003-09-17
  • 打赏
  • 举报
回复
出現No provider for stmp錯誤原來是session的命名問題,
將seession改成mailsession後.
Transport trs=mailsession.getTransport("smtp");
trs.connect(this.host,this.user,this.pwd);
if (trs.isConnected()){
System.out.println("send ***********....");
trs.send(msg);
}
trs.close();

出現如下錯誤:
send ***********....
javax.mail.SendFailedException: Sending failed;
nested exception is:
javax.mail.AuthenticationFailedException
at javax.mail.Transport.send0(Transport.java:219)
at javax.mail.Transport.send(Transport.java:81)
at mail.sendmail.startSend(sendmail.java:131)
at org.apache.jsp.newmail_jsp._jspService(newmail_jsp.java:108)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:13
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

Frank_Xu 2003-09-17
  • 打赏
  • 举报
回复
我通過Bean中System.out.println()後臺輸入查看,
發現在
//開始發送信件
Transport trs=session.getTransport("stmp"); //這句就不能運行了
trs.connect(this.vhost,this.vuser,this.vpwd);
trs.send(msg);
trs.close();
這里開始出錯: No provider for stmp

請問怎樣解決?
Frank_Xu 2003-09-17
  • 打赏
  • 举报
回复
我已找到原因: trs.send(msg);
這句必須改成:trs.sendMessage(msg,msg.getRecipients(Message.RecipientType.TO));
就可以成功發送.



不知怎樣能夠實現抄送和暗送功能?
lightlee 2003-09-17
  • 打赏
  • 举报
回复
首先找个邮件服务器,建立一个油箱,通过OUTLOOK自己发送到自己,试试能否收发成功,
在这个基础上再进行JAVAMAIL的研究。
Frank_Xu 2003-09-16
  • 打赏
  • 举报
回复
我也在JSP中通過wmail.SetSMTP("smtp.21cn.com"); 設置了host
不知道為什麼會出現這個錯誤
littlecpu 2003-09-16
  • 打赏
  • 举报
回复
用过outlook或foxmail,有没有注意到建账号时有个选项:smtp服务器需要身分验证?

做一个类,继承自javax.mail.Authenticator,实现必要的方法,作为这个方法的参数:

javax.mail.Session.getInstance(java.util.Properties props, Authenticator authenticator)
yubing8 2003-09-16
  • 打赏
  • 举报
回复
最近倒分严重,所以过来混混分
runi 2003-09-16
  • 打赏
  • 举报
回复
props.put("mail.smtp.host", this.vhost);//設置SMTP主機
这一行中的this.vhost中的this.vhost="smtp.xxx.com";
代表什么?
把他换成smtp服务器的名字!
julian_zzx 2003-09-16
  • 打赏
  • 举报
回复
没用过javax.mail,但是看你的错误提示,应该和stmp服务器有关,可以考虑确定stmp的可用性。
嘿嘿,小弟,java新学,别介意:)
适用人群通用各大网易系,腾讯QQ系,新浪系,阿里系等主流邮箱;同时也适用于企业开发的企业邮箱,进行收件和发件。课程概述通用各大网易系,腾讯QQ系,新浪系,阿里系等主流邮箱;同时也适用于企业开发的企业邮箱,进行收件和发件。POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。   SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。。【开发者如何进行快速开发邮件发送系统???本课程系统进行快速研发,项目实战】 部分截图如下:完整版请查看课件或者视频

81,091

社区成员

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

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