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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

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("<h1>你好</h1><br/><img src=\"https://www.baidu.com/img/baidu_jgylogo3.gif?v=39549282.gif\" />");

    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<String> toMail;

  /** 邮件内容 **/

  private String content;

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

  private boolean showLog;

  

  public void addToMail(String mail) {

    if (toMail == null)

      toMail = new ArrayList<String>();

    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<String> getToMail() {

    return toMail;

  }

  

  public void setToMail(List<String> 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("获取响应失败");

      }

    }

  

  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值