如何在本机上利用java实现smtp邮件服务器

如何在本机上利用java实现smtp邮件服务器,第1张

1.修改<postmaster>localhost</postmaster>,改成你自己的服务器域名,比如:<postmaster>support@</postmaster>

2.修改这些,也是改成自己的

<servernames autodetect="false" autodetectIP="false">

<servername></servername>

</servernames>

3.修改dns server,这是为了可以发外网邮件,查看DNS地址使用ipconfig/all,然后在配置文件中dnsserver节点下加入server地址.

package byd.core

import java.io.BufferedReader

import java.io.File

import java.io.FileInputStream

import java.io.FileNotFoundException

import java.io.IOException

import java.io.InputStream

import java.io.InputStreamReader

import java.io.PrintWriter

import java.io.UnsupportedEncodingException

import java.net.Socket

import java.nio.charset.Charset

import java.text.SimpleDateFormat

import java.util.ArrayList

import java.util.Date

import java.util.HashMap

import java.util.List

import java.util.Map

import sun.misc.BASE64Encoder

/**

* 该类使用Socket连接到邮件服务器, 并实现了向指定邮箱发送邮件及附件的功能。

*

* @author Kou Hongtao

*/

public class Email {

/**

* 换行符

*/

private static final String LINE_END = "\r\n"

/**

* 值为“true”输出高度信息(包括服务器响应信息),值为“ false”则不输出调试信息。

*/

private boolean isDebug = true

/**

* 值为“true”则在发送邮件{@link Mail#send()} 过程中会读取服务器端返回的消息,

* 并在邮件发送完毕后将这些消息返回给用户。

*/

private boolean isAllowReadSocketInfo = true

/**

* 邮件服务器地址

*/

private String host

/**

* 发件人邮箱地址

*/

private String from

/**

* 收件人邮箱地址

*/

private List<String>to

/**

* 抄送地址

*/

private List<String>cc

/**

* 暗送地址

*/

private List<String>bcc

/**

* 邮件主题

*/

private String subject

/**

* 用户名

*/

private String user

/**

* 密码

*/

private String password

/**

* MIME邮件类型

*/

private String contentType

/**

* 用来绑定多个邮件单元{@link #partSet}

* 的分隔标识,我们可以将邮件的正文及每一个附件都看作是一个邮件单元 。

*/

private String boundary

/**

* 邮件单元分隔标识符,该属性将用来在邮件中作为分割各个邮件单元的标识 。

*/

private String boundaryNextPart

/**

* 传输邮件所采用的编码

*/

private String contentTransferEncoding

/**

* 设置邮件正文所用的字符集

*/

private String charset

/**

* 内容描述

*/

private String contentDisposition

/**

* 邮件正文

*/

private String content

/**

* 发送邮件日期的显示格式

*/

private String simpleDatePattern

/**

* 附件的默认MIME类型

*/

private String defaultAttachmentContentType

/**

* 邮件单元的集合,用来存放正文单元和所有的附件单元。

*/

private List<MailPart>partSet

private List<MailPart>alternativeList

private String mixedBoundary

private String mixedBoundaryNextPart

/**

* 不同类型文件对应的{@link MIME} 类型映射。在添加附件

* {@link #addAttachment(String)} 时,程序会在这个映射中查找对应文件的

* {@link MIME} 类型,如果没有, 则使用

* {@link #defaultAttachmentContentType} 所定义的类型。

*/

private static Map<String, String>contentTypeMap

private static enum TextType {

PLAIN("plain"), HTML("html")

private String v

private TextType(String v) {

this.v = v

}

public String getValue() {

return this.v

}

}

static {

// MIME Media Types

contentTypeMap = new HashMap<String, String>()

contentTypeMap.put("xls", "application/vnd.ms-excel")

contentTypeMap.put("xlsx", "application/vnd.ms-excel")

contentTypeMap.put("xlsm", "application/vnd.ms-excel")

contentTypeMap.put("xlsb", "application/vnd.ms-excel")

contentTypeMap.put("doc", "application/msword")

contentTypeMap.put("dot", "application/msword")

contentTypeMap.put("docx", "application/msword")

contentTypeMap.put("docm", "application/msword")

contentTypeMap.put("dotm", "application/msword")

}

/**

* 该类用来实例化一个正文单元或附件单元对象,他继承了 {@link Mail}

* ,在这里制作这个子类主要是为了区别邮件单元对象和邮件服务对象 ,使程序易读一些。

* 这些邮件单元全部会放到partSet 中,在发送邮件 {@link #send()}时, 程序会调用

* {@link #getAllParts()} 方法将所有的单元合并成一个符合MIME格式的字符串

*

* @author Kou Hongtao

*/

private class MailPart extends Email {

public MailPart() {

}

}

/**

* 默认构造函数

*/

public Email() {

defaultAttachmentContentType = "application/octet-stream"

simpleDatePattern = "yyyy-MM-dd HH:mm:ss"

boundary = "--=_NextPart_zlz_3907_" + System.currentTimeMillis()

boundaryNextPart = "--" + boundary

contentTransferEncoding = "base64"

contentType = "multipart/mixed"

charset = Charset.defaultCharset().name()

partSet = new ArrayList<MailPart>()

alternativeList = new ArrayList<MailPart>()

to = new ArrayList<String>()

cc = new ArrayList<String>()

bcc = new ArrayList<String>()

mixedBoundary = "=NextAttachment_zlz_" + System.currentTimeMillis()

mixedBoundaryNextPart = "--" + mixedBoundary

}

/**

* 根据指定的完整文件名在 {@link #contentTypeMap} 中查找其相应的MIME类型,

* 如果没找到,则返回 {@link #defaultAttachmentContentType}

* 所指定的默认类型。

*

* @param fileName

*文件名

* @return 返回文件对应的MIME类型。

*/

private String getPartContentType(String fileName) {

String ret = null

if (null != fileName) {

int flag = fileName.lastIndexOf(".")

if (0 <= flag &&flag <fileName.length() - 1) {

fileName = fileName.substring(flag + 1)

}

ret = contentTypeMap.get(fileName)

}

if (null == ret) {

ret = defaultAttachmentContentType

}

return ret

}

/**

* 将给定字符串转换为base64编码的字符串

*

* @param str

*需要转码的字符串

* @param charset

*原字符串的编码格式

* @return base64编码格式的字符

*/

private String toBase64(String str, String charset) {

if (null != str) {

try {

return toBase64(str.getBytes(charset))

} catch (UnsupportedEncodingException e) {

e.printStackTrace()

}

}

return ""

}

/**

* 将指定的字节数组转换为base64格式的字符串

*

* @param bs

*需要转码的字节数组

* @return base64编码格式的字符

*/

private String toBase64(byte[] bs) {

return new BASE64Encoder().encode(bs)

}

/**

* 将给定字符串转换为base64编码的字符串

*

* @param str

*需要转码的字符串

* @return base64编码格式的字符

*/

private String toBase64(String str) {

return toBase64(str, Charset.defaultCharset().name())

}

/**

* 将所有的邮件单元按照标准的MIME格式要求合并。

*

* @return 返回一个所有单元合并后的字符串。

*/

private String getAllParts() {

StringBuilder sbd = new StringBuilder(LINE_END)

sbd.append(mixedBoundaryNextPart)

sbd.append(LINE_END)

sbd.append("Content-Type: ")

sbd.append("multipart/alternative")

sbd.append("")

sbd.append("boundary=\"")

sbd.append(boundary).append("\"")// 邮件类型设置

sbd.append(LINE_END)

sbd.append(LINE_END)

sbd.append(LINE_END)

addPartsToString(alternativeList, sbd, getBoundaryNextPart())

sbd.append(getBoundaryNextPart()).append("--")

sbd.append(LINE_END)

addPartsToString(partSet, sbd, mixedBoundaryNextPart)

sbd.append(LINE_END)

sbd.append(mixedBoundaryNextPart).append("--")

sbd.append(LINE_END)

// sbd.append(boundaryNextPart).

// append(LINE_END)

alternativeList.clear()

partSet.clear()

return sbd.toString()

}


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/310075.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存