Java 发送邮件

来源:互联网 发布:欧美品牌男装淘宝 编辑:程序博客网 时间:2024/04/30 08:48

发送邮件,就目前楼主所知有JavaMail HtmlMail,也可以通过代理商如sendCloud、阿里云(这个我没用过)。
这里需要注意:
1 我们发信的邮箱必须必须开启smpt服务,如果使用163,在邮件中心选择POP3/SMTP/IMAP ,然后就行设置,163会要求你输入一个密码,这个密码是我们后期要用到的。
2 jar包:javamail.jar javamail.jar 包链接 以及它所依赖的包 activation.jar activation.jar包链接 (可在官网下载)
下面主要介绍一下JavaMail如何发送邮件

1 邮件传输协议
邮件传输协议分为两种:SMTP 和POP3 。
SMTP的端口在25,POP3端口为 110。我们发信采用SMTP,而收信则是由POP3负责。
请看下面邮件发送和接受原理图:
这里写图片描述

这里我们可以很清楚的看到发件是采用SMTP协议,收信是采用POP3协议。

大家如果有兴趣可以使用telnet 尝试手动发送邮件,这里我就不多介绍了。

2 JavaMail创建邮件和发送邮件

首先我们介绍一下JavaMail的核心api
主要包括一下几大类:Session Message Address Authenticator Transport
1 Session(邮件会话)
进行收发邮件的工作都是基于这个会话的
通过java.util.Properties 对象获得邮件服务器、用户名、密码等
2 Message
我们使用Message的子类MimeMessage来设置邮件的内容,我们通过子类的构造函数将session参数传入。
如下:

    //创建邮件对象        MimeMessage message=new MimeMessage(session);        //指明邮件发送人        message.setFrom(new InternetAddress("邮件发送方        //指明邮件的收件人        message.setRecipient(Message.RecipientType.TO, new InternetAddress("邮件接受方")        message.setSubject("用户验证");        //邮件的文本内容        message.setContent("你好啊,请问你今年多大了","text/html;charset=UTF-8");

3 Address
邮件地址类,如我上面代码说是,发送和接受的邮件地址都是通过此类来完成。

Address  fromAddr=new InternetAddress("xxx@163.com");

设置收件人:

message.setRecipient(Message.RecipientType.TO, new InternetAddress("邮件接受方");

4 Transport
此类实现SMTP协议来发送邮件

Transport   transport = session.getTransport();transport.connect(host, username, password);transport.sendMessage(message, message.getAllRecipients());transport.close();

我们可以通过如下原理图更好理解:
这里写图片描述

3 简单邮件发送案例

package com.mao.smtp;import java.util.Properties;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.NoSuchProviderException;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.AddressException;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;public class SendMail {    public static void main(String[] args) throws AddressException, MessagingException {        Properties prop=new Properties();        prop.setProperty("mail.host", "smtp.163.com");        prop.setProperty("mail.transport.protocol", "smtp");        prop.setProperty("mail.smtp.auth", "true");        //使用javamail发送邮件的5个步骤        Session session=Session.getInstance(prop);        //开启session的debug模式,这样可以查看程序发送emial的运行状态        session.setDebug(true);        //通过session得到transport对象        Transport ts=null;        try {            ts = session.getTransport();            //使用邮箱的用户名和密码联上邮件服务器,发送人需要提交smtp的用户名和密码            ts.connect("smtp.163.com","发送方邮箱","密码");        } catch (NoSuchProviderException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }               catch (MessagingException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        //创建邮件        Message message=createSimpleMail(session);        //发送邮件        ts.sendMessage(message, message.getAllRecipients());        ts.close();    }    private static Message createSimpleMail(Session session) throws AddressException, MessagingException {        //创建邮件对象        MimeMessage message=new MimeMessage(session);        //指明邮件发送人        message.setFrom(new InternetAddress("发送发邮箱"));        //指明邮件的收件人        message.setRecipient(Message.RecipientType.TO, new InternetAddress("接受方邮箱"));        message.setSubject("用户验证");        //邮件的文本内容        message.setContent("你好啊,请问你今年多大了","text/html;charset=UTF-8");        //返回创建好的邮件对象        return message;    }}

4 注意事项
如果在控制台查看邮件发送成功,但是邮箱未收到。这是我们可以在垃圾箱查找。
lz是发送到自己qq邮箱,但被认为是垃圾邮箱,而直接发到垃圾箱。
如何避免:
1尽量少发敏感词
2 如果主题设置包含英文,也会是为垃圾邮箱,所以主题设置为中文(设为中文后,就能接收到了)
3内容尽量多点(这个我没测试)

原创粉丝点击