java使用Socket实现SMTP协议发送邮件

网友投稿 315 2023-07-16


java使用Socket实现SMTP协议发送邮件

本文实例为大家分享了java 利用Socket实现SMTP协议发送邮件的具体代码,供大家参考,具体内容如下

package mail;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintWriter;

import java.io.Reader;

import java.net.Socket;

import java.util.ArrayList;

import java.util.List;

import org.apache.commons.codec.binary.Base64;

public class Mail {

public static void main(String[] args) throws IOException {

Mail mail = new Mail();

mail.setSmtpServer("smtp.qq.com");

mail.setFromMail("1344364****@qq.com");

mail.addToMail("105648****@qq.com");

mail.addToMail("long*****@sina.com");

mail.setUserName("134364****");

mail.setPassword("*************");

mail.setSubject("测试邮件");

mail.setContent("

mail.setShowLog(true);

mail.send();

System.out.println("程序结束");

}

/** 邮件主题 **/

private String subject;

/** 从此地址发出 **/

private String fromMail;

/** 用户名 **/

private String userName;

/** 登录密码 **/

private String password;

/** SMTP 服务器地址 **/

private String smtpServer;

/** SMTP 服务器端口(默认:25) **/

private int smtpPort = 25;

/** 发送到 toMail 中的所有地址 **/

private List toMail;

/** 邮件内容 **/

private String content;

/** 是否显示日志 **/

private boolean showLog;

public void addToMail(String mail) {

if (toMail == null)

toMail = new ArrayList();

toMail.add(mail);

}

public void send() {

if (smtpServer == null) {

throw new RuntimeException("smtpServer 不能为空");

}

if (userName == null) {

throw new RuntimeException("userName 不能为空");

}

if (password == null) {

throw new RuntimeException("password 不能为空");

}

if (fromMail == null) {

throw new RuntimeException("fromMail 不能为空");

}

if (toMail == null || toMail.isEmpty()) {

throw new RuntimeException("toMail 不能为空");

}

if (content == null || toMail.isEmpty()) {

throw new RuntimeException("content 不能为空");

}

Socket socket = null;

InputStream in = null;

OutputStream out = null;

try {

socket = new Socket(smtpServer, smtpPort);

socket.setSoTimeout(3000);

in = socket.getInputStream();

out = socket.getOutputStream();

} catch (IOException e) {

throw new RuntimeException("连接到 " + smtpServer + ":" + smtpPort + " 失败", e);

}

BufferedReaderProxy reader = new BufferedReaderProxy(new InputStreamReader(in), showLog);

PrintWriterProxy writer = new PrintWriterProxy(out, showLog);

reader.showResponse();

writer.println("HELO " + smtpServer);

reader.showResponse();

writer.println("AUTH LOGIN");

reader.showResponse();

writer.println(new String(Base64.encodeBase64(userName.getBytes())));

reader.showResponse();

writer.println(new String(Base64.encodeBase64(password.getBytes())));

reader.showResponse();

writer.println("MAIL FROM:" + fromMail);

reader.showResponse();

for (String mail : toMail) {

writer.println("RCPT TO:" + mail);

reader.showResponse();

}

writer.println("DATA");

writer.println("Content-Type:text/html");

if (subject != null) {

writer.println("Subject:" + subject);

}

writer.println("From:" + fromMail);

writer.print("To:");

for (String mail : toMail) {

writer.print(mail + "; ");

}

writer.println();

writer.println();

writer.println(content);

writer.println(".");

reader.showResponse();

writer.println("QUIT");

reader.showResponse();

try {

socket.close();

} catch (IOException e) {

System.err.println("发送邮件完成,关闭 Socket 出错:" + e.getMessage());

}

}

public String getSubject() {

return subject;

}

public void setSubject(String subject) {

this.subject = subject;

}

public String getFromMail() {

return fromMail;

}

public void setFromMail(String fromMail) {

this.fromMail = fromMail;

}

public String getSmtpServer() {

return smtpServer;

}

public void setSmtpServer(String smtpServer) {

this.smtpServer = smtpServer;

}

public int getSmtpPort() {

return smtpPort;

}

public void setSmtpPort(int smtpPort) {

this.smtpPort = smtpPort;

}

public String getContent() {

return content;

}

public void setContent(String content) {

this.content = content;

}

public List getToMail() {

return toMail;

}

public void setToMail(List toMail) {

this.toMail = toMail;

}

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 boolean getShowLog() {

return showLog;

}

public void setShowLog(boolean showLog) {

this.showLog = showLog;

}

static class PrintWriterProxy extends PrintWriter {

private boolean showRequest;

public PrintWriterProxy(OutputStream out, boolean showRequest) {

super(out, true);

this.showRequest = showRequest;

}

@Override

public void println() {

if (showRequest)

System.out.println();

super.println();

}

public void print(String s) {

if (showRequest)

System.out.print(s);

super.print(s);

}

}

static class BufferedReaderProxy extends BufferedReader {

private boolean showResponse = true;

public BufferedReaderProxy(Reader in, boolean showResponse) {

super(in);

this.showResponse = showResponse;

}

public void showResponse() {

try {

String line = readLine();

String number = line.substring(0, 3);

int num = -1;

try {

num = Integer.parseInt(number);

} catch (Exception e) {

}

if (num == -1) {

throw new RuntimeException("响应信息错误 : " + line);

} else if (num >= 400) {

throw new RuntimeException("发送邮件失败 : " + line);

}

if (showResponse) {

System.out.println(line);

}

} catch (IOException e) {

System.out.println("获取响应失败");

}

}

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:深入理解事件冒泡(Bubble)和事件捕捉(capture)
下一篇:全面解析Bootstrap中transition、affix的使用方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~