我刚开始了解发送邮件的程序,想做一个简单的发送邮件的程序(不带附件),我是按照书上的例子
用编写底层代码方式,和用javamail的api的方式都作了尝试,但是当程序运行的时候,我所登陆的几个smtp服务器都发回“您没有权限发送邮件(翻译)”(smtp.163.com, smtp.sina.com.cn)。我不明白
为什么发邮件还需要权限呢?
请问谁有已调试成功的代码让我参考以下?谢谢!
用编写底层代码方式,和用javamail的api的方式都作了尝试,但是当程序运行的时候,我所登陆的几个smtp服务器都发回“您没有权限发送邮件(翻译)”(smtp.163.com, smtp.sina.com.cn)。我不明白
为什么发邮件还需要权限呢?
请问谁有已调试成功的代码让我参考以下?谢谢!
你去找那些免费的试试。
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.163.com");
props.put("mail.smtp.auth", "true");
.....
之后就是输入base64编码之后的用户名和密码.
props.put("mail.smtp.auth","true");
//输入用户名和密码
transport.connect((String)props.get("mail.smtp.host"),"name","password");
下面简单说一下使用socket怎么和smtp回话的.首先是客户端主动连接smtp服务器, 一般端口是25, 服务器使用dns s例如smtp.163.net
这是服务器应该返回220为正确以下是用telnet smtp.tom.com 25
----------------------------------------------
220 Coremail SMTP(Anti Spam) System (163net[040302])
HELO
501 CoremailSys:Syntax: HELO hostname
HELO [email protected]
250 bjapp41
RSET
250 Ok
AUTH LOGIN
334 VXNlcm5hbWU6
这里输入base64编码后的用户名
服务器返回334
这里输入base编码后的密码
正确则服务器返回334
MAIL FROM :<[email protected]>
250返回码
RCPT TO:<收件人@aaa.com>
250返回码
DATA
354返回码, 之后用户久输入整个邮件的内容以为.结束
FROM: [email protected]
TO:收件人
SUBJECT:主题
""
邮件内容
. 结束
期待250返回码
QUIT
期待221返回码以下是代码, 但是当然的乱码问题什么肯定是会有的, 因为没标记编码.
你使用foxmail等收邮件原始邮件的内容.
//不用javaMail发送邮件
import java.net.*;
import java.io.*;
import java.util.*;
//import javax.mail.*;
//import javax.mail.internet.*;public class SmtpTalk {
BufferedReader is;
PrintStream os;
private boolean debug=true;
private String host;
sun.misc.BASE64Encoder enc;
private String user;
private String psw;
public static void main(String[] argv){
if(argv.length!=2){
System.out.println("Usage:java SmtpTalk host user");
System.exit(1);
}
try{
SmtpTalk st=new SmtpTalk(argv[0]);
System.out.println("Smtp Talker ready");
st.converse("[email protected]",argv[1],"Test message",
"helo there");
}catch(Exception ig){
System.err.println(ig.getMessage());
System.exit(1);
}
}
SmtpTalk(String Server){
host=Server;
enc = new sun.misc.BASE64Encoder();
user=new String("madass");
psw=new String ("xinxin");
try{
Socket s=new Socket(host,25);
is=new BufferedReader(new InputStreamReader(s.getInputStream()));
os=new PrintStream(s.getOutputStream());
}
catch(NoRouteToHostException e){
die(/*EX_TEMPFAIL*/1,"No route to host "+host);
}
catch(ConnectException e){
die(/*EX_TEMPFAIL*/1,"Connection Refused by"+host);
}
catch(UnknownHostException e){
die(/*EX_NOHOST*/2,"Unknown host "+host);
}
catch(IOException e){
die(/*EX_IOERR*/3,"I/O error setting up socket stream\n"+e);
}
}
protected void send_cmd (String cmd,String oprnd){
send_cmd(cmd+" "+oprnd);
}
protected void send_cmd(String cmd){
if(debug)
System.out.println(">>>"+cmd);
os.print(cmd+"\r\n");
}
public void send_text(String text){
os.print(text+"\r\n");
}
protected boolean expect_reply(String rspNum) /*throw SMTPException*/{
String s=null;
try{
s=is.readLine();
}catch(IOException e){
die(/*EX_IOERR*/3,"I/o error reading from host"+host+" "+e);
}
if(debug) System.out.println("<<<"+s);
return s.startsWith(rspNum+" ");
}
protected void die(int ret,String msg)/* throw SMTPException*/{
//throw new SMTPException (ret,msg);
}
public void converse(String sender,String recipients,String subject,String body) /*throw SMTPException*/{
if(!expect_reply("220")) die(/*EX_PROTOCOL*/4,"did not get SMTP greeting");
send_cmd("HELO","[email protected]");
if(!expect_reply("250")) die(/*EX_PROTOCOL*/4,"did not get ack our HELO");
send_cmd("RSET");
if(!expect_reply("250")) die (/*EX_PROTOCOL*/4,"not reset");
send_cmd("AUTH LOGIN");
if(!expect_reply("334")) die (/*EX_PROTOCOL*/4,"not reset");
send_cmd(enc.encode(user.getBytes()));
if(!expect_reply("334")) die (/*EX_PROTOCOL*/4,"not reset");
send_cmd(enc.encode(psw.getBytes()));
if(!expect_reply("334")) die (/*EX_PROTOCOL*/4,"not reset");
send_cmd("MAIL","From:<"+sender+">");
if(!expect_reply("250")) die (/*EX_PROTOCOL*/4,"did not ack our MAIL command");
//StringTokenizer st=new StringTokenizer(recipients);
//while(st.hasMoreTokens()){
//String r=st.nextToken();
send_cmd("RCPT","To:<"+recipients+">");
if(!expect_reply("250"))
die(/*EX_PROTOCOL*/4,"did not ack RECP");
//}
send_cmd("DATA");
if(!expect_reply("354")) die(/*EX_PROTOCOL*/4,"did not want our data");
send_text("From: "+sender);
send_text("To: "+recipients);
send_text("Subject: "+subject);
send_text("");
send_text(body+"\r");
send_cmd(".");
if(!expect_reply("250")) die(/*EX_PROTOCOL*/4,"mail not accepted");
send_cmd("QUIT");
if(!expect_reply("221")) die(/*EX_PROTOCOL*/4,"Other end not closing down");
}
}
利用126邮箱提供的服务来发送邮件,但是必须通过邮箱认证
<%@ page import="javax.mail.*" %>
<%@ page import="javax.mail.internet.*" %>
<%@ page import="javax.activation.*" %>
<%@ page import="java.util.*,java.io.*" %>
<%@ page contentType="text/html;charset=GB2312" %><html>
<head>
<title>JavaMail.jsp</title>
</head>
<body><h2>利用JavaMail来传送电子邮件 </h2>
<%
InternetAddress[] address = null; request.setCharacterEncoding("GB2312"); String mailserver= "smtp.126.com";
String From= request.getParameter("From");
String to= request.getParameter("To");
String Subject= request.getParameter("Subject");
String Username=request.getParameter("username");
String Password =request.getParameter("password");
String messageText= request.getParameter("Message");
boolean sessionDebug = false;
try
{
java.util.Properties props = System.getProperties();
props.put("mail.host",mailserver);//服务器
props.put("mail.smtp.auth","true");//服务器需通过认证
props.put("mail.smtp.host",mailserver);
props.put("mail.transport.protocol","smtp");//传输协议为SMTP
javax.mail.Session mailSession = javax.mail.Session.getDefaultInstance(props);
mailSession.setDebug(sessionDebug);
Message msg = new MimeMessage(mailSession);
msg.setFrom(new InternetAddress(From)); address = InternetAddress.parse(to,false);
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject(Subject); msg.setSentDate(new Date());
msg.setText(messageText);
msg.saveChanges();
//编程实现通过SMTP发信认证---SMTP认证就是输入你在SMTP服务器上的用户名称和密码
Transport transport = mailSession.getTransport("smtp");
transport.connect(mailserver,Username,Password);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
out.println("邮件顺利传送");
}
catch(MessagingException mex)
{
mex.printStackTrace();
}
%></body>
</html> 如何使用代码编程实现通过SMTP发信认证呢?SMTP认证就是输入你在SMTP服务器上的用户名称和密码,
String Username =request.getParameter("username");
String Password =request.getParameter("password");
假设SMTP服务器为String mailserver = "smtp.126.com";
则:
try {
java.util.Properties props = System.getProperties();
props.put("mail.host",mailserver);//服务器
props.put("mail.smtp.auth","true");//服务器需通过认证
props.put("mail.smtp.host",mailserver);
props.put("mail.transport.protocol","smtp");//传输协议为SMTP
javax.mail.Session mailSession = javax.mail.Session.getDefaultInstance(props);
mailSession.setDebug(sessionDebug);//创建对话
Message msg = new MimeMessage(mailSession);//创建信息
msg.setFrom(new InternetAddress(From)); address = InternetAddress.parse(to,false);
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject(Subject); msg.setSentDate(new Date());
msg.setText(messageText);
msg.saveChanges();
Transport transport = mailSession.getTransport("smtp");
transport.connect(mailserver,Username,Password);//链接服务器,
//此处为方法固定格式,即:服务器名,用户
//名,密码
transport.sendMessage(msg, msg.getAllRecipients());//发送
transport.close();
out.println("邮件顺利传送");
}
catch (MessagingException mex) { mex.printStackTrace();
}