.NET 发邮件Email

本文借用QQ Smtp 服务器实现发送邮件功能。

近年来,由于QQ邮箱业务的部分转变,腾讯邮箱关闭了第三方发送邮件功能,因此需要手动开启Smtp功能

登陆QQ邮箱--&gt;设置--&gt;账户--&gt;POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务--&gt;POP3/SMTP服务--&gt;开启`</pre>
</div>
用手机发送短信验证后,会收到一个 <span style="color: #ff0000;">**授权码   **<span style="color: #000000;"> ,用第三方发送邮件时,用此授权码代替密码使用</span></span>

&nbsp;

代码如下:
<div>
<pre>`    /// &lt;summary&gt;
    /// 发送邮件
    /// &lt;/summary&gt;
    /// &lt;param name="email"&gt;收件人邮箱&lt;/param&gt;
    /// &lt;param name="message"&gt;邮件内容&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    public string SecdEmail(string email,string message)
    {
        try
        {
            SmtpClient smtpClient = new SmtpClient();

            smtpClient.EnableSsl = true;

            smtpClient.UseDefaultCredentials = true;

            smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;//指定电子邮件发送方式        

            smtpClient.Host = "smtp.qq.com";//指定SMTP服务器 126邮箱为smtp.126.com       

            smtpClient.Credentials = new System.Net.NetworkCredential("abc@qq.com", "abcde");//用户名和授权码

            // 发送邮件设置        

            MailMessage mailMessage = new MailMessage("abc@qq.com", email); // 发送人和收件人        

            mailMessage.Subject = "密码找回";//主题  邮件内容      

            mailMessage.Body = message;

            mailMessage.BodyEncoding = Encoding.UTF8;//正文编码        

            mailMessage.IsBodyHtml = true;//设置为HTML格式        

            mailMessage.Priority = MailPriority.High;//优先级

            smtpClient.Send(mailMessage);

            sendInfo="发送成功";
        }
        catch (Exception e)
        {
            sendInfo = "发送失败";
        }
        return sendInfo;
    }`</pre>
</div>
&nbsp;

常用服务器 转自[http://www.360doc.com/content/11/0916/20/7731628_148819478.shtml](http://www.360doc.com/content/11/0916/20/7731628_148819478.shtml)
<div>
<pre>`【网易 163、126免费邮箱目前不直接开放smtp、pop3服务。有需要的用户可通过购买随身邮或邮箱伴侣及加入会员中心获得。从2006年11月16日起新注册用户,将无法使用POP客户端功能,之前注册用户不受影响。】 

网易163邮箱

POP3:pop.163.com      SMTP:smtp.163.com      SMTP端口号:25 

网易vip.163邮箱

POP3:pop.vip.163.com       SMTP:smtp.vip.163.com     SMTP端口号:25  

网易126邮箱

POP3:pop.126.com      SMTP:smtp.126.com      SMTP端口号:25 

网易188邮箱

POP3:pop.188.com      SMTP:smtp.188.com      SMTP端口号:25 

网易yeah.net邮箱

POP3:pop.yeah.net     SMTP:smtp.yeah.net      SMTP端口号:25 

网易netease.com邮箱

POP3:pop.netease.com     SMTP:smtp.netease.com     SMTP端口号:25

【新浪 需登陆web邮箱,设置-账户,开通smtp/pop服务,如是VIP,请务必勾选“smtp服务器要求身份验证”一项】 

新浪免费邮箱

POP3:pop.sina.com    SMTP:smtp.sina.com      SMTP端口号:25

新浪VIP邮箱

POP3:pop3.vip.sina.com    SMTP:smtp.vip.sina.com    SMTP端口号:25

新浪企业邮箱

POP3:pop.sina.com     SMTP:smtp.sina.com       SMTP端口号:25

【yahoo在foxmail 4.1以上的版本设置如下:( outlook 不行)需订制“来电提醒”服务,不定制此项服务,将无法使用POP服务。】

雅虎邮箱

POP3:pop.mail.yahoo.cn   SMTP:smtp.mail.yahoo.cn   SMTP端口号:25

【搜狐 TOM 规则较多,容易被封账号】

搜狐邮箱

POP3:pop3.sohu.com        MTP:smtp.sohu.com      SMTP端口号:25

 TOM邮箱

POP3:pop.tom.com    SMTP:smtp.tom.com    SMTP端口号:25

【谷歌 需要勾选启用SSL,465端口好像服务器端被封掉了】

Gmail邮箱

POP3:pop.gmail.com    SMTP:smtp.gmail.com   SMTP端口号:587 或 25

【需登陆web邮箱,设置-帐户,开通smtp/pop服务;设置完成后,请务必勾选“smtp服务器要求身份验证”一项。邮箱开通15天后才可开通smtp服务。】

QQ邮箱

POP3:pop.qq.com    SMTP:smtp.qq.com      SMTP端口号:25

263邮箱

域名:263.net   POP3:263.net   SMTP:smtp.263.net   SMTP端口号:25

域名:x263.net

POP3:pop.x263.net    SMTP:smtp.x263.net    SMTP端口号:25

域名:263.net.cn

POP3:263.net.cn      SMTP:263.net.cn      SMTP端口号:25

域名:炫我型

POP3:pop.263xmail.com    SMTP:smtp.263xmail.com    SMTP端口号:25

21CN  免费邮箱

     POP3:pop.21cn.com   SMTP:smtp.21cn.com  

     IMAP:imap.21cn.com  SMTP端口号:25

21CN  经济邮邮箱

POP3:pop.21cn.com    SMTP:smtp.21cn.com    SMTP端口号:25

21CN  商务邮邮箱

POP3:pop.21cn.net    SMTP:smtp.21cn.net    SMTP端口号:25

21CN  快感邮箱

POP3:vip.21cn.com    SMTP:vip.21cn.com   SMTP端口号:25

21CN  Y邮箱

POP3:pop.y.vip.21cn.com   SMTP:smtp.y.vip.21cn.com   SMTP端口号:25

中华网任我邮邮箱

POP3:rwpop.china.com   SMTP:rwsmtp.china.com   SMTP端口号:25 

中华网时尚、商务邮箱

POP3:pop.china.com    SMTP:smtp.china.com      SMTP端口号:25


 

.NET string 详解



# C#几种截取字符串的方法小结

 



C#几种截取字符串的方法小结,需要的朋友可以参考一下






1.根据单个分隔字符用split截取

例如
复制代码代码如下:




string st=”GT1231”;string[] sArray=st.split(““);</pre> </div> </div> 即可得到 <div> <pre>sArray[0]=”GT123”,sArray[1]=”1”; </pre> </div> &nbsp; 2.利用多个字符来分隔字符串 例如 <div class="codetitle">代码如下:</div> <div id="code76224" class="codebody"> <div> <pre>string str = “GTAZB_JiangjBen123”;
string[] sArray = str.Split(new char[2] { ‘j’, ‘
‘ });
foreach(string e in sArray)
{
Console.WriteLine(e);
}</pre> </div> </div> 得到 <div> <pre>sArray[0]=”GTAZB”,sArray[1]=”Jiang”,sArray[2]=”Ben”,sArray[3]=”123”;</pre> </div> 3根据字符串或字符串组来截取字符串 例如 <div class="codetitle">代码如下:</div> <div id="code54198" class="codebody"> <div> <pre>string str = “GTAZB_JiangjBen123”;
string[] sArray = str.Split( new string[]{“Ji”,”jB”}, StringSplitOptions.RemoveEmptyEntries);
foreach(string e in sArray)
{
Console.WriteLine(e);
}
得到sArray[0]=”GTAZB
“,sArray[1]=”ang”,sArray[2]=”en_123”;</pre> </div> </div> &nbsp; 4提取字符串中的第i个字符开始的长度为j的字符串; 例如 <div class="codetitle">代码如下:</div> <div id="code93719" class="codebody"> <div> <pre>string str = “GTAZB_JiangjBen_123”;
int start=3,length=8;
Console.WriteLine(str.Substring(start-1, length));
输出得到AZB_Jian。</pre> </div> </div> &nbsp; 5提取字符串中右数长度为i的字符串 <a id="copybut75156" class="copybut"></a>代码如下: <div id="code75156" class="codebody"> <div> <pre>string str = “GTAZB_JiangjBen_123”;
string tSt;
int i=5;
tSt = str.Substring(str.Length - i);
Console.WriteLine(tSt);
输出n_123;</pre> </div> </div> 6替换字符串中的特定字符串 <a id="copybut57402" class="copybut"></a>代码如下: <div id="code57402" class="codebody"> <div> <pre>string str = “GTAZB_JiangjBen_123”;
string tSt;
tSt = str.Replace(“123”,”321”);
Console.WriteLine(tSt);
输出GTAZB_JiangjBen_321</pre> </div> </div> &nbsp; 7删除字符串中的特定字符串Jiangj <div class="codetitle"><a id="copybut84105" class="copybut"></a>代码如下:</div> <div id="code84105" class="codebody"> <div> <div> <pre>string str = “GTAZB_JiangjBen_123”;
string tSt;
tSt = str.Replace(“Jiangj”,””);
Console.WriteLine(tSt);
输出GTAZB_Ben_123</pre> </div> </div> </div> <div class="codebody"></div> 8删除指定位置(第i个)的指定长度(length)的字符串 <div class="codetitle"><a id="copybut3995" class="copybut"></a>代码如下:</div> <div id="code3995" class="codebody"> <div> <pre>string str = “GTAZB_JiangjBen_123”;
int i=5,length=8;str=str.remove(i,length);
console.writeline(str);
输出GTAZBen_123。




React State随笔

state在React以及React-Native的作用是 变量传值,主要的目的就是控制组件的状态和内容显示

第一步:初始化组建状态

getInitialState () {
   return {
      disabled: false,
      crazy: false,
      options: FLAVOURS,
      value: [],
   };
},

第二步:定义方法,用于操作state变量

toggleChocolate (e) 
{
    let crazy = e.target.checked;
    this.setState({
        crazy: crazy,
        options: crazy ? WHY_WOULD_YOU : FLAVOURS,
    });
},

第三步:在组件中调用

<Select multi simpleValue disabled={this.state.disabled} value={this.state.value} placeholder="Select your favourite(s)" options={this.state.options} onChange={this.toggleChocolate} >

这些是我目前所用到的一点state知识,仅仅是state的冰山一角,以后如有用到会继续更新

Gitlab WebHook本地获取json数据(含有BuildEvents字段)

当Gitlab中有动作触发时,就会触动 WebHook(钩子),Webhook也会随之返回一个Json数据, 可以根据这个json数据来实时监控项目工程,在Gitlab的Help中给出了很多字段,但唯独没有显性给出BuildEvents字段:

{

    “brfore_sha”:””,

    “build_allow_failure”:””,

    “build_duration”:””,

    “build_finished_at”:””,

    “build_id”:””,

    “build_name”:””,

    “build_stage”:””,

    “build_started_at”:””,

    “build_status”:””,

    “commit”:

    {

        “author_email”:””,

        “author_name”:””,

        “duration”:””,

        “finished_at”:””,

        “id”:””,

        “message”:””,

        “sha”:””,

        “started_at”:””,

        “status”:””

    },

    “object_kind”:””,

    “project_id”:””,

    “project_name”:””,

    “ref”:”master”,

    “repository”:

    {

        “description”:””,

        “git_http_url”:””,

        “git_ssh_url”:””,

        “homepage”:””,

        “name”:””,

        “url”:””,

        “visibility_level”:””

    },

    “sha”:””,

    “tag”:””,

    “user”:

        {

            “email”:””,

            “id”:””,

            “name”:””

        }

}

但只有样例字段还是远远不够的,因为某些字段的含义我们很难理解(build中before_sha表示version,),此时就需要输出自己的代码build返回的json数据。在help中也有相应的方法代码,在此翻译一下,供以后使用,毕竟“好记性不如烂笔头”

S1 . 配置Ruby环境(安装Ruby软件时,点击第二个复选框(自动配置PATH))

S2. 建文本文件,粘贴代码,保存为print_http_body.rb

require 'webrick'

server = WEBrick::HTTPServer.new(:Port => ARGV.first)
server.mount_proc '/' do |req, res|
  puts req.body
end

trap 'INT' do
  server.shutdown
end
server.start

S3. 在文件所在目录下打开Cmd, 编辑 ruby print_http_body.rb 8000(8000是未被占用的端口)

S4. 在webhook receiver中添加Event,http://my.host:8000/ (my.host表示IP)

 

 

完成以上4步后,触发相关的时间,就会在Cmd页面中输出对应的Json数据。

例如,如果创建的是IssueEvent,则,创建新的Issue或对已有的Issue操作时,就会在Cmd页面输出Json数据

注:点击Test按钮,返回的均是Push的json数据,所以在测试API时出现错误很正常(保证代码正确的前提下,修改数据实体类的字段即可)

.NET 写入文件

有些 项目代码无法在本地调试(比如web hook),所以就很难迅速找到错误点。这个时候就需要在运行代码将异常信息再本地以文件的形式输出。

try
{
    /*project code*/
}
catch(Exception e)
{
     FileStream fs1 = new FileStream("c:\\test\\log.txt", FileMode.Append, FileAccess.Write);   
     StreamWriter sw1 = new StreamWriter(fs1); // 创建写入流  
     string s = (issue.user.username);  
     sw1.WriteLine(e.ToString()); // 写入  
     sw1.Close();  
}

此代码是将异常信息e, 在C 盘,test文件夹下的log.txt文件中

SQL处理时间

以下基于SQL server数据库,其他数据库类似处理

  1. 处理时间中,应用最多的就是对时间进行格式化处理,这也是我在当前项目中应用最多的一个知识点 。
    datetime–>date 从datetime中提取date日期
  • DATE(date)
    date 参数是合法的日期表达式。

  • CONVERT(_datatype(length),_data_to_beconverted,style)
    _ datatype(length) 规定目标数据类型(带有可选的长度)
    _ data_to_beconverted 含有需要转换的值
    style 规定日期/时间的输出格式。 关于style
























































































    Style IDStyle 格式
    100 或者 0mon dd yyyy hh:miAM (或者 PM)
    101mm/dd/yy
    102yy.mm.dd
    103dd/mm/yy
    104dd.mm.yy
    105dd-mm-yy
    106dd mon yy
    107Mon dd, yy
    108hh:mm:ss
    109 或者 9mon dd yyyy hh:mi:ss:mmmAM(或者 PM)
    110mm-dd-yy
    111yy/mm/dd
    112yymmdd
    113 或者 13dd mon yyyy hh:mm:ss:mmm(24h)
    114hh:mi:ss:mmm(24h)
    120 或者 20yyyy-mm-dd hh:mi:ss(24h)
    121 或者 21yyyy-mm-dd hh:mi:ss.mmm(24h)
    126yyyy-mm-ddThh:mm:ss.mmm(没有空格)
    130dd mon yyyy hh:mi:ss:mmmAM
    131dd/mm/yy hh:mi:ss:mmmAM

    例:CONVERT(varchar(12), getdate(), 111)) yy/mm/dd

 

2. 时间的加减运算(SQL server 默认格林尼治时间 )

getdate()返回当前日期和时间(精确到毫秒)

目前我所知道的日期加减方式有2种,

加减时刻:直接写数字或字符串 getdate()+’8:00:00’ 当前数据库标准时间增加8小时

加减日期:直接写数字或字符串 CONVERT(varchar(12), getdate(), 111))+5,当前数据库标准日期增加5天

  • 使用函数 ,返回日期

    DATEADD(datepart,number,date)

    date 参数是合法的日期表达式

    number 是您希望添加的间隔数;

    对于未来的时间,此数是正数,对于过去的时间,此数是负数

    例:DATEADD(d,-7, CONVERT(varchar(12), getdate()+’8:00:00’, 111))当前日期向前推7天
    关于datepart




























































    datepart缩写
    yy, yyyy
    季度qq, q
    mm, m
    年中的日dy, y
    dd, d
    wk, ww
    星期dw, w
    小时hh
    分钟mi, n
    ss, s
    毫秒ms
    微妙mcs
    纳秒ns

     

注:加减日期之前,必须先进性格式化处理,否则会出现歧义,会把前一天的此刻到今天的此刻当作一天

比如:2016-08-02 19:30:05.780 到 2016-08-03 19:30:05.780 当作一天处理

React 常见问题

自己在学习react 时遇到的奇葩问题

  1. Failed to load resource: net::ERR_CONNECTION_RESET浏览器无法加载内容昨天在chrome运行时还好好的,今天就崩了,在stackoverflow查了一下,说是证书不匹配,建议更换浏览器。我用IE试了一下,果然OK。链接http://stackoverflow.com/questions/24931566/getting-error-in-console-failed-to-load-resource-neterr-connection-reset ,当然也可以安装证书。也可以重装webpack
  2. 路由正确的情况下无法实现跳转onclick–>onClick
    onClick={this.} 中onclick拼写错误。我使用的IDE是webstorm,他错误提示为onclick,导致无法实现功能,此时需要手动改为onClick

fetch连接AZURE数据库

之前用学习用react-native开发手机app新生项目,实现app的基本操作,其中最重要的一项就是用fetch (https://fetch.spec.whatwg.org/#responses)连接到远程数据库,我看了半天资料也没看懂,在网上也没找到实例代码,最后看了队友的代码后才明白,看来还是太年轻。

 

废话少说,直接看代码(以下为硬代码):

'use strict'
import React,{Component}from 'react'
import {props}from 'react-native'
import backToSignUp from './SignUp'
const http= 'http://dytestfirst.azurewebsites.net/tables/' //数据库url/tables
const id='ff96a1f6-a5c4-4bf3-a3bb-0d7f998c74db'
export default class DataBase
{
toInsert( user, pwd,email)
{
    fetch('http://dytestfirst.azurewebsites.net/tables/User', {  //表名
        method: 'POST',
        headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
            'ZUMO-API-VERSION':'2.0.0'
        },
        body: JSON.stringify({    //字段
            username: user,
            password: pwd,
            MAIL: email
        })
    }).then((response) => response.text())
        .then((responseText) => {
            console.log(responseText);
        })
        .catch((error) => {
            console.warn(error);
        });
}

updatePWD(password)//修改
{
    fetch(http+'user/'+id, {
        method: "PATCH",
         headers: {
         "Accept": "application/json",
         "Content-Type": "application/json",
         "ZUMO-API-VERSION":"2.0.0",
         },
         body:JSON.stringify
         ({
            PASSWORD: password,
         })
         }).then((response) => response.text())
         .then((responseText) => {
         console.log(responseText);
         })
         .catch((error) => {
         console.warn(error);
         });
         }

delete()//删除
 {
     fetch(http+'user/'+id, {
     method: "DELETE",  //删除
     headers: {
     "ZUMO-API-VERSION":"2.0.0",
     },
     }).then((response) => response.text())
     .then((responseText) => {
     console.log(responseText);
     })
     .catch((error) => {
     console.warn(error);
     });

     }

getPassword()
{
    fetch(http+'user/'+id, {
        method: "GET",
        headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
            "ZUMO-API-VERSION": "2.0.0"
        },
    }).then((response) => response.text())
        .then((responseText) => {
            console.log(responseText);
        })
        .catch((error) => {
            console.warn(error);
        });
      router.pop();

}

/*
    async getasswordFromApi()
    {
        try {
            let response = await fetch('http://dytestfirst.azurewebsites.net/tables/User?ZUMO-API-VERSION=2.0.0');
            console.log(response.password);
            return response.password;
        } catch(error) {
            throw error;
        }
    }
*/
}

VS(远程)链接SQLserver 数据库

本文基于VS2015社区版

一:远程连接AZURE 数据库

自从2014年Windows Azure 在华商用以来,原来越多的企业和团队开始付费使用该服务,也就应运而生了一个新的问题:如何连接AZURE数据库?

获取连接该数据库的字段 点击数据库—>连接字符串 ;


//ConnectDB.cs
//面向对象

namespace LuckyGitlabStatWebAPI.DAO
{
public class ConnectDB
{
//数据库用户名
private static string userName = “”;
//数据库密码
private static string password = “”;
//连接的服务器地址
private static string dataSource = “”;
//数据库名称
private static string sampleDatabaseName = “”;
///
/// 公共代码,连接数据库
///
public SqlConnectionStringBuilder ConnectDataBase()
{
SqlConnectionStringBuilder connString2Builder;
connString2Builder = new SqlConnectionStringBuilder();
connString2Builder.DataSource = dataSource;
connString2Builder.InitialCatalog = sampleDatabaseName;
connString2Builder.Encrypt = true;
connString2Builder.TrustServerCertificate = false;
connString2Builder.UserID = userName;
connString2Builder.Password = password;
return connString2Builder;
}
}
}
SampleCOntroller.cs 方法调用查询
public List GetMembers()
{
try
{
SqlConnectionStringBuilder connString2Builder = conncetdb.ConnectDataBase();
using (SqlConnection conn = new SqlConnection(connString2Builder.ToString()))
{
using (SqlCommand command = conn.CreateCommand())
{
conn.Open();
command.CommandText = “SELECT * FROM Member”;
//ExecuteReader():将 CommandText 发送到 Connection,并生成 SqlDataReader。
using (SqlDataReader reader = command.ExecuteReader())
{
// Loop over the results
while (reader.Read())//SqlDataReader到下一个记录
{
string s = reader.ToString();
member.username = reader[“UserName”].ToString().Trim();
member.password = reader[“Password”].ToString().Trim();
member.email = reader[“Email”].ToString().Trim();
member.sex =reader[“Sex”].ToString().Trim();
members.Add(member);
}
}
conn.Close();
}
}
return members;
}
catch (SqlException e)
{
Console.WriteLine(“查找异常”);
}
return members;
}

再给大家分享一个控制台版的链接代码http://www.cuichongyang.cn/index.php/2016/05/13/net-code-azure-sql/

AZURE数据库虽好,但访问速度比较慢,一个简单的跳转就需要3S左右,所以我们就放弃AZURE,采用本地数据库SQL server

二、链接本地(远程)SQL server

在SQL server准备阶段,请先访问这篇博文 ,解决登陆和访问权限问题

步骤:

工具–>连接到数据库–>输入服务器名–>SQL Server身份验证–>输入用户名、密码(非sa)–>选择数据库–>测试链接–>高级–>复制最后一行输入框内的连接数据

在输入服务器名字时:

1. 本地:在登陆SQL server的页面复制服务器名字, 否则会显示 “用户名”无法连接

2.远程:输入服务器所在的IP

ConnectDB.CS
namespace LuckyGitlabStatWebAPI.DAO  
{  
    public class ConnectLocalSQL  
    {  
        /// &lt;summary&gt;  
        /// 连接本地Sql Server数据库  
        /// &lt;/summary  &gt;
        /// &lt;returns&gt;&lt;/returns&gt;  
        public SqlConnection ConnectDataBase()  
        {  
            //连接字符串用SQL Server身份验证的账户登录,不能用windows身份验证的用户    (<span style="color: #ff00ff;">密码需要手动填写</span>)
            SqlConnection conn = new SqlConnection("Data Source=;Initial Catalog=;Persist Security Info=;User ID=;password=");  
            return conn;  
        }  
    }  
}  `</pre>
</div>
</div>
<pre>`        public Member GetSingleInfo(string username)  
        {  
            //连接本地数据库  
            SqlConnection conn = connectLocaldb.ConnectDataBase();  
            //打开数据库  
            conn.Open();  
            //创建查询语句   
            SqlCommand querySingleInfo = conn.CreateCommand();  
            querySingleInfo.CommandText = "SELECT * FROM Member where UserName=" + "'" + username + "'";  
            SqlDataReader singleInfoReader = querySingleInfo.ExecuteReader();  
            //有多行数据,用while循环  
            while (singleInfoReader.Read())  
            {  
                member.username = singleInfoReader["UserName"].ToString().Trim();  
                member.password = singleInfoReader["Password"].ToString().Trim();  
                member.email = singleInfoReader["Email"].ToString().Trim();  
                member.sex = singleInfoReader["Sex"].ToString().Trim();  
                members.Add(member);  
            }  
            //关闭查询  
            singleInfoReader.Close();  
            //关闭数据库连接  
            conn.Close();  

            return member;  
        }  

 

|