1. 程式人生 > 實用技巧 >Java實現郵件收發

Java實現郵件收發

一. 準備工作

1. 傳輸協議

SMTP協議-->傳送郵件:
我們通常把處理使用者smtp請求(郵件傳送請求)的伺服器稱之為SMTP伺服器(郵件傳送伺服器)

POP3協議-->接收郵件:
我們通常把處理使用者pop3請求(郵件接收請求)的伺服器稱之為POP3伺服器(郵件接收伺服器)

2. 郵件收發原理

  1. 閃電俠網易雲郵箱通過smtp協議連線到Smtp伺服器,然後傳送一封郵件給網易的郵件伺服器
  2. 網易分析發現需要去QQ的郵件伺服器,通過smtp協議將郵件轉投給QQ的Smtp伺服器
  3. QQ將接收到的郵件儲存在 [email protected]這個郵件賬號的空間中
  4. 閃電俠qq郵箱通過Pop3協議連線到Pop3伺服器收取郵件
  5. [email protected]這個郵件賬號的空間中取出郵件
  6. Pop3伺服器將取出來的郵件送到閃電俠qq郵箱中

3. QQ郵箱中獲取對應的許可權

QQ郵箱需要安全驗證,我們需要獲取他對應的許可權;
QQ郵箱-->郵箱設定-->賬戶

4. 匯入jar包

mail.jar
activation.ja

二. Java傳送純文字郵件

編寫測試程式碼

public class SendMain {
    public static void main(String[] args) throws GeneralSecurityException, MessagingException 
{
    Properties prop = <span class="hljs-keyword">new</span> Properties();
    <span class="hljs-comment">//設定QQ郵件伺服器</span>
    prop.setProperty(<span class="hljs-string">"mail.host"</span>, <span class="hljs-string">"smtp.qq.com"</span>);
    <span class="hljs-comment">//郵件傳送協議</span>
    prop.setProperty(<span class="hljs-string">"mail.transport.protocol"</span>, <span class="hljs-string">"smtp"</span>);
    <span class="hljs-comment">//需要驗證使用者名稱密碼</span>
    prop.setProperty(<span class="hljs-string">"mail.smtp.auth"</span>, <span class="hljs-string">"true"</span>);

    <span class="hljs-comment">//關於QQ郵箱,還要設定SSL加密,加上以下程式碼即可</span>
    MailSSLSocketFactory sf = <span class="hljs-keyword">new</span> MailSSLSocketFactory();
    sf.setTrustAllHosts(<span class="hljs-keyword">true</span>);
    prop.put(<span class="hljs-string">"mail.smtp.ssl.enable"</span>, <span class="hljs-string">"true"</span>);
    prop.put(<span class="hljs-string">"mail.smtp.ssl.socketFactory"</span>, sf);

    <span class="hljs-comment">//使用JavaMail傳送郵件的5個步驟</span>
    <span class="hljs-comment">//1.txt、建立定義整個應用程式所需的環境資訊的Session物件</span>
    Session session = Session.getDefaultInstance(prop, <span class="hljs-keyword">new</span> Authenticator() {
        <span class="hljs-function"><span class="hljs-keyword">public</span> PasswordAuthentication <span class="hljs-title">getPasswordAuthentication</span><span class="hljs-params">()</span> </span>{
            <span class="hljs-comment">//發件人郵件使用者名稱、授權碼</span>
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> PasswordAuthentication(<span class="hljs-string">"[email protected]"</span>,
                    <span class="hljs-string">"授權碼"</span>);
        }
    });

    <span class="hljs-comment">//開啟Session的debug模式,這樣就可以檢視到程式傳送Email的執行狀態</span>
    session.setDebug(<span class="hljs-keyword">true</span>);

    <span class="hljs-comment">//2、通過session得到transport物件</span>
    Transport ts = session.getTransport();

    <span class="hljs-comment">//3、使用郵箱的使用者名稱和授權碼連上郵件伺服器</span>
    ts.connect(<span class="hljs-string">"smtp.qq.com"</span>, <span class="hljs-string">"[email protected]"</span>, <span class="hljs-string">"授權碼"</span>);

    <span class="hljs-comment">//4,建立郵件</span>
    <span class="hljs-comment">//4-1.txt,建立郵件物件</span>
    MimeMessage message = <span class="hljs-keyword">new</span> MimeMessage(session);

    <span class="hljs-comment">//4-2,指明郵件的發件人</span>
    message.setFrom(<span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"[email protected]"</span>));

    <span class="hljs-comment">//4-3,指明郵件的收件人</span>
    message.setRecipient(Message.RecipientType.TO, <span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"[email protected]"</span>));

    <span class="hljs-comment">//4-4,郵件標題</span>
    message.setSubject(<span class="hljs-string">"Hello"</span>);

    <span class="hljs-comment">//4-5,郵件文字內容</span>
    message.setContent(<span class="hljs-string">"我是鋼鐵俠!"</span>, <span class="hljs-string">"text/html;charset=UTF-8"</span>);

    <span class="hljs-comment">//4-6,傳送郵件</span>
    ts.sendMessage(message, message.getAllRecipients());

    <span class="hljs-comment">//5,關閉連線</span>
    ts.close();
}

}

三. Java傳送建立包含內嵌圖片的郵件

1. 匯入圖片

2. 編寫測試程式碼

public class SendMainpicture1 {
    public static void main(String[] args)throws GeneralSecurityException, MessagingException{
        Properties prop = new Properties();
        //設定QQ郵件伺服器
        prop.setProperty("mail.host", "smtp.qq.com");
        //郵件傳送協議
        prop.setProperty("mail.transport.protocol", "smtp");
        //需要驗證使用者名稱密碼
        prop.setProperty("mail.smtp.auth", "true");
    <span class="hljs-comment">//關於QQ郵箱,還要設定SSL加密,加上以下程式碼即可</span>
    MailSSLSocketFactory sf = <span class="hljs-keyword">new</span> MailSSLSocketFactory();
    sf.setTrustAllHosts(<span class="hljs-keyword">true</span>);
    prop.put(<span class="hljs-string">"mail.smtp.ssl.enable"</span>, <span class="hljs-string">"true"</span>);
    prop.put(<span class="hljs-string">"mail.smtp.ssl.socketFactory"</span>, sf);

    <span class="hljs-comment">//使用JavaMail傳送郵件的5個步驟</span>
    <span class="hljs-comment">//1.txt、建立定義整個應用程式所需的環境資訊的Session物件</span>
    Session session = Session.getDefaultInstance(prop, <span class="hljs-keyword">new</span> Authenticator() {
        <span class="hljs-function"><span class="hljs-keyword">public</span> PasswordAuthentication <span class="hljs-title">getPasswordAuthentication</span><span class="hljs-params">()</span> </span>{
            <span class="hljs-comment">//發件人郵件使用者名稱、授權碼</span>
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> PasswordAuthentication(<span class="hljs-string">"[email protected]"</span>,
                    <span class="hljs-string">"授權碼"</span>);
        }
    });
    <span class="hljs-comment">//開啟Session的debug模式,這樣就可以檢視到程式傳送Email的執行狀態</span>
    session.setDebug(<span class="hljs-keyword">true</span>);

    <span class="hljs-comment">//2、通過session得到transport物件</span>
    Transport ts = session.getTransport();
    <span class="hljs-comment">//3、使用郵箱的使用者名稱和授權碼連上郵件伺服器</span>
    ts.connect(<span class="hljs-string">"smtp.qq.com"</span>, <span class="hljs-string">"[email protected]"</span>, <span class="hljs-string">"授權碼"</span>);
    <span class="hljs-comment">//4,建立郵件</span>
    <span class="hljs-comment">//4-1.txt,建立郵件物件</span>
    MimeMessage message = <span class="hljs-keyword">new</span> MimeMessage(session);
    <span class="hljs-comment">//4-2,指明郵件的發件人</span>
    message.setFrom(<span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"[email protected]"</span>));
    <span class="hljs-comment">//4-3,指明郵件的收件人</span>
    message.setRecipient(Message.RecipientType.TO, <span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"[email protected]"</span>));
    <span class="hljs-comment">//4-4,郵件標題</span>
    message.setSubject(<span class="hljs-string">"Hello,鋼鐵俠"</span>);
    <span class="hljs-comment">//5.準備圖片</span>
    MimeBodyPart image = <span class="hljs-keyword">new</span> MimeBodyPart();
    DataHandler dh = <span class="hljs-keyword">new</span> DataHandler(<span class="hljs-keyword">new</span> FileDataSource(<span class="hljs-string">"src/resources/9.jpg"</span>));
    image.setDataHandler(dh);
    image.setContentID(<span class="hljs-string">"9.jpg"</span>);
    <span class="hljs-comment">//6.準備正文資料</span>
    MimeBodyPart text = <span class="hljs-keyword">new</span> MimeBodyPart();
    text.setContent(<span class="hljs-string">"這是一封郵件正文帶圖片&lt;img src='cid:9.jpg'&gt;的郵件"</span>, <span class="hljs-string">"text/html;charset=UTF-8"</span>);
    <span class="hljs-comment">//7.描述資料關係</span>
    MimeMultipart mm = <span class="hljs-keyword">new</span> MimeMultipart();
    mm.addBodyPart(text);
    mm.addBodyPart(image);
    mm.setSubType(<span class="hljs-string">"related"</span>);
    <span class="hljs-comment">//設定到訊息中,儲存修改</span>
    message.setContent(mm);
    message.saveChanges();
    <span class="hljs-comment">//傳送郵件</span>
    ts.sendMessage(message, message.getAllRecipients());
    ts.close();
}

}

四. Java傳送帶圖片和附件的複雜郵件

1. 匯入附件和圖片

2. 編寫測試程式碼

public class SendMainpicture2 {
    public static void main(String[] args) throws GeneralSecurityException, MessagingException {
        Properties prop = new Properties();
        //設定QQ郵件伺服器
        prop.setProperty("mail.host", "smtp.qq.com");
        //郵件傳送協議
        prop.setProperty("mail.transport.protocol", "smtp");
        //需要驗證使用者名稱密碼
        prop.setProperty("mail.smtp.auth", "true");
    <span class="hljs-comment">//關於QQ郵箱,還要設定SSL加密,加上以下程式碼即可</span>
    MailSSLSocketFactory sf = <span class="hljs-keyword">new</span> MailSSLSocketFactory();
    sf.setTrustAllHosts(<span class="hljs-keyword">true</span>);
    prop.put(<span class="hljs-string">"mail.smtp.ssl.enable"</span>, <span class="hljs-string">"true"</span>);
    prop.put(<span class="hljs-string">"mail.smtp.ssl.socketFactory"</span>, sf);

    <span class="hljs-comment">//使用JavaMail傳送郵件的5個步驟</span>
    <span class="hljs-comment">//1.txt、建立定義整個應用程式所需的環境資訊的Session物件</span>
    Session session = Session.getDefaultInstance(prop, <span class="hljs-keyword">new</span> Authenticator() {
        <span class="hljs-function"><span class="hljs-keyword">public</span> PasswordAuthentication <span class="hljs-title">getPasswordAuthentication</span><span class="hljs-params">()</span> </span>{
            <span class="hljs-comment">//發件人郵件使用者名稱、授權碼</span>
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> PasswordAuthentication(<span class="hljs-string">"[email protected]"</span>,
                    <span class="hljs-string">"授權碼"</span>);
        }
    });
    <span class="hljs-comment">//可以通過session開啟Dubug模式,檢視所有的過程</span>
    session.setDebug(<span class="hljs-keyword">true</span>);


    <span class="hljs-comment">//2.獲取連線物件,通過session物件獲得Transport,需要捕獲或者丟擲異常;</span>
    Transport tp = session.getTransport();
    <span class="hljs-comment">//3.連線伺服器,需要丟擲異常;</span>
    tp.connect(<span class="hljs-string">"smtp.qq.com"</span>,<span class="hljs-string">"[email protected]"</span>,<span class="hljs-string">"授權碼"</span>);
    <span class="hljs-comment">//4.連線上之後我們需要傳送郵件;</span>
    MimeMessage mimeMessage = imageMail(session);
    <span class="hljs-comment">//5.傳送郵件</span>
    tp.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
    <span class="hljs-comment">//6.關閉連線</span>
    tp.close();
}

<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> MimeMessage <span class="hljs-title">imageMail</span><span class="hljs-params">(Session session)</span> <span class="hljs-keyword">throws</span> MessagingException </span>{
    <span class="hljs-comment">//訊息的固定資訊</span>
    MimeMessage mimeMessage = <span class="hljs-keyword">new</span> MimeMessage(session);
    <span class="hljs-comment">//郵件傳送人</span>
    mimeMessage.setFrom(<span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"[email protected]"</span>));
    <span class="hljs-comment">//郵件接收人,可以同時傳送給很多人</span>
    mimeMessage.setRecipient(Message.RecipientType.TO, <span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"[email protected]"</span>));
    mimeMessage.setSubject(<span class="hljs-string">"我也不知道是個什麼東西就發給你了"</span>); <span class="hljs-comment">//郵件主題</span>

    <span class="hljs-comment">//圖片</span>
    MimeBodyPart body1 = <span class="hljs-keyword">new</span> MimeBodyPart();
    body1.setDataHandler(<span class="hljs-keyword">new</span> DataHandler(<span class="hljs-keyword">new</span> FileDataSource(<span class="hljs-string">"src/resources/9.jpg"</span>)));
    body1.setContentID(<span class="hljs-string">"9.jpg"</span>); <span class="hljs-comment">//圖片設定ID</span>

    <span class="hljs-comment">//文字</span>
    MimeBodyPart body2 = <span class="hljs-keyword">new</span> MimeBodyPart();
    body2.setContent(<span class="hljs-string">"請注意,我不是廣告&lt;img src='cid:9.jpg'&gt;"</span>,<span class="hljs-string">"text/html;charset=utf-8"</span>);

    <span class="hljs-comment">//附件</span>
    MimeBodyPart body3 = <span class="hljs-keyword">new</span> MimeBodyPart();
    body3.setDataHandler(<span class="hljs-keyword">new</span> DataHandler(<span class="hljs-keyword">new</span> FileDataSource(<span class="hljs-string">"src/resources/log4j.properties"</span>)));
    body3.setFileName(<span class="hljs-string">"log4j.properties"</span>); <span class="hljs-comment">//附件設定名字</span>

    MimeBodyPart body4 = <span class="hljs-keyword">new</span> MimeBodyPart();
    body4.setDataHandler(<span class="hljs-keyword">new</span> DataHandler(<span class="hljs-keyword">new</span> FileDataSource(<span class="hljs-string">"src/resources/1.txt"</span>)));
    body4.setFileName(<span class="hljs-string">"1.txt"</span>); <span class="hljs-comment">//附件設定名字</span>

    <span class="hljs-comment">//拼裝郵件正文內容</span>
    MimeMultipart multipart1 = <span class="hljs-keyword">new</span> MimeMultipart();
    multipart1.addBodyPart(body1);
    multipart1.addBodyPart(body2);
    multipart1.setSubType(<span class="hljs-string">"related"</span>); <span class="hljs-comment">//1.txt.文字和圖片內嵌成功!</span>

    <span class="hljs-comment">//new MimeBodyPart().setContent(multipart1); //將拼裝好的正文內容設定為主體</span>
    MimeBodyPart contentText =  <span class="hljs-keyword">new</span> MimeBodyPart();
    contentText.setContent(multipart1);

    <span class="hljs-comment">//拼接附件</span>
    MimeMultipart allFile =<span class="hljs-keyword">new</span> MimeMultipart();
    allFile.addBodyPart(body3); <span class="hljs-comment">//附件</span>
    allFile.addBodyPart(body4); <span class="hljs-comment">//附件</span>
    allFile.addBodyPart(contentText);<span class="hljs-comment">//正文</span>
    allFile.setSubType(<span class="hljs-string">"mixed"</span>); <span class="hljs-comment">//正文和附件都存在郵件中,所有型別設定為mixed;</span>

    <span class="hljs-comment">//放到Message訊息中</span>
    mimeMessage.setContent(allFile);
    mimeMessage.saveChanges();<span class="hljs-comment">//儲存修改</span>

    <span class="hljs-keyword">return</span> mimeMessage;
}

}