使用JavaMail通过SMTP协议发送局域网(内网)邮件

来源:互联网 发布:wish数据分析 编辑:程序博客网 时间:2024/05/22 14:53

1.前言

最近项目中有个需求,需要写一个接口,即在本地局域网内发送邮件。于是上网百度了一番,有很多借鉴,但大部分都是在本地发送邮件到外网服务器,比如什么QQ,新浪或搜狐邮箱等。但还是吸取了不少有用的东西,也可谓是大同小异。在经过2天断断续续的研究之后,终于成功了,于是今天准备给大家分享出来,希望能对其他有同样需求的朋友有所帮助。

2.准备工作

发送本地邮件,当然也是少不了邮件接收的服务器。所以需要我们自己在本地电脑或局域网内其他机器或虚拟机上安装一个邮件服务器。正好因为同事在一台机器上已经安装了一个HMailServer的服务器,所以就偷个懒。大家如果不知道怎么安装的,可以继续百度搜索一番,本人现给大家推荐一篇较为详细的,不懂的朋友可以照葫芦画瓢。连接地址:http://blog.csdn.net/h183288132/article/details/44753799

3.代码实现

服务器搭建好了之后,我们就可以开始准备发送邮件了。既然是功能性质的代码,我们都可以封装成工具类,以便于管理和调用,下面直接展示工具类代码,关键处都有注释,相信大家应该都能看懂:
package com.cams.CaMSMonitorService;import java.io.UnsupportedEncodingException;import java.util.Date;import java.util.Properties;import javax.mail.BodyPart;import javax.mail.Message;import javax.mail.Message.RecipientType;import javax.mail.MessagingException;import javax.mail.Multipart;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeBodyPart;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMultipart;/** * 该类为邮件封装类 * 设置邮件收发人,内容,日期,以及发送功能 * @author Yangy * */public class MailManager {    private String host;    private String auth;    private String username;          private String domainUser;          private String password;      public MailManager(String host, String auth, String domainUser, String username, String password)    {    this.host = host;          this.auth = auth;          this.domainUser = domainUser;          this.username = username;          this.password = password;     }        /**     * 发送邮件     * @param to          接收人     * @param subject     标题     * @param msgtext     内容     * @return     * @throws MessagingException     * @throws UnsupportedEncodingException      */    public boolean SendMail(String [] to,String subject,String msgtext) throws MessagingException, UnsupportedEncodingException     {    boolean flag = false;        Properties properties = new Properties();    //设置smtp协议     properties.put("mail.transport.protocol", "SMTP");     //设置服务器连接地址    properties.put("mail.smtp.host", host);    //设置TLS保护连接,默认为false    properties.put("mail.smtp.starttls.enable", "true");    //设置身份校验    properties.put("mail.smtp.auth", "true");    //设置默认端口号    properties.put("mail.smtp.port", 25);        //使用环境属性和授权信息,创建邮件会话    Session session = Session.getDefaultInstance(properties);    //控制台打印日志    session.setDebug(true);    //创建邮件消息    Message msg = new MimeMessage(session);        //设置发件人    InternetAddress from = new InternetAddress(username);    msg.setFrom(from);        if(to.length > 0)    {    InternetAddress [] toAddr = new InternetAddress[to.length];    for (int i = 0; i < to.length; i++) {    toAddr[i] = new InternetAddress(to[i]);}    //设置收件人的邮箱    msg.setRecipients(RecipientType.TO, toAddr);    //设置邮件标题    msg.setSubject(subject);    //设置发送时间    msg.setSentDate(new Date());    //设置邮件的内容体    BodyPart mbp = new MimeBodyPart();    mbp.setContent(msgtext, "text/html;charset=utf-8");    Multipart multipart = new MimeMultipart();    multipart.addBodyPart(mbp);    msg.setContent(multipart);        msg.saveChanges();    //建立邮件传输对象    Transport transport = session.getTransport("smtp");    //与服务端建立连接    transport.connect(host,"admin@cams.net", "123456");    //发送邮件    transport.sendMessage(msg, msg.getAllRecipients());    //关闭    transport.close();        flag = true;    }    else    {    System.out.println("接收用户为空");    }        return flag;    }}
工具类有了,那么实现起来也就容易了,再给大家看一下我自己用Jframe写的一个可视化发送界面的代码:
package com.cams.CaMSMonitorService;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JOptionPane;import com.cams.CaMSMobileService.SerialPort.ui.MailClientFrame;public class SendEmailManage {public static void main(String[] args) {System.setProperty("java.net.preferIPv4Stack", "true");final MailClientFrame mcFrame = new MailClientFrame();mcFrame.setVisible(true);mcFrame.getjButton().addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stub//获取发送信息String toName = mcFrame.getToNameField().getText();//获取接收人String [] toAry = new String[]{toName};//获取服务器地址String host = mcFrame.getToIpCombox().getSelectedItem().toString();//获取发件人String from = mcFrame.getFromNameFeild().getText();//获取发送标题String subject = mcFrame.getSubjectFiled().getText();//获取发送内容String content = mcFrame.getMsgArea().getText();//创建邮件工具类对象MailManager mailManager = new MailManager(host, "false", "cams.net", from, "");try { //发送邮件 boolean flag =mailManager.SendMail(toAry, subject, content);  if(flag) { JOptionPane.showMessageDialog(mcFrame, "发送成功", "提示", JOptionPane.WARNING_MESSAGE); } else { JOptionPane.showMessageDialog(mcFrame, "发送失败", "提示", JOptionPane.ERROR_MESSAGE); } } catch (Exception e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}});}}
界面样式如下:

点击发送之后,我们去服务器电脑看下收件信息:


4.总结

那么至此,我们的局域网发送邮件功能就实现了。看起来是不是会觉得很简单,so easy!But只有实践过,才知道是不是真的容易。为什么这么说,因为博主在实践的时候,就遇到很多错误。
例如:①实现过程中,可能会报错535 Error:authentication failed.  如果是这个错误的话,就表示登录的时候错    误了。可以检查一下自己在用transport.conect的时候传入的账户和密码是否正确,还有可能就是设置的端      口号是否可用
②还可能会提示SMTP Error: Could not connect to SMTP host。当你登录多次错误之后,貌似服务器端就会暂时屏蔽你这个连接端了。所以还是登录的问题,大家要注意。或者说确实是服务端的服务没有开启。可以通过cmd中输入telnet 192.168.*.* 25(此处即是服务器端主机的ip和连接端口),通过这个来判断连接是否可用。