1首先你需要一个邮箱中转发送站(听着很高端的样子),说白了就是注册一个邮箱作为你的发送邮件平台,然后通过编程调用平台发送邮件(也就是你注册某个邮箱,然后开通SMTP/POP3协议,在编程中,拿着你的KEY去发送邮件),我试过很多种邮箱,QQ貌似不能用,网易经常报错,建议用新浪的,我用基本没出过问题。
2去网上下载java开源的发送邮件工具类:mailjar,并导入myeclipse/eclipse的引用。
3编程(工具类)
package comvictor;
import javaioFile;
import javaioIOException;
import javaioInputStream;
import javautilProperties;
import javaxactivationDataHandler;
import javaxactivationDataSource;
import javaxactivationFileDataSource;
import javaxmailBodyPart;
import javaxmailMessage;
import javaxmailMessagingException;
import javaxmailMultipart;
import javaxmailSession;
import javaxmailTransport;
import javaxmailinternetInternetAddress;
import javaxmailinternetMimeBodyPart;
import javaxmailinternetMimeMessage;
import javaxmailinternetMimeMultipart;
import javaxmailinternetMimeUtility;
public class JavaMailWithAttachment {
private MimeMessage message;
private Session session;
private Transport transport;
private String mailHost = "";
private String sender_username = "";
private String sender_password = "";
private Properties properties = new Properties();
/
初始化方法
/
public JavaMailWithAttachment(boolean debug) {
InputStream in = JavaMailWithAttachmentclassgetResourceAsStream("/MailServerproperties");
try {
propertiesload(in);
thismailHost = propertiesgetProperty("mailsmtphost");
thissender_username = propertiesgetProperty("mailsenderusername");
thissender_password = propertiesgetProperty("mailsenderpassword");
} catch (IOException e) {
eprintStackTrace();
}
session = SessiongetInstance(properties);
sessionsetDebug(debug);//开启后有调试信息
message = new MimeMessage(session);
}
/
发送邮件
@param subject
邮件主题
@param sendHtml
邮件内容
@param receiveUser
收件人地址
@param attachment
附件
/
public void doSendHtmlEmail(String subject, String sendHtml, String receiveUser, File attachment) {
try {
// 发件人
InternetAddress from = new InternetAddress(sender_username);
messagesetFrom(from);
// 收件人
InternetAddress to = new InternetAddress(receiveUser);
messagesetRecipient(MessageRecipientTypeTO, to);
// 邮件主题
messagesetSubject(subject);
// 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
Multipart multipart = new MimeMultipart();
// 添加邮件正文
BodyPart contentPart = new MimeBodyPart();
contentPartsetContent(sendHtml, "text/html;charset=UTF-8");
multipartaddBodyPart(contentPart);
// 添加附件的内容
if (attachment != null) {
BodyPart attachmentBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(attachment);
attachmentBodyPartsetDataHandler(new DataHandler(source));
// 网上流传的解决文件名乱码的方法,其实用MimeUtilityencodeWord就可以很方便的搞定
// 这里很重要,通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码
//sunmiscBASE64Encoder enc = new sunmiscBASE64Encoder();
//messageBodyPartsetFileName("=GBKB" + encencode(attachmentgetName()getBytes()) + "=");
//MimeUtilityencodeWord可以避免文件名乱码
attachmentBodyPartsetFileName(MimeUtilityencodeWord(attachmentgetName()));
multipartaddBodyPart(attachmentBodyPart);
}
// 将multipart对象放到message中
messagesetContent(multipart);
// 保存邮件
messagesaveChanges();
transport = sessiongetTransport("smtp");
// smtp验证,就是你用来发邮件的邮箱用户名密码
transportconnect(mailHost, sender_username, sender_password);
// 发送
transportsendMessage(message, messagegetAllRecipients());
Systemoutprintln("send success!");
} catch (Exception e) {
eprintStackTrace();
} finally {
if (transport != null) {
try {
transportclose();
} catch (MessagingException e) {
eprintStackTrace();
}
}
}
}
public static void main(String[] args) {
JavaMailWithAttachment se = new JavaMailWithAttachment(true);
Systemoutprintln(se);
File affix = new File("E:\\测试-testtxt");
// File affix =null;
sedoSendHtmlEmail("##", "###", "####@##com", affix);//
}
}
注意点:1 jar可能有冲突,如果是demo可以直接应用mailjar
如果是一个工程则要替换javaEE中的mailjar包
2 关于properties配置文件的地址问题
ClassgetResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从
ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
package bydcore;
import javaioBufferedReader;
import javaioFile;
import javaioFileInputStream;
import javaioFileNotFoundException;
import javaioIOException;
import javaioInputStream;
import javaioInputStreamReader;
import javaioPrintWriter;
import javaioUnsupportedEncodingException;
import javanetSocket;
import javaniocharsetCharset;
import javatextSimpleDateFormat;
import javautilArrayList;
import javautilDate;
import javautilHashMap;
import javautilList;
import javautilMap;
import sunmiscBASE64Encoder;
/
该类使用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) {
thisv = v;
}
public String getValue() {
return thisv;
}
}
static {
// MIME Media Types
contentTypeMap = new HashMap<String, String>();
contentTypeMapput("xls", "application/vndms-excel");
contentTypeMapput("xlsx", "application/vndms-excel");
contentTypeMapput("xlsm", "application/vndms-excel");
contentTypeMapput("xlsb", "application/vndms-excel");
contentTypeMapput("doc", "application/msword");
contentTypeMapput("dot", "application/msword");
contentTypeMapput("docx", "application/msword");
contentTypeMapput("docm", "application/msword");
contentTypeMapput("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_" + SystemcurrentTimeMillis();
boundaryNextPart = "--" + boundary;
contentTransferEncoding = "base64";
contentType = "multipart/mixed";
charset = CharsetdefaultCharset()name();
partSet = new ArrayList<MailPart>();
alternativeList = new ArrayList<MailPart>();
to = new ArrayList<String>();
cc = new ArrayList<String>();
bcc = new ArrayList<String>();
mixedBoundary = "=NextAttachment_zlz_" + SystemcurrentTimeMillis();
mixedBoundaryNextPart = "--" + mixedBoundary;
}
/
根据指定的完整文件名在 {@link #contentTypeMap} 中查找其相应的MIME类型,
如果没找到,则返回 {@link #defaultAttachmentContentType}
所指定的默认类型。
@param fileName
文件名
@return 返回文件对应的MIME类型。
/
private String getPartContentType(String fileName) {
String ret = null;
if (null != fileName) {
int flag = fileNamelastIndexOf("");
if (0 <= flag && flag < fileNamelength() - 1) {
fileName = fileNamesubstring(flag + 1);
}
ret = contentTypeMapget(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(strgetBytes(charset));
} catch (UnsupportedEncodingException e) {
eprintStackTrace();
}
}
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, CharsetdefaultCharset()name());
}
/
将所有的邮件单元按照标准的MIME格式要求合并。
@return 返回一个所有单元合并后的字符串。
/
private String getAllParts() {
StringBuilder sbd = new StringBuilder(LINE_END);
sbdappend(mixedBoundaryNextPart);
sbdappend(LINE_END);
sbdappend("Content-Type: ");
sbdappend("multipart/alternative");
sbdappend(";");
sbdappend("boundary=\"");
sbdappend(boundary)append("\""); // 邮件类型设置
sbdappend(LINE_END);
sbdappend(LINE_END);
sbdappend(LINE_END);
addPartsToString(alternativeList, sbd, getBoundaryNextPart());
sbdappend(getBoundaryNextPart())append("--");
sbdappend(LINE_END);
addPartsToString(partSet, sbd, mixedBoundaryNextPart);
sbdappend(LINE_END);
sbdappend(mixedBoundaryNextPart)append("--");
sbdappend(LINE_END);
// sbdappend(boundaryNextPart)
// append(LINE_END);
alternativeListclear();
partSetclear();
return sbdtoString();
}
import javautil;
import javaxmail;import javaxmailinternet;
public class JMail {
public void SendMail(String Topic,String Content){ Properties props=new Properties(); propsput("mailsmtphost","smtp163com"); propsput("mailsmtpauth","true"); Session s=SessiongetInstance(props); ssetDebug(false); MimeMessage message=new MimeMessage(s); MimeMultipart mp=new MimeMultipart(); BodyPart body = new MimeBodyPart(); InternetAddress from; InternetAddress to; try{ from=new InternetAddress("发件人邮箱"); messagesetFrom(from); to = new InternetAddress("收件人邮箱"); messagesetRecipient(MessageRecipientTypeTO,to); messagesetSubject(Topic,"utf-8"); bodysetContent(Content, "text/html;charset=utf-8"); mpaddBodyPart(body); messagesetContent(mp); messagesetSentDate(new Date()); messagesaveChanges(); Transport transport=sgetTransport("smtp"); transportconnect("smtp163com(邮件服务商,这是163的)","发件邮箱","发件邮箱密码"); transportsendMessage(message,messagegetAllRecipients()); transportclose(); } catch(AddressException e){ eprintStackTrace(); } catch(MessagingException e){ eprintStackTrace(); } }}
原因:
MyEclipse的javaeejar中的mail包与JavaMail包有冲突。
解决:
在MyEclipse目录下,找javaeejar包,用WinRar打包,删除里面的mail目录和activation目录然后加入mailjar和activitionjar
以上就是关于怎么用java发送邮件,像园子那样全部的内容,包括:怎么用java发送邮件,像园子那样、如何用java实现发邮件功能,并有几点注意事项、如何写一个JAVA类可以实现邮件发送功能,也可以实现群发功能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)