守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 876|回复: 0

[协议通信] JavaMail使用SMTP协议发送电子邮件

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51747
    钢镚
    1422

    开源英雄守望者

    发表于 2015-8-19 17:09:40 | 显示全部楼层 |阅读模式
    JavaMail使用SMTP协议发送电子邮件

    1. package cn.outofmemory.javamail;

    2. import java.io.File;
    3. import java.io.FileInputStream;
    4. import java.io.FileNotFoundException;
    5. import java.io.FileOutputStream;
    6. import java.io.IOException;
    7. import java.io.InputStream;
    8. import java.util.Date;
    9. import java.util.Properties;

    10. import javax.activation.DataHandler;
    11. import javax.activation.DataSource;
    12. import javax.activation.FileDataSource;
    13. import javax.mail.Address;
    14. import javax.mail.Authenticator;
    15. import javax.mail.Message;
    16. import javax.mail.Message.RecipientType;
    17. import javax.mail.MessagingException;
    18. import javax.mail.PasswordAuthentication;
    19. import javax.mail.Session;
    20. import javax.mail.Transport;
    21. import javax.mail.internet.InternetAddress;
    22. import javax.mail.internet.MimeBodyPart;
    23. import javax.mail.internet.MimeMessage;
    24. import javax.mail.internet.MimeMultipart;
    25. import javax.mail.internet.MimeUtility;

    26. /**
    27. * 使用SMTP协议发送电子邮件
    28. */
    29. public class SendMailTest {

    30.     // 邮件发送协议
    31.     private final static String PROTOCOL = "smtp";

    32.     // SMTP邮件服务器
    33.     private final static String HOST = "smtp.sina.com";

    34.     // SMTP邮件服务器默认端口
    35.     private final static String PORT = "25";

    36.     // 是否要求身份认证
    37.     private final static String IS_AUTH = "true";

    38.     // 是否启用调试模式(启用调试模式可打印客户端与服务器交互过程时一问一答的响应消息)
    39.     private final static String IS_ENABLED_DEBUG_MOD = "true";

    40.     // 发件人
    41.     private static String from = "xyang0917@sina.com";

    42.     // 收件人
    43.     private static String to = "xyang0917@163.com";

    44.     // 初始化连接邮件服务器的会话信息
    45.     private static Properties props = null;

    46.     static {
    47.         props = new Properties();
    48.         props.setProperty("mail.transport.protocol", PROTOCOL);
    49.         props.setProperty("mail.smtp.host", HOST);
    50.         props.setProperty("mail.smtp.port", PORT);
    51.         props.setProperty("mail.smtp.auth", IS_AUTH);
    52.         props.setProperty("mail.debug",IS_ENABLED_DEBUG_MOD);
    53.     }

    54.     public static void main(String[] args) throws Exception {
    55.         // 发送文本邮件
    56.         sendTextEmail();

    57.         // 发送简单的html邮件
    58.         sendHtmlEmail();

    59.         // 发送带内嵌图片的HTML邮件
    60.         sendHtmlWithInnerImageEmail();

    61.         // 发送混合组合邮件
    62.         sendMultipleEmail();

    63.         // 发送已经生成的eml邮件
    64.         //sendMailForEml();
    65.     }

    66.     /**
    67.      * 发送简单的文本邮件
    68.      */
    69.     public static void sendTextEmail() throws Exception {
    70.         // 创建Session实例对象
    71.         Session session = Session.getDefaultInstance(props);

    72.         // 创建MimeMessage实例对象
    73.         MimeMessage message = new MimeMessage(session);
    74.         // 设置发件人
    75.         message.setFrom(new InternetAddress(from));
    76.         // 设置邮件主题
    77.         message.setSubject("使用javamail发送简单文本邮件");
    78.         // 设置收件人
    79.         message.setRecipient(RecipientType.TO, new InternetAddress(to));
    80.         // 设置发送时间
    81.         message.setSentDate(new Date());
    82.         // 设置纯文本内容为邮件正文
    83.         message.setText("使用POP3协议发送文本邮件测试!!!");
    84.         // 保存并生成最终的邮件内容
    85.         message.saveChanges();

    86.         // 获得Transport实例对象
    87.         Transport transport = session.getTransport();
    88.         // 打开连接
    89.         transport.connect("xyang0917", "123456abc");
    90.         // 将message对象传递给transport对象,将邮件发送出去
    91.         transport.sendMessage(message, message.getAllRecipients());
    92.         // 关闭连接
    93.         transport.close();
    94.     }

    95.     /**
    96.      * 发送简单的html邮件
    97.      */
    98.     public static void sendHtmlEmail() throws Exception {
    99.         // 创建Session实例对象
    100.         Session session = Session.getInstance(props, new MyAuthenticator());

    101.         // 创建MimeMessage实例对象
    102.         MimeMessage message = new MimeMessage(session);
    103.         // 设置邮件主题
    104.         message.setSubject("html邮件主题");
    105.         // 设置发送人
    106.         message.setFrom(new InternetAddress(from));
    107.         // 设置发送时间
    108.         message.setSentDate(new Date());
    109.         // 设置收件人
    110.         message.setRecipients(RecipientType.TO, InternetAddress.parse(to));
    111.         // 设置html内容为邮件正文,指定MIME类型为text/html类型,并指定字符编码为gbk
    112.         message.setContent("<span style='color:red;'>html邮件测试...</span>","text/html;charset=gbk");

    113.         // 保存并生成最终的邮件内容
    114.         message.saveChanges();

    115.         // 发送邮件
    116.         Transport.send(message);
    117.     }

    118.     /**
    119.      * 发送带内嵌图片的HTML邮件
    120.      */
    121.     public static void sendHtmlWithInnerImageEmail() throws MessagingException {
    122.         // 创建Session实例对象
    123.         Session session = Session.getDefaultInstance(props, new MyAuthenticator());

    124.         // 创建邮件内容
    125.         MimeMessage message = new MimeMessage(session);
    126.         // 邮件主题,并指定编码格式
    127.         message.setSubject("带内嵌图片的HTML邮件", "utf-8");     
    128.         // 发件人
    129.         message.setFrom(new InternetAddress(from));
    130.         // 收件人
    131.         message.setRecipients(RecipientType.TO, InternetAddress.parse(to));
    132.         // 抄送
    133.         message.setRecipient(RecipientType.CC, new InternetAddress("java_test@sohu.com"));
    134.         // 密送 (不会在邮件收件人名单中显示出来)
    135.         message.setRecipient(RecipientType.BCC, new InternetAddress("417067629@qq.com"));
    136.         // 发送时间
    137.         message.setSentDate(new Date());

    138.         // 创建一个MIME子类型为“related”的MimeMultipart对象
    139.         MimeMultipart mp = new MimeMultipart("related");
    140.         // 创建一个表示正文的MimeBodyPart对象,并将它加入到前面创建的MimeMultipart对象中
    141.         MimeBodyPart htmlPart = new MimeBodyPart();
    142.         mp.addBodyPart(htmlPart);
    143.         // 创建一个表示图片资源的MimeBodyPart对象,将将它加入到前面创建的MimeMultipart对象中
    144.         MimeBodyPart imagePart = new MimeBodyPart();
    145.         mp.addBodyPart(imagePart);

    146.         // 将MimeMultipart对象设置为整个邮件的内容
    147.         message.setContent(mp);

    148.         // 设置内嵌图片邮件体
    149.         DataSource ds = new FileDataSource(new File("resource/firefoxlogo.png"));
    150.         DataHandler dh = new DataHandler(ds);
    151.         imagePart.setDataHandler(dh);
    152.         imagePart.setContentID("firefoxlogo.png");  // 设置内容编号,用于其它邮件体引用

    153.         // 创建一个MIME子类型为"alternative"的MimeMultipart对象,并作为前面创建的htmlPart对象的邮件内容
    154.         MimeMultipart htmlMultipart = new MimeMultipart("alternative");
    155.         // 创建一个表示html正文的MimeBodyPart对象
    156.         MimeBodyPart htmlBodypart = new MimeBodyPart();
    157.         // 其中cid=androidlogo.gif是引用邮件内部的图片,即imagePart.setContentID("androidlogo.gif");方法所保存的图片
    158.         htmlBodypart.setContent("<span style='color:red;'>这是带内嵌图片的HTML邮件哦!!!<img src=\"cid:firefoxlogo.png\" /></span>","text/html;charset=utf-8");
    159.         htmlMultipart.addBodyPart(htmlBodypart);
    160.         htmlPart.setContent(htmlMultipart);

    161.         // 保存并生成最终的邮件内容
    162.         message.saveChanges();

    163.         // 发送邮件
    164.         Transport.send(message);
    165.     }

    166.     /**
    167.      * 发送带内嵌图片、附件、多收件人(显示邮箱姓名)、邮件优先级、阅读回执的完整的HTML邮件
    168.      */
    169.     public static void sendMultipleEmail() throws Exception {
    170.         String charset = "utf-8";   // 指定中文编码格式
    171.         // 创建Session实例对象
    172.         Session session = Session.getInstance(props,new MyAuthenticator());

    173.         // 创建MimeMessage实例对象
    174.         MimeMessage message = new MimeMessage(session);
    175.         // 设置主题
    176.         message.setSubject("使用JavaMail发送混合组合类型的邮件测试");
    177.         // 设置发送人
    178.         message.setFrom(new InternetAddress(from,"新浪测试邮箱",charset));
    179.         // 设置收件人
    180.         message.setRecipients(RecipientType.TO,  
    181.                 new Address[] {
    182.                 // 参数1:邮箱地址,参数2:姓名(在客户端收件只显示姓名,而不显示邮件地址),参数3:姓名中文字符串编码
    183.                 new InternetAddress("java_test@sohu.com", "张三_sohu", charset),
    184.                 new InternetAddress("xyang0917@163.com", "李四_163", charset),
    185.             }
    186.         );
    187.         // 设置抄送
    188.         message.setRecipient(RecipientType.CC, new InternetAddress("xyang0917@gmail.com","王五_gmail",charset));
    189.         // 设置密送
    190.         message.setRecipient(RecipientType.BCC, new InternetAddress("xyang0917@qq.com", "赵六_QQ", charset));
    191.         // 设置发送时间
    192.         message.setSentDate(new Date());
    193.         // 设置回复人(收件人回复此邮件时,默认收件人)
    194.         message.setReplyTo(InternetAddress.parse("\"" + MimeUtility.encodeText("田七") + "\" <417067629@qq.com>"));
    195.         // 设置优先级(1:紧急   3:普通    5:低)
    196.         message.setHeader("X-Priority", "1");
    197.         // 要求阅读回执(收件人阅读邮件时会提示回复发件人,表明邮件已收到,并已阅读)
    198.         message.setHeader("Disposition-Notification-To", from);

    199.         // 创建一个MIME子类型为"mixed"的MimeMultipart对象,表示这是一封混合组合类型的邮件
    200.         MimeMultipart mailContent = new MimeMultipart("mixed");  
    201.         message.setContent(mailContent);

    202.         // 附件
    203.         MimeBodyPart attach1 = new MimeBodyPart();
    204.         MimeBodyPart attach2 = new MimeBodyPart();
    205.         // 内容
    206.         MimeBodyPart mailBody = new MimeBodyPart();

    207.         // 将附件和内容添加到邮件当中
    208.         mailContent.addBodyPart(attach1);
    209.         mailContent.addBodyPart(attach2);
    210.         mailContent.addBodyPart(mailBody);

    211.         // 附件1(利用jaf框架读取数据源生成邮件体)
    212.         DataSource ds1 = new FileDataSource("resource/Earth.bmp");
    213.         DataHandler dh1 = new DataHandler(ds1);
    214.         attach1.setFileName(MimeUtility.encodeText("Earth.bmp"));
    215.         attach1.setDataHandler(dh1);

    216.         // 附件2
    217.         DataSource ds2 = new FileDataSource("resource/如何学好C语言.txt");
    218.         DataHandler dh2 = new DataHandler(ds2);
    219.         attach2.setDataHandler(dh2);
    220.         attach2.setFileName(MimeUtility.encodeText("如何学好C语言.txt"));

    221.         // 邮件正文(内嵌图片+html文本)
    222.         MimeMultipart body = new MimeMultipart("related");  //邮件正文也是一个组合体,需要指明组合关系
    223.         mailBody.setContent(body);

    224.         // 邮件正文由html和图片构成
    225.         MimeBodyPart imgPart = new MimeBodyPart();
    226.         MimeBodyPart htmlPart = new MimeBodyPart();
    227.         body.addBodyPart(imgPart);
    228.         body.addBodyPart(htmlPart);

    229.         // 正文图片
    230.         DataSource ds3 = new FileDataSource("resource/firefoxlogo.png");
    231.         DataHandler dh3 = new DataHandler(ds3);
    232.         imgPart.setDataHandler(dh3);
    233.         imgPart.setContentID("firefoxlogo.png");

    234.         // html邮件内容
    235.         MimeMultipart htmlMultipart = new MimeMultipart("alternative");  
    236.         htmlPart.setContent(htmlMultipart);
    237.         MimeBodyPart htmlContent = new MimeBodyPart();
    238.         htmlContent.setContent(
    239.                 "<span style='color:red'>这是我自己用java mail发送的邮件哦!" +
    240.                 "<img src='cid:firefoxlogo.png' /></span>"
    241.                         , "text/html;charset=gbk");
    242.         htmlMultipart.addBodyPart(htmlContent);

    243.         // 保存邮件内容修改
    244.         message.saveChanges();

    245.         /*File eml = buildEmlFile(message);
    246.         sendMailForEml(eml);*/

    247.         // 发送邮件
    248.         Transport.send(message);
    249.     }

    250.     /**
    251.      * 将邮件内容生成eml文件
    252.      * @param message 邮件内容
    253.      */
    254.     public static File buildEmlFile(Message message) throws MessagingException, FileNotFoundException, IOException {
    255.         File file = new File("c:\\" + MimeUtility.decodeText(message.getSubject())+".eml");
    256.         message.writeTo(new FileOutputStream(file));
    257.         return file;
    258.     }

    259.     /**
    260.      * 发送本地已经生成好的email文件
    261.      */
    262.     public static void sendMailForEml(File eml) throws Exception {
    263.         // 获得邮件会话
    264.         Session session = Session.getInstance(props,new MyAuthenticator());
    265.         // 获得邮件内容,即发生前生成的eml文件
    266.         InputStream is = new FileInputStream(eml);
    267.         MimeMessage message = new MimeMessage(session,is);
    268.         //发送邮件
    269.         Transport.send(message);
    270.     }

    271.     /**
    272.      * 向邮件服务器提交认证信息
    273.      */
    274.     static class MyAuthenticator extends Authenticator {

    275.         private String username = "xyang0917";

    276.         private String password = "123456abc";

    277.         public MyAuthenticator() {
    278.             super();
    279.         }

    280.         public MyAuthenticator(String username, String password) {
    281.             super();
    282.             this.username = username;
    283.             this.password = password;
    284.         }

    285.         @Override
    286.         protected PasswordAuthentication getPasswordAuthentication() {

    287.             return new PasswordAuthentication(username, password);
    288.         }
    289.     }
    290. }
    复制代码



    本文来自:http://outofmemory.cn/code-snippet/2423/JavaMail-usage-SMTP-protocol-send-dianziyoujian
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-10-15 01:58 , Processed in 0.043917 second(s), 36 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表