精华内容
下载资源
问答
  • 但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件发送。本文将简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件。1. 电子邮件协议电子邮件的在网络中传输和网页...

    电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等。但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。本文将简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件。

    1. 电子邮件协议

    电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,所以本文也只会涉及到SMTP协议。SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。

    2. JavaMail

    我们平时通过 Java 代码打开一个 http 网页链接时,通常可以使用已经对 http 协议封装好的 HttpURLConnection 类来快速地实现。Java 官方也提供了对电子邮件协议封装的 Java 类库,就是JavaMail,但并没有包含到标准的 JDK 中,需要我们自己去官方下载,这里我从 JavaEE 官方的 Github 仓库下载。

    这里我下载的版本是 1.6.0 版本,包含了 SMTP, IMAP, 和 POP3 协议的实现的 jar 包:

    3a87d41e65b733563ecfb042e9ef4a58.png

    我把 JavaMail 1.6.0 的 jar 包上传到了 CSDN,如果无法从 Github 下载,可以从 CSDN 下载(建议到Github下载,CSDN上我设了积分): http://download.csdn.net/download/xietansheng/9928266

    特别注意:

    本测试用例用的 JavaMail 版本是 1.6.0,如果下载到其他版本的 JavaMail 运行时出现问题,请使用 JavaMail 1.6.0 版本再进行尝试。

    使用 JavaMail 1.6.0 要求的 JDK 版本必须是 JDK 1.7 以上(建议使用最新版 JDK)。

    不要直接就完完全全复制我的代码,需要 修改一下发送的标题、内容、用户昵称,要不然所有人都直接复制我的代码发送,内容一致,邮箱服务器就可能会检测到这些内容是垃圾广告内容,不让你发送,会返回错误码,查询错误码也能查询到失败原因。

    有些童鞋反应代码提示某些类找不到,或运行出现问题,往往都是 JDK 版本过低,或 JavaMail 版本过低,出现问题时 请使用推荐的版本。

    再出现问题,只要能连接成功,都有错误码返回,有些童鞋发送失败在控制台已经给出了错误码,大部分还给出了查看错误码含义的链接,点开链接,查询对应的错误码,为什么失败,已经明明白白的告诉你了,针对失败原因修改即可!

    邮件发送,涉及多端(本地代码端、邮件发送服务器端、邮件接收服务器端),保证自己的代码没问题了,不一定就能成功,你把你的邮件提交到邮件发送服务器,发送的服务器可以给你拒绝服务(比如认为发送的内容是垃圾广告,或者你频繁请求发送),这不是代码端能管的事情,但都有错误码返回,明确告诉你为什么错误。就算你发送成功了,对方也有可能接收不到,成功发送到对方的邮件接收服务器后,对方的服务器可以根据你的内容拒绝收你的邮件(比如认为你的内容是广告诈骗等信息,或者发送过于频繁),对方的服务器可能直接把你的邮件扔垃圾箱,或者直接忽略。出现这些问题,请修改发送的标题、内容、昵称等,重复的内容不要反复发送,或多更换收件箱和发件箱试试!!!

    3. 创建一封简单的电子邮件

    首先创建一个 Java 工程,把下载好的 javax.mail.jar 作为类库加入工程,这里不多说。

    邮件创建步骤:

    创建一个邮件对象(MimeMessage);

    设置发件人,收件人,可选增加多个收件人,抄送人,密送人;

    设置邮件的主题(标题);

    设置邮件的正文(内容);

    设置显示的发送时间;

    保存到本地。

    代码实现:

    package com.xiets.javamaildemo;

    import javax.mail.Session;

    import javax.mail.internet.InternetAddress;

    import javax.mail.internet.MimeMessage;

    import java.io.FileOutputStream;

    import java.io.OutputStream;

    import java.util.Date;

    import java.util.Properties;

    /**

    * JavaMail 版本: 1.6.0

    * JDK 版本: JDK 1.7 以上(必须)

    */

    public class Main {

    public static void main(String[] args) throws Exception {

    // 1. 创建一封邮件

    Properties props = new Properties(); // 用于连接邮件服务器的参数配置(发送邮件时才需要用到)

    Session session= Session.getInstance(props); // 根据参数配置,创建会话对象(为了发送邮件准备的)

    MimeMessage message = new MimeMessage(session); // 创建邮件对象

    /*

    * 也可以根据已有的eml邮件文件创建 MimeMessage 对象

    * MimeMessage message = new MimeMessage(session, new FileInputStream("MyEmail.eml"));

    */

    // 2. From: 发件人

    // 其中 InternetAddress 的三个参数分别为: 邮箱, 显示的昵称(只用于显示, 没有特别的要求), 昵称的字符集编码

    // 真正要发送时, 邮箱必须是真实有效的邮箱。

    message.setFrom(new InternetAddress("aa@send.com", "USER_AA", "UTF-8"));

    // 3. To: 收件人

    message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("cc@receive.com", "USER_CC", "UTF-8"));

    // To: 增加收件人(可选)

    message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress("dd@receive.com", "USER_DD", "UTF-8"));

    // Cc: 抄送(可选)

    message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress("ee@receive.com", "USER_EE", "UTF-8"));

    // Bcc: 密送(可选)

    message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress("ff@receive.com", "USER_FF", "UTF-8"));

    // 4. Subject: 邮件主题

    message.setSubject("TEST邮件主题", "UTF-8");

    // 5. Content: 邮件正文(可以使用html标签)

    message.setContent("TEST这是邮件正文。。。", "text/html;charset=UTF-8");

    // 6. 设置显示的发件时间

    message.setSentDate(new Date());

    // 7. 保存前面的设置

    message.saveChanges();

    // 8. 将该邮件保存到本地

    OutputStream out = new FileOutputStream("MyEmail.eml");

    message.writeTo(out);

    out.flush();

    out.close();

    }

    }

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    保存的 MyEmail.eml 可以使用邮件客户端打开查看,实际上就是一堆符合SMTP协议格式的文本(内容使用base64进行了编码),也可用记事本打开,如下所示:

    6bbd20b0bf8f51c49262dc7828366e27.png

    7f0651b89c62f7fbee3d8fc82cf2b843.png

    4. 发送电子邮件

    发送邮件首先需要有一个邮箱账号和密码,本文以网易163邮箱为例,邮箱账号必须要开启 SMTP 服务,在浏览器网页登录邮箱后一般在邮箱的“设置”选项中可以开启,并记下邮箱的 SMTP 服务器地址,如下所示(其他邮箱大同小异):

    cd823a3abb4c4800599653428689e210.png

    代码实现:

    package com.xiets.javamaildemo;

    import javax.mail.Session;

    import javax.mail.Transport;

    import javax.mail.internet.InternetAddress;

    import javax.mail.internet.MimeMessage;

    import java.util.Date;

    import java.util.Properties;

    /**

    * JavaMail 版本: 1.6.0

    * JDK 版本: JDK 1.7 以上(必须)

    */

    public class Main {

    // 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)

    // PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”),

    // 对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。

    public static String myEmailAccount = "xxxxxxxxx@163.com";

    public static String myEmailPassword = "xxxxxxxxx";

    // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com

    // 网易163邮箱的 SMTP 服务器地址为: smtp.163.com

    public static String myEmailSMTPHost = "smtp.163.com";

    // 收件人邮箱(替换为自己知道的有效邮箱)

    public static String receiveMailAccount = "xxxxxxxxx@qq.com";

    public static void main(String[] args) throws Exception {

    // 1. 创建参数配置, 用于连接邮件服务器的参数配置

    Properties props = new Properties(); // 参数配置

    props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)

    props.setProperty("mail.smtp.host", myEmailSMTPHost); // 发件人的邮箱的 SMTP 服务器地址

    props.setProperty("mail.smtp.auth", "true"); // 需要请求认证

    // PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),

    // 如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,

    // 打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。

    /*

    // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,

    // 需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,

    // QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)

    final String smtpPort = "465";

    props.setProperty("mail.smtp.port", smtpPort);

    props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

    props.setProperty("mail.smtp.socketFactory.fallback", "false");

    props.setProperty("mail.smtp.socketFactory.port", smtpPort);

    */

    // 2. 根据配置创建会话对象, 用于和邮件服务器交互

    Session session = Session.getInstance(props);

    session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log

    // 3. 创建一封邮件

    MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount);

    // 4. 根据 Session 获取邮件传输对象

    Transport transport = session.getTransport();

    // 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错

    //

    // PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log,

    // 仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误

    // 类型到对应邮件服务器的帮助网站上查看具体失败原因。

    //

    // PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:

    // (1) 邮箱没有开启 SMTP 服务;

    // (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;

    // (3) 邮箱服务器要求必须要使用 SSL 安全连接;

    // (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;

    // (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。

    //

    // PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。

    transport.connect(myEmailAccount, myEmailPassword);

    // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人

    transport.sendMessage(message, message.getAllRecipients());

    // 7. 关闭连接

    transport.close();

    }

    /**

    * 创建一封只包含文本的简单邮件

    *

    *@param session 和服务器交互的会话

    *@param sendMail 发件人邮箱

    *@param receiveMail 收件人邮箱

    *@return

    *@throws Exception

    */

    public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {

    // 1. 创建一封邮件

    MimeMessage message = new MimeMessage(session);

    // 2. From: 发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称)

    message.setFrom(new InternetAddress(sendMail, "某宝网", "UTF-8"));

    // 3. To: 收件人(可以增加多个收件人、抄送、密送)

    message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "XX用户", "UTF-8"));

    // 4. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)

    message.setSubject("打折钜惠", "UTF-8");

    // 5. Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)

    message.setContent("XX用户你好, 今天全场5折, 快来抢购, 错过今天再等一年。。。", "text/html;charset=UTF-8");

    // 6. 设置发件时间

    message.setSentDate(new Date());

    // 7. 保存设置

    message.saveChanges();

    return message;

    }

    }

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    84

    85

    86

    87

    88

    89

    90

    91

    92

    93

    94

    95

    96

    97

    98

    99

    100

    101

    102

    103

    104

    105

    106

    107

    108

    109

    110

    111

    112

    113

    114

    115

    116

    117

    发送后查看收件人的收件箱:

    057c80685dfaf6ae8d67025f7a449b79.png

    展开全文
  • 在项目的开发中 用户修改密码,需要发送验证码到用户邮箱,在common.php公共文件中加入以下代码:/*** 系统邮件发送函数* @param string $tomail 接收邮件者邮箱* @param string $name 接收邮件者名称* @param ...

    在项目的开发中 用户修改密码,需要发送验证码到用户邮箱,

    在common.php公共文件中加入以下代码:

    /**

    * 系统邮件发送函数

    * @param string $tomail 接收邮件者邮箱

    * @param string $name 接收邮件者名称

    * @param string $subject 邮件主题

    * @param string $body 邮件内容

    * @param string $attachment 附件列表

    * @return boolean

    */

    function send_mail($tomail, $name, $subject = '', $body = '', $attachment = null) {

    $mail = new PHPMailer\PHPMailer\PHPMailer(); //实例化PHPMailer对象

    $mail->CharSet = 'UTF-8'; //设定邮件编码,默认ISO-8859-1,如果发中文此项必须设置,否则乱码

    $mail->IsSMTP(); // 设定使用SMTP服务

    $mail->SMTPDebug = 0; // SMTP调试功能 0=关闭 1 = 错误和消息 2 = 消息

    $mail->SMTPAuth = true; // 启用 SMTP 验证功能

    $mail->SMTPSecure = 'ssl'; // 使用安全协议

    $mail->Host = "smtp.qq.com"; // SMTP 服务器

    $mail->Port = 465; // SMTP服务器的端口号

    $mail->Username = "xxxxxx@qq.com"; // SMTP服务器用户名

    $mail->Password = "xxxxxx"; // SMTP服务器密码

    $mail->SetFrom('xxxx@qq.com', '发送人的名称');

    $replyEmail = ''; //留空则为发件人EMAIL

    $replyName = ''; //回复名称(留空则为发件人名称)

    $mail->AddReplyTo($replyEmail, $replyName);

    $mail->Subject = $subject;

    $mail->MsgHTML($body);

    $mail->AddAddress($tomail, $name);

    if (is_array($attachment)) { // 添加附件

    foreach ($attachment as $file) {

    is_file($file) && $mail->AddAttachment($file);

    }

    }

    return $mail->Send();

    }

    控制器:

    public function email(){

    //收件人的邮箱

    $toemail='xxxxx@qq.com';

    //收件人的名称

    $name='xxxxxxx';

    $subject='QQ邮件发送测试';

    $code = mt_rand(10000, 99999);

    session("code",$code);

    $content='你得验证码为'.$code;

    dump(send_mail($toemail,$name,$subject,$content));

    }

    最后验证是否正确 根据输入验证码的去判断取出session的 code的进行比较

    TP5实现邮件发送(二)使用 composer 命令进行安装或下载源代码使用。

    composer require houdunwang/mail

    邮件配置,以下是126邮箱配置的示例:

    return [

    'ssl' => false,//服务器使用ssl

    'username' => 'houdunwang@126.com',//邮箱帐号

    'password' => '',//登录密码

    'host' => 'smtp.126.com',//服务器主机

    'port' => '25',//服务器端口号

    'fromname' => '后盾网',//发件人(会员收到邮件时显示)

    'frommail' => 'houdunwang@126.com',//发件人邮箱(会员收到邮件时显示)

    ];

    发送邮件

    函数语法

    Mail::send(收件人邮箱,收件人名称,邮件标题,邮件内容);

    发送邮件

    Mail::send(

    'xxx@qq.com',

    'xxx@qq.com',

    "这是邮件标题",

    "这是邮件正文"

    );

    使用闭包设置内容

    Mail::send('test@xx.com', 'test@xx.com', "这是邮件标题", function () { return View::instance()->with(['title' => '测试邮件发送成功', 'content' => '这是邮件内容'])->fetch('resource/view/email.html'); });

    展开全文
  • 本文实例讲述了java编程实现邮件定时发送的方法。分享给大家供大家参考,具体如下:最近做项目时客户提出了一个需求:系统定时发送E-mail到其客户,达到通知的效果。先将实例分享给大家,如果确实有一些帮助的话,请...

    本文实例讲述了java编程实现邮件定时发送的方法。分享给大家供大家参考,具体如下:

    最近做项目时客户提出了一个需求:系统定时发送E-mail到其客户,达到通知的效果。先将实例分享给大家,如果确实有一些帮助的话,请大家来点掌声!

    首先介绍java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util. TimerTask)

    如: 每隔一个小时执行任务 timer.schedule(TimerTask, 0, 60 * 60 * 1000);

    schedule方法的第一个参数是需要执行的任务,此类的类型为java.util.TimerTask,第二个参数为执行任务前等待时间,此处0表示不等待,第三个参数为间隔时间,单位为毫秒

    由于我们希望当Web工程启动时,定时器能自动开始计时,这样在整个Web工程的生命期里,就会定时的执行任务,因此启动定时器的类不能是一般的类,此处用Servlet的监听器类来启动定时器,通过在配置文件里配置此监听器, 让其在工程启动时自动加载运行,存活期为整个Web工程生命期.

    要运用Servlet侦听器需要实现javax.servlet.ServletContextListener接口,以下是实例:

    public class MyTimerTask implements ServletContextListener

    {

    private Timer timer = null;

    public void contextDestroyed(ServletContextEvent event)

    {

    timer.cancel();

    event.getServletContext().log("定时器销毁");

    }

    public void contextInitialized(ServletContextEvent event)

    {

    //在这里初始化监听器,在tomcat启动的时候监听器启动,可以在这里实现定时器功能

    timer = new Timer(true);

    event.getServletContext().log("定时器已启动");//添加日志,可在tomcat日志中查看到

    //调用exportHistoryBean,0表示任务无延迟,5*1000表示每隔5秒执行任务,60*60*1000表示一个小时;

    timer.schedule(new SendEmail(event.getServletContext()),0,24*60*60*1000);

    }

    }

    使用javamail发送邮件需要两个包(下面我上传的有,下载即可):activation.jar   mail.jar将这两个报发到项目的lib目录下

    public class SendEmail extends TimerTask

    {

    private ServletContext context = null;

    public SendEmail(ServletContext context)

    {

    this.context = context;

    }

    @Override

    public void run()

    {

    /*

    * 以下为javamail的邮件发送

    */

    System.out.println("正在发送邮件");

    Properties props=new Properties();

    props.put("mail.smtp.host","smtp.163.com");//发件人使用发邮件的电子信箱服务器我使用的是163的服务器

    props.put("mail.smtp.auth","true"); //这样才能通过验证

    Session s=Session.getInstance(props);

    s.setDebug(true);

    MimeMessage message=new MimeMessage(s);

    //给消息对象设置发件人/收件人/主题/发信时间

    InternetAddress from=new InternetAddress("daida@163.com"); //发邮件的出发地(发件人的信箱),这是我的邮箱地址,使用请改成你的有效地址

    message.setFrom(from);

    InternetAddress to=new InternetAddress(tto);// tto为发邮件的目的地(收件人信箱)

    message.setRecipient(Message.RecipientType.TO,to);

    message.setSubject(ttitle);// ttitle为邮件的标题

    message.setSentDate(new Date());

    BodyPart mdp=new MimeBodyPart();//新建一个存放信件内容的BodyPart对象

    mdp.setContent(tcontent,"text/html;charset=utf-8");//给BodyPart对象设置内容和格式/编码方式tcontent为邮件内容

    Multipart mm=new MimeMultipart();//新建一个MimeMultipart对象用来存放BodyPart对

    //象(事实上可以存放多个)

    mm.addBodyPart(mdp);//将BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart)

    message.setContent(mm);//把mm作为消息对象的内容

    message.saveChanges();

    Transport transport=s.getTransport("smtp");

    transport.connect("smtp.163.com","daida","789-jik");//发邮件人帐户密码,此外是我的帐户密码,使用时请修改。

    transport.sendMessage(message,message.getAllRecipients());

    transport.close();

    }

    }

    catch (Exception e)

    {

    e.printStackTrace();

    }

    }

    }

    }

    该定时器在web.xml中的配置为:

    xmlns="http://java.sun.com/xml/ns/j2ee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    cachay.saga.utils.MyTimerTask

    至此,所有操作均已完成,需要加入activation.jar   mail.jar

    展开全文
  • python 发送邮件

    千次阅读 2021-02-03 02:23:35
    smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主...

    python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。

    smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。

    email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。

    7f6e1b8c4f3121fb981ca2dcd8952b05.png

    1.smtplib模块

    smtplib使用较为简单。以下是最基本的语法。

    导入及使用方法如下:

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    import smtplib

    smtp = smtplib.SMTP()

    smtp.connect('smtp.163.com',25)

    smtp.login(username, password)

    smtp.sendmail(sender, receiver, msg.as_string())

    smtp.quit()

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    说明:

    smtplib.SMTP():实例化SMTP()

    connect(host,port):

    host:指定连接的邮箱服务器。常用邮箱的smtp服务器地址如下:

    新浪邮箱:smtp.sina.com,新浪VIP:smtp.vip.sina.com,搜狐邮箱:smtp.sohu.com,126邮箱:smtp.126.com,139邮箱:smtp.139.com,163网易邮箱:smtp.163.com。

    port:指定连接服务器的端口号,默认为25.

    login(user,password):

    user:登录邮箱的用户名。

    password:登录邮箱的密码,像笔者用的是网易邮箱,网易邮箱一般是网页版,需要用到客户端密码,需要在网页版的网易邮箱中设置授权码,该授权码即为客户端密码。

    sendmail(from_addr,to_addrs,msg,...):

    from_addr:邮件发送者地址

    to_addrs:邮件接收者地址。字符串列表['接收地址1','接收地址2','接收地址3',...]或'接收地址'

    msg:发送消息:邮件内容。一般是msg.as_string():as_string()是将msg(MIMEText对象或者MIMEMultipart对象)变为str。

    quit():用于结束SMTP会话。

    2.email模块

    email模块下有mime包,mime英文全称为“Multipurpose Internet Mail Extensions”,即多用途互联网邮件扩展,是目前互联网电子邮件普遍遵循的邮件技术规范。

    该mime包下常用的有三个模块:text,image,multpart。

    导入方法如下:

    from email.mime.multipart import MIMEMultipart

    from email.mime.text import MIMEText

    from email.mime.image import MIMEImage

    构造一个邮件对象就是一个Message对象,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:

    Message

    +- MIMEBase

    +- MIMEMultipart

    +- MIMENonMultipart

    +- MIMEMessage

    +- MIMEText

    +- MIMEImage

    2.1 text说明

    邮件发送程序为了防止有些邮件阅读软件不能显示处理HTML格式的数据,通常都会用两类型分别为"text/plain"和"text/html"

    构造MIMEText对象时,第一个参数是邮件正文,第二个参数是MIME的subtype,最后一定要用utf-8编码保证多语言兼容性。

    2.1.1添加普通文本

    text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.baidu.com"

    text_plain = MIMEText(text,'plain', 'utf-8')

    查看MIMEText属性:可以观察到MIMEText,MIMEImage和MIMEMultipart的属性都一样。

    print dir(text_plain)

    ['__contains__', '__delitem__', '__doc__', '__getitem__', '__init__', '__len__', '__module__', '__setitem__', '__str__', '_charset', '_default_type', '_get_params_preserve', '_headers', '_payload', '_unixfrom', 'add_header', 'as_string', 'attach', 'defects', 'del_param', 'epilogue', 'get', 'get_all', 'get_boundary', 'get_charset', 'get_charsets', 'get_content_charset', 'get_content_maintype', 'get_content_subtype', 'get_content_type', 'get_default_type', 'get_filename', 'get_param', 'get_params', 'get_payload', 'get_unixfrom', 'has_key', 'is_multipart', 'items', 'keys', 'preamble', 'replace_header', 'set_boundary', 'set_charset', 'set_default_type', 'set_param', 'set_payload', 'set_type', 'set_unixfrom', 'values', 'walk']

    2.1.2添加超文本

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    html = """

    Here is the link you wanted.

    """

    text_html = MIMEText(html,'html', 'utf-8')

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    2.1.3添加附件

    sendfile=open(r'D:\pythontest\1111.txt','rb').read()

    text_att = MIMEText(sendfile, 'base64', 'utf-8')

    text_att["Content-Type"] = 'application/octet-stream'

    text_att["Content-Disposition"] = 'attachment; filename="显示的名字.txt"'

    2.2 image说明

    添加图片:

    sendimagefile=open(r'D:\pythontest\testimage.png','rb').read()

    image = MIMEImage(sendimagefile)

    image.add_header('Content-ID','')

    查看MIMEImage属性:

    print dir(image)

    ['__contains__', '__delitem__', '__doc__', '__getitem__', '__init__', '__len__', '__module__', '__setitem__', '__str__', '_charset', '_default_type', '_get_params_preserve', '_headers', '_payload', '_unixfrom', 'add_header', 'as_string', 'attach', 'defects', 'del_param', 'epilogue', 'get', 'get_all', 'get_boundary', 'get_charset', 'get_charsets', 'get_content_charset', 'get_content_maintype', 'get_content_subtype', 'get_content_type', 'get_default_type', 'get_filename', 'get_param', 'get_params', 'get_payload', 'get_unixfrom', 'has_key', 'is_multipart', 'items', 'keys', 'preamble', 'replace_header', 'set_boundary', 'set_charset', 'set_default_type', 'set_param', 'set_payload', 'set_type', 'set_unixfrom', 'values', 'walk']

    2.3 multpart说明

    常见的multipart类型有三种:multipart/alternative, multipart/related和multipart/mixed。

    邮件类型为"multipart/alternative"的邮件包括纯文本正文(text/plain)和超文本正文(text/html)。

    邮件类型为"multipart/related"的邮件正文中包括图片,声音等内嵌资源。

    邮件类型为"multipart/mixed"的邮件包含附件。向上兼容,如果一个邮件有纯文本正文,超文本正文,内嵌资源,附件,则选择mixed类型。

    msg = MIMEMultipart('mixed')

    我们必须把Subject,From,To,Date添加到MIMEText对象或者MIMEMultipart对象中,邮件中才会显示主题,发件人,收件人,时间(若无时间,就默认一般为当前时间,该值一般不设置)。

    msg = MIMEMultipart('mixed')

    msg['Subject'] = 'Python email test'

    msg['From'] = 'XXX@163.com '

    msg['To'] = 'XXX@126.com'

    msg['Date']='2012-3-16'

    查看MIMEMultipart属性:

    msg = MIMEMultipart('mixed')

    print dir(msg)

    结果:

    ['__contains__', '__delitem__', '__doc__', '__getitem__', '__init__', '__len__', '__module__', '__setitem__', '__str__', '_charset', '_default_type', '_get_params_preserve', '_headers', '_payload', '_unixfrom', 'add_header', 'as_string', 'attach', 'defects', 'del_param', 'epilogue', 'get', 'get_all', 'get_boundary', 'get_charset', 'get_charsets', 'get_content_charset', 'get_content_maintype', 'get_content_subtype', 'get_content_type', 'get_default_type', 'get_filename', 'get_param', 'get_params', 'get_payload', 'get_unixfrom', 'has_key', 'is_multipart', 'items', 'keys', 'preamble', 'replace_header', 'set_boundary', 'set_charset', 'set_default_type', 'set_param', 'set_payload', 'set_type', 'set_unixfrom', 'values', 'walk']

    说明:

    msg.add_header(_name,_value,**_params):添加邮件头字段。

    msg.as_string():是将msg(MIMEText对象或者MIMEMultipart对象)变为str,如果只有一个html超文本正文或者plain普通文本正文的话,一般msg的类型可以是MIMEText;如果是多个的话,就都添加到MIMEMultipart,msg类型就变为MIMEMultipart。

    msg.attach(MIMEText对象或MIMEImage对象):将MIMEText对象或MIMEImage对象添加到MIMEMultipart对象中。MIMEMultipart对象代表邮件本身,MIMEText对象或MIMEImage对象代表邮件正文。

    以上的构造的文本,超文本,附件,图片都何以添加到MIMEMultipart('mixed')中:

    msg.attach(text_plain)

    msg.attach(text_html)

    msg.attach(text_att)

    msg.attach(image)

    3.文字,html,图片,附件实现实例

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    #coding: utf-8

    import smtplib

    from email.mime.multipart import MIMEMultipart

    from email.mime.text import MIMEText

    from email.mime.image import MIMEImage

    from email.header import Header

    #设置smtplib所需的参数

    #下面的发件人,收件人是用于邮件传输的。

    smtpserver = 'smtp.163.com'

    username = 'XXX@163.com'

    password='XXX'

    sender='XXX@163.com'

    #receiver='XXX@126.com'

    #收件人为多个收件人

    receiver=['XXX@126.com','XXX@126.com']

    subject = 'Python email test'

    #通过Header对象编码的文本,包含utf-8编码信息和Base64编码信息。以下中文名测试ok

    #subject = '中文标题'

    #subject=Header(subject, 'utf-8').encode()

    #构造邮件对象MIMEMultipart对象

    #下面的主题,发件人,收件人,日期是显示在邮件页面上的。

    msg = MIMEMultipart('mixed')

    msg['Subject'] = subject

    msg['From'] = 'XXX@163.com '

    #msg['To'] = 'XXX@126.com'

    #收件人为多个收件人,通过join将列表转换为以;为间隔的字符串

    msg['To'] = ";".join(receiver)

    #msg['Date']='2012-3-16'

    #构造文字内容

    text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.baidu.com"

    text_plain = MIMEText(text,'plain', 'utf-8')

    msg.attach(text_plain)

    #构造图片链接

    sendimagefile=open(r'D:\pythontest\testimage.png','rb').read()

    image = MIMEImage(sendimagefile)

    image.add_header('Content-ID','')

    image["Content-Disposition"] = 'attachment; filename="testimage.png"'

    msg.attach(image)

    #构造html

    #发送正文中的图片:由于包含未被许可的信息,网易邮箱定义为垃圾邮件,报554 DT:SPM :

    html = """

    Hi!

    How are you?

    Here is the link you wanted.

    """

    text_html = MIMEText(html,'html', 'utf-8')

    text_html["Content-Disposition"] = 'attachment; filename="texthtml.html"'

    msg.attach(text_html)

    #构造附件

    sendfile=open(r'D:\pythontest\1111.txt','rb').read()

    text_att = MIMEText(sendfile, 'base64', 'utf-8')

    text_att["Content-Type"] = 'application/octet-stream'

    #以下附件可以重命名成aaa.txt

    #text_att["Content-Disposition"] = 'attachment; filename="aaa.txt"'

    #另一种实现方式

    text_att.add_header('Content-Disposition', 'attachment', filename='aaa.txt')

    #以下中文测试不ok

    #text_att["Content-Disposition"] = u'attachment; filename="中文附件.txt"'.decode('utf-8')

    msg.attach(text_att)

    #发送邮件

    smtp = smtplib.SMTP()

    smtp.connect('smtp.163.com')

    #我们用set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息。

    #smtp.set_debuglevel(1)

    smtp.login(username, password)

    smtp.sendmail(sender, receiver, msg.as_string())

    smtp.quit()

    48304ba5e6f9fe08f3fa1abda7d326ab.png

    作者:煜妃

    展开全文
  • 无法发送邮件

    2021-05-17 19:51:03
    无法发送邮件发布时间:2007-10-06 22:38:20来源:红联作者:s1y08我用的是Red Hat Enterprise Linux 4系统我在这个系统下用postfix+cyrus imapd+squirrelmail 搭建了个mail服务器现在出现了以下的问题,我用Windows...
  • java实现发送邮件工具

    2021-03-03 13:08:59
    /** * * * @类编号: * @类名称:EmailsUtils * @内容摘要: 发送邮件 *@author:鹿伟伟 * @创建日期:2016年4月25日 下午6:06:15 * @修改人: * @修改日期: * @修改描述:简单描述修改的内容 *@version 1.0.0 * */ public...
  • java实现邮件发送功能

    2021-03-15 00:30:25
    发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人 transport.sendMessage(message, message.getAllRecipients()); // 7. 关闭连接 ...
  • 之前其实已经写过SpringBoot异步发送邮件,但是今天在一个小项目中要用到发送邮件时,我突然觉得邮件发送人只有一个,并且固定写在yml文件中,就是非常的不妥当,就想着怎么整成一个动态的。 在写之前已经翻过很多...
  • 我们在测试完成后,都会发一份邮件也就是我们的测试报告,那么既然要自动化,是不是也可以通过python帮助我们发送邮件?当然这么强大的python可以帮助你完成这个需求SMTPSMTP(Simple Mail Transfer Protocol)即简单...
  • 我想将此html作为电子邮件发送给所有收件人.目前,当我使用简单的电子邮件插件时,整个控制台输出将作为电子邮件发送,其中包含所有这些html标签(完全不可读).然后我安装了Email Ext插件,但我不确定预发送脚本是否可以...
  • 基于JavaWeb的邮件发送功能(多附件),供大家参考,具体内容如下本次学习主要目的是为了测试由QQ邮箱发送到任意一个有效邮箱的功能实现,附带多个附件。学习者可以借鉴其他邮箱的格式,梳理一下要写的内容。项目把...
  • // 创建邮件发送者地址 Address from = new InternetAddress(senderAddress); // 设置邮件消息的发送者 mailMessage.setFrom(from); // 创建邮件的接收者地址,并设置到邮件消息中 Address to = new Internet...
  • 1、作者使用的是163邮箱进行邮件发送,以下是截图步骤获取邮件发送需要的参数 进入到设置选项 选择邮件协议选项 选择任意一种协议开启 继续下一步 然后用手机发送 信息到指定账号 最后163邮箱会...
  • 一:原理1、shell实现mysql数据导出2、导出的数据文件转码(utf8-tgb2312)3、邮件定时发送二:环境搭建postfixrpm -qa |grep postfix 确认postfix是否安装安装postfixyum -y install postfix更改默认MTA为Postfix:/...
  • 1、 我发送邮件用的是模板在数据库中存着,还有两个邮件发送类就不提供了,要的话可以联系我。 2、 在使用requrie_once时要用绝对路径。 3、 PHP 的命令行模式能使得 PHP 脚本能完全独立于 WEB 服务器单独运行,...
  • 怎么解决SMTP服务器发送邮件失败发布时间:2020-06-04 11:19:35来源:亿速云阅读:641作者:Leah怎么解决SMTP服务器发送邮件失败?这个问题可能是我们日常学习或工作经常见到的,通过这个问题,希望你能收获更多。...
  • java实现邮件定时发送

    2021-02-12 15:54:58
    需求:系统定时发送E-mail到其客户,达到通知的效果。先将实例分享给大家,如果确实有一些帮助的话,请大家来点掌声!首先介绍java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会...
  • 1.依赖org.springframeworkspring-context-support4.1.5.RELEASEjavax....配置#启用邮件通知mail.enabled=true#服务器主机名mail.smtp.host=mail.163.com#邮件服务端口(不填就是用默认端口),smtp默认端口为25m...
  • 摘抄自狂神笔记 电子邮件 要在网络上实现邮件功能,必须要有专门的邮件服务器。 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收...发送邮件: 我们通常把处理用
  • 使用 SMTP 发送电子邮件Duwamish OnlineAaron ChingMicrosoft Developer Network2000年12月摘要:本文讨论使用 Internet 信息服务 (IIS) 提供的简单邮件传输协议 (SMTP) 服务发送电子邮件的优点。文中同时讲述了配置...
  • 这样就可以实现邮件发送了。结果如下:如果要实现自动发送邮件的话,那么程序必须能自动的运行。程序在后台自动运行的代码如下:
  • 它的唯一先决条件是您或团队/项目中的某个人能够更改测试结果的输出目录 .要使其工作,请将测试结果和其他资源的输出目录更改为静态文件夹 . 在每次测试运行开始时,确保清除此文件夹 . 通过删除所有文件的shell命令...
  • 我有一个独立于spring-stand的应用程序,它使用如下的简单弹簧电子邮件代码,to和消息是使用从map迭代的值构造的.我已经对here问题提出了一些建议,但我需要一些具体的建议.下面是我的代码for (Map.Entry> entry : ...
  • //发送完后删除临时文件 int index=attachmentPath.indexOf('/'); String savePath= StringUtils.getStr(new String[] { this.importFilePath}); String fileName=attachmentPath.substring(index+1); File file= ...
  • // 设置E-mail发送时间 // message.setSentDate(new Date()); // 发送html格式的邮件 // 新建一个存放信件内容的BodyPart对象 BodyPart mdp = new MimeBodyPart(); // 给BodyPart对象设置内容和格式/编码方式 mdp....
  • 【发邮件】SpringBoot 通过 hutool 方式发送邮件 本文项目效果:发送html格式的验证码,并把验证码缓存到redis中,使用swagger2验证 1. 创建邮件配置 application.yml 这里配置的是阿里企业邮的邮箱,所以STMP...
  • 我们采用 'nette/mail' 包作为我们的邮件发送基础模块,在它的基础上封装一个 'Mail' 类,暴露出简洁的 API 给控制器使用,下面我们正式开始。引入 'nette/mail' 包,修改 'composer.json':"require": {"codingbean...
  • 叙:本文主要记述了 Springboot 中如何集成并实现多附件的邮件发送,以QQ邮箱的服务器为发送邮件的邮件服务器; Java实现多附件的邮件发送1、前期准备2、代码2.1、pom文件2.1、Controller层Utils工具类3、 测试接口4...
  • JDK 版本: JDK 1.7 以上(必须)*/public class Main {public static void main(String[] args) throws Exception {// 1. 创建一封邮件Properties ... // 用于连接邮件服务器的参数配置(发送邮件时才需要用到)Session...
  • 一 前言测试所使用的环境测试使用的环境是企业主流的SSM 框架即 SpringMVC+Spring+...发送text格式的邮件发送HTML格式的邮件基于FreeMarker模板引擎发送邮件基于Velocity模板引擎发送邮件如何获取以及运行我的De...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 159,816
精华内容 63,926
关键字:

修改邮件发送时间