How to send an iCal meeting request using Java Mail, and receive the response

后端 未结 5 518
暖寄归人
暖寄归人 2020-12-13 22:29

I\'m trying to send an iCal to an outlook, using Java Mail Library, I\'ve read already the Question, and I already have some sample code

public class SendMe         


        
相关标签:
5条回答
  • 2020-12-13 22:37

    So I solved the problem, and here is what I found:

    1 - You have to update to Java Mail API 1.4.2 to make everything works fine

    2 - Write the text/calendar part of your message like the following:

    package com.xx.xx;
    
    import java.util.Properties;
    
    import javax.mail.*;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import javax.mail.util.ByteArrayDataSource;
    
    public class Email {
    
        public Email() {
        }
    
        /*
         * @param args
         */
        public static void main(String[] args) {
            try {
                Email email = new Email();
                email.send();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void send() throws Exception {
    
            try {
                String from = "xx@xx.com";
                String to = "xx@xx.com";
                Properties prop = new Properties();
                prop.put("mail.smtp.host", "mailhost");
    
                Session session = Session.getDefaultInstance(prop, null);
                // Define message
                MimeMessage message = new MimeMessage(session);
                message.addHeaderLine("method=REQUEST");
                message.addHeaderLine("charset=UTF-8");
                message.addHeaderLine("component=VEVENT");
    
                message.setFrom(new InternetAddress(from));
                message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
                message.setSubject("Outlook Meeting Request Using JavaMail");
    
                StringBuffer sb = new StringBuffer();
    
                StringBuffer buffer = sb.append("BEGIN:VCALENDAR\n" +
                        "PRODID:-//Microsoft Corporation//Outlook 9.0 MIMEDIR//EN\n" +
                        "VERSION:2.0\n" +
                        "METHOD:REQUEST\n" +
                        "BEGIN:VEVENT\n" +
                        "ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:xx@xx.com\n" +
                        "ORGANIZER:MAILTO:xx@xx.com\n" +
                        "DTSTART:20051208T053000Z\n" +
                        "DTEND:20051208T060000Z\n" +
                        "LOCATION:Conference room\n" +
                        "TRANSP:OPAQUE\n" +
                        "SEQUENCE:0\n" +
                        "UID:040000008200E00074C5B7101A82E00800000000002FF466CE3AC5010000000000000000100\n" +
                        " 000004377FE5C37984842BF9440448399EB02\n" +
                        "DTSTAMP:20051206T120102Z\n" +
                        "CATEGORIES:Meeting\n" +
                        "DESCRIPTION:This the description of the meeting.\n\n" +
                        "SUMMARY:Test meeting request\n" +
                        "PRIORITY:5\n" +
                        "CLASS:PUBLIC\n" +
                        "BEGIN:VALARM\n" +
                        "TRIGGER:PT1440M\n" +
                        "ACTION:DISPLAY\n" +
                        "DESCRIPTION:Reminder\n" +
                        "END:VALARM\n" +
                        "END:VEVENT\n" +
                        "END:VCALENDAR");
    
                // Create the message part
                BodyPart messageBodyPart = new MimeBodyPart();
    
                // Fill the message
                messageBodyPart.setHeader("Content-Class", "urn:content-  classes:calendarmessage");
                messageBodyPart.setHeader("Content-ID", "calendar_message");
                messageBodyPart.setDataHandler(new DataHandler(
                        new ByteArrayDataSource(buffer.toString(), "text/calendar")));// very important
    
                // Create a Multipart
                Multipart multipart = new MimeMultipart();
    
                // Add part one
                multipart.addBodyPart(messageBodyPart);
    
                // Put parts in message
                message.setContent(multipart);
    
                // send message
                Transport.send(message);
            } catch (MessagingException me) {
                me.printStackTrace();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    

    3 - Replace your variable, and you are good to go!

    0 讨论(0)
  • 2020-12-13 22:43

    There's no sign that you're ever setting the from address to an actual address, so there's nowhere for the reply to come.

    That may not be the problem in your production code, but it looks like a problem here...

    0 讨论(0)
  • 2020-12-13 22:44

    Here,

    1 - Download jar from here (JavaMail API » 1.6.2).

    2 - Copy and Paste the following code (Change variable values)

    import java.util.Properties;
    import javax.activation.DataHandler;
    import javax.mail.*;
    import javax.mail.internet.*;
    import javax.mail.util.ByteArrayDataSource;
    
    public class Index {
    
    public static void main(String[] args) {
    
         try {
                final String username = "sender@mail.com";
                final String password = "xxxxx";
                
                String from = "sender@mail.com";
                String to = "attendee@mail.com";
                String subject = "Meeting Subject";
                String startDate = "20201208"; // Date Formate: YYYYMMDD
                String endDate = "20201208"; // Date Formate: YYYYMMDD
                String startTime = "0400"; // Time Formate: HHMM
                String endTime = "0600"; // Time Formate: HHMM
                String emailBody = "Hi Team, This is meeting description. Thanks"; 
                
                Properties prop = new Properties();
                prop.put("mail.smtp.auth", "true");
                prop.put("mail.smtp.starttls.enable", "true");
                prop.put("mail.smtp.host", "smtp.gmail.com");
                prop.put("mail.smtp.port", "25");
    
                Session session = Session.getDefaultInstance(prop,  new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(username, password);
                    }
                  });
                
                MimeMessage message = new MimeMessage(session);
                message.addHeaderLine("method=REQUEST");
                message.addHeaderLine("charset=UTF-8");
                message.addHeaderLine("component=VEVENT");
    
                message.setFrom(new InternetAddress(from, "New Outlook Event"));
                message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
                message.setSubject(subject);
    
                StringBuffer sb = new StringBuffer();
    
                StringBuffer buffer = sb.append("BEGIN:VCALENDAR\n" +
                        "PRODID:-//Microsoft Corporation//Outlook 9.0 MIMEDIR//EN\n" +
                        "VERSION:2.0\n" +
                        "METHOD:REQUEST\n" +
                        "BEGIN:VEVENT\n" +
                        "ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:"+ to +"\n" +
                        "DTSTART:"+ startDate +"T"+ startTime +"00Z\n" +
                        "DTEND:"+ endDate +"T"+ endTime +"00Z\n" +
                        "LOCATION:Conference room\n" +
                        "TRANSP:OPAQUE\n" +
                        "SEQUENCE:0\n" +
                        "UID:040000008200E00074C5B7101A82E00800000000002FF466CE3AC5010000000000000000100\n" +
                        " 000004377FE5C37984842BF9440448399EB02\n" +
                        "CATEGORIES:Meeting\n" +
                        "DESCRIPTION:"+ emailBody +"\n\n" +
                        "SUMMARY:Test meeting request\n" +
                        "PRIORITY:5\n" +
                        "CLASS:PUBLIC\n" +
                        "BEGIN:VALARM\n" +
                        "TRIGGER:PT1440M\n" +
                        "ACTION:DISPLAY\n" +
                        "DESCRIPTION:Reminder\n" +
                        "END:VALARM\n" +
                        "END:VEVENT\n" +
                        "END:VCALENDAR");
    
                // Create the message part
                BodyPart messageBodyPart = new MimeBodyPart();
    
                // Fill the message
                messageBodyPart.setHeader("Content-Class", "urn:content-  classes:calendarmessage");
                messageBodyPart.setHeader("Content-ID", "calendar_message");
                messageBodyPart.setDataHandler(new DataHandler(
                        new ByteArrayDataSource(buffer.toString(), "text/calendar")));// very important
    
                // Create a Multipart
                Multipart multipart = new MimeMultipart();
    
                // Add part one
                multipart.addBodyPart(messageBodyPart);
    
                // Put parts in message
                message.setContent(multipart);
    
                // send message
                Transport.send(message);
                
                System.out.println("Email sent!");
            } catch (MessagingException me) {
                me.printStackTrace();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
    }
    }
    

    3 - That's all, hit RUN......

    0 讨论(0)
  • 2020-12-13 22:51

    You can use ical4j library in addition of javamail to build the message body (instead of using a StringBuffer).

    Example:

    Calendar calendar = new Calendar();
    PropertyList calendarProperties = calendar.getProperties();
    calendarProperties.add(Version.VERSION_2_0);
    calendarProperties.add(Method.REQUEST);
    // other properties ...
    
    VEvent vEvent = new VEvent(/*startDate, endDate*/);
    PropertyList vEventProperties = vEvent.getProperties();
    vEventProperties.add(Priority.MEDIUM);
    vEventProperties.add(Clazz.PUBLIC);
    // other properties ...
    
    calendar.getComponents().add(vEvent);
    
    messageBodyPart.setDataHandler(new DataHandler(new ByteArrayDataSource(calendar.toString(), "text/calendar")));
    
    0 讨论(0)
  • 2020-12-13 22:58

    I'd tried with Amr answer but I got an error in Session session = Session.getDefaultInstance(prop, null),

    Well I fixed and here is the code I used and it worked perfectly. I hope it helps
    Remember you need to add javax.mail library to your project

    import java.util.Properties;
    import javax.activation.DataHandler;
    import javax.mail.*;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import javax.mail.util.ByteArrayDataSource;
    
    public class Email {
    
     public Email() {
     }
    
     public static void main(String[] args) {
         try {
             Email email = new Email();
             email.send();
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
    
     public void send() throws Exception {
    
        try {
            String from = "FromExample@gmail.com";
            String to = "ToExample@gmail.do";
            Properties prop = new Properties();
    
            prop.put("mail.smtp.auth", "true");
            prop.put("mail.smtp.starttls.enable", "true");
            prop.put("mail.smtp.host", "smtp.gmail.com");
            prop.put("mail.smtp.port", "587");
    
            final String username = "FromExample@gmail.com";
            final String password = "123456789";
    
            Session session = Session.getInstance(prop,
                      new javax.mail.Authenticator() {
                        protected PasswordAuthentication getPasswordAuthentication() {
                            return new PasswordAuthentication(username, password);
                        }
                      });
    
            // Define message
            MimeMessage message = new MimeMessage(session);
            message.addHeaderLine("method=REQUEST");
            message.addHeaderLine("charset=UTF-8");
            message.addHeaderLine("component=VEVENT");
    
            message.setFrom(new InternetAddress(from));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            message.setSubject("Outlook Meeting Request Using JavaMail");
    
            StringBuffer sb = new StringBuffer();
    
            StringBuffer buffer = sb.append("BEGIN:VCALENDAR\n" +
                    "PRODID:-//Microsoft Corporation//Outlook 9.0 MIMEDIR//EN\n" +
                    "VERSION:2.0\n" +
                    "METHOD:REQUEST\n" +
                    "BEGIN:VEVENT\n" +
                    "ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:xxx@xx.com\n" +
                    "ORGANIZER:MAILTO:xx@xx.com\n" +
                    "DTSTART:20180922T053000Z\n" +
                    "DTEND:20180927T060000Z\n" +
                    "LOCATION:Conference room\n" +
                    "TRANSP:OPAQUE\n" +
                    "SEQUENCE:0\n" +
                    "UID:040000008200E00074C5B7101A82E00800000000002FF466CE3AC5010000000000000000100\n" +
                    " 000004377FE5C37984842BF9440448399EB02\n" +
                    "DTSTAMP:20180922T120102Z\n" +
                    "CATEGORIES:Meeting\n" +
                    "DESCRIPTION:This the description of the meeting.\n\n" +
                    "SUMMARY:Test meeting request\n" +
                    "PRIORITY:5\n" +
                    "CLASS:PUBLIC\n" +
                    "BEGIN:VALARM\n" +
                    "TRIGGER:PT1440M\n" +
                    "ACTION:DISPLAY\n" +
                    "DESCRIPTION:Reminder\n" +
                    "END:VALARM\n" +
                    "END:VEVENT\n" +
                    "END:VCALENDAR");
    
            // Create the message part
            BodyPart messageBodyPart = new MimeBodyPart();
    
            // Fill the message
            messageBodyPart.setHeader("Content-Class", "urn:content-  classes:calendarmessage");
            messageBodyPart.setHeader("Content-ID", "calendar_message");
            messageBodyPart.setDataHandler(new DataHandler(
                    new ByteArrayDataSource(buffer.toString(), "text/calendar")));// very important
    
            // Create a Multipart
            Multipart multipart = new MimeMultipart();
    
            // Add part one
            multipart.addBodyPart(messageBodyPart);
    
            // Put parts in message
            message.setContent(multipart);
    
            // send message
    
    
            Transport.send(message);
    
            System.out.println("Success");
    
        } catch (MessagingException me) {
            me.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
     }
    }
    
    0 讨论(0)
提交回复
热议问题