怎么用java发送邮件,像园子那样

怎么用java发送邮件,像园子那样,第1张

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类可以实现邮件发送功能,也可以实现群发功能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9469749.html

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

发表评论

登录后才能评论

评论列表(0条)

保存